「Iptables」:修訂間差異
跳至導覽
跳至搜尋
無編輯摘要 |
|||
(未顯示同一使用者於中間所作的 28 次修訂) | |||
第1行: | 第1行: | ||
{{ | {{lowercase}} | ||
'''iptables'''是一套在[[Linux]]上常見的防火牆軟體。 | '''iptables'''是一套在[[Linux]]上常見的防火牆軟體。 | ||
== 簡介 == | |||
iptables是一套Linux上常見的防火牆軟體,可以安裝iptables-persistent確保在開機時生效。 | |||
== 範例 == | |||
=== 一般 === | |||
<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 -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 | |||
</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 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 (TCP 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:軟體]] |
於 2024年9月17日 (二) 03:42 的最新修訂
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
相關連結
外部連結
- 官方網站 (英文)