「Iptables」:修訂間差異

出自Gea-Suan Lin's Wiki
跳至導覽 跳至搜尋
本頁面具有訪問限制。如果您看見此訊息,這代表您沒有訪問本頁面的權限。
無編輯摘要
 
(未顯示同一使用者於中間所作的 25 次修訂)
行 1: 行 1:
{{lowercase}}
{{lowercase}}
'''iptables'''是一套在[[Linux]]上常見的防火牆軟體。
'''iptables'''是一套在[[Linux]]上常見的防火牆軟體。
== 簡介 ==
iptables是一套Linux上常見的防火牆軟體,可以安裝iptables-persistent確保在開機時生效。


== 範例 ==
== 範例 ==
=== 一般 ===


<syntaxhighlight lang="bash">
<syntaxhighlight lang="bash">
行 11: 行 17:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -P INPUT DROP
</syntaxhighlight>
有IPv6的機器要另外加上IPv6相關的設定:
<syntaxhighlight lang="bash">
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo ip6tables -P INPUT DROP
</syntaxhighlight>
=== NAT ===
<syntaxhighlight lang="bash">
sudo iptables -t nat -A POSTROUTING -s 192.168.254.0/24 -o ens5 -j MASQUERADE
</syntaxhighlight>
=== GeoIP ===
先安裝並且下載一份GeoIP資料:
<syntaxhighlight lang="bash">
sudo apt install -y libtext-csv-xs-perl xtables-addons-common; sudo mkdir /usr/share/xt_geoip; cd /usr/share/xt_geoip; sudo /usr/lib/xtables-addons/xt_geoip_dl; sudo /usr/bin/perl /usr/lib/xtables-addons/xt_geoip_build
</syntaxhighlight>
</syntaxhighlight>
設定擋掉:
<syntaxhighlight lang="bash">
sudo iptables -I INPUT -p tcp -m geoip --source-country CN -m tcp --dport 6991 -j DROP
sudo iptables -I DOCKER-USER -p tcp -m geoip --source-country CN -m tcp --dport 6991 -j DROP
</syntaxhighlight>
後續可以在<code>/etc/cron.weekly</code>自動更新GeoIP的資料。
=== TCP Proxy ===
這邊TCP Proxy的範例是想:
{{#mermaid:flowchart LR
   Internet("Internet")
   Proxy("192.0.2.1:80 (Proxy)")
   Server("10.1.1.1:8080 (Server)")
   Internet --> Proxy --> Server
}}
因為這是在kernel層處理封包轉送的,需要開通<code>net.ipv4.ip_forward</code>:
<syntaxhighlight lang="bash">
echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-net.conf; sudo sysctl -p /etc/sysctl.d/99-net.conf
</syntaxhighlight>
回來處理封包本身,首先要先把TCP封包中,連到Proxy的目標換成目的機器:
<syntaxhighlight lang="bash">
sudo iptables -t nat -A PREROUTING -d 192.0.2.1 -p tcp --dport 80 -j DNAT --to-destination 10.1.1.1:8080
</syntaxhighlight>
但這樣做,從本機連到自己Port 80的封包不會換目標(因為本機連線不會過<code>PREROUTING</code>),所以通常會再到<code>OUTPUT</code>上指定:
<syntaxhighlight lang="bash">
sudo iptables -t nat -A OUTPUT -d 192.0.2.1 -p tcp --dport 80 -j DNAT --to-destination 10.1.1.1:8080
</syntaxhighlight>
但上面的行為是沒有記憶力的,這時候就需要讓iptables使用<code>MASQUERADE</code>記錄連線,這樣反過來時才知道怎麼送回去:
<syntaxhighlight lang="bash">
sudo iptables -t nat -A POSTROUTING -d 10.1.1.1 -p tcp --dport 8080 -j MASQUERADE
</syntaxhighlight>
== 快速設定 ==
給我自己用的:
<syntaxhighlight lang="bash">
sudo iptables -A INPUT -i lo -j ACCEPT; sudo iptables -A INPUT -p icmp -j ACCEPT; sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; sudo iptables -A INPUT -s 114.34.121.114 -j ACCEPT; sudo iptables -A INPUT -s 35.234.52.75 -j ACCEPT; sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT; sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT; sudo iptables -P INPUT DROP; sudo ip6tables -A INPUT -i lo -j ACCEPT; sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT; sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT; sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT; sudo ip6tables -P INPUT DROP; sudo apt install -y iptables-persistent
</syntaxhighlight>
== 相關連結 ==
* [[UFW]]
== 外部連結 ==
* {{Official|https://www.netfilter.org/}} {{en}}
[[Category:軟體]]

於 2023年8月31日 (四) 13:07 的最新修訂

iptables是一套在Linux上常見的防火牆軟體。

簡介

iptables是一套Linux上常見的防火牆軟體,可以安裝iptables-persistent確保在開機時生效。

範例

一般

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -P INPUT DROP

有IPv6的機器要另外加上IPv6相關的設定:

sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT
sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo ip6tables -P INPUT DROP

NAT

sudo iptables -t nat -A POSTROUTING -s 192.168.254.0/24 -o ens5 -j MASQUERADE

GeoIP

先安裝並且下載一份GeoIP資料:

sudo apt install -y libtext-csv-xs-perl xtables-addons-common; sudo mkdir /usr/share/xt_geoip; cd /usr/share/xt_geoip; sudo /usr/lib/xtables-addons/xt_geoip_dl; sudo /usr/bin/perl /usr/lib/xtables-addons/xt_geoip_build

設定擋掉:

sudo iptables -I INPUT -p tcp -m geoip --source-country CN -m tcp --dport 6991 -j DROP
sudo iptables -I DOCKER-USER -p tcp -m geoip --source-country CN -m tcp --dport 6991 -j DROP

後續可以在/etc/cron.weekly自動更新GeoIP的資料。

TCP Proxy

這邊TCP Proxy的範例是想:

因為這是在kernel層處理封包轉送的,需要開通net.ipv4.ip_forward

echo "net.ipv4.ip_forward=1" | sudo tee /etc/sysctl.d/99-net.conf; sudo sysctl -p /etc/sysctl.d/99-net.conf

回來處理封包本身,首先要先把TCP封包中,連到Proxy的目標換成目的機器:

sudo iptables -t nat -A PREROUTING -d 192.0.2.1 -p tcp --dport 80 -j DNAT --to-destination 10.1.1.1:8080

但這樣做,從本機連到自己Port 80的封包不會換目標(因為本機連線不會過PREROUTING),所以通常會再到OUTPUT上指定:

sudo iptables -t nat -A OUTPUT -d 192.0.2.1 -p tcp --dport 80 -j DNAT --to-destination 10.1.1.1:8080

但上面的行為是沒有記憶力的,這時候就需要讓iptables使用MASQUERADE記錄連線,這樣反過來時才知道怎麼送回去:

sudo iptables -t nat -A POSTROUTING -d 10.1.1.1 -p tcp --dport 8080 -j MASQUERADE

快速設定

給我自己用的:

sudo iptables -A INPUT -i lo -j ACCEPT; sudo iptables -A INPUT -p icmp -j ACCEPT; sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; sudo iptables -A INPUT -s 114.34.121.114 -j ACCEPT; sudo iptables -A INPUT -s 35.234.52.75 -j ACCEPT; sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT; sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT; sudo iptables -P INPUT DROP; sudo ip6tables -A INPUT -i lo -j ACCEPT; sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT; sudo ip6tables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT; sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT; sudo ip6tables -P INPUT DROP; sudo apt install -y iptables-persistent

相關連結

外部連結