從 ufw 到 iptables-persistent 的持久化與遷移
大家好,我是無能。到目前為止,我一直在使用可以輕鬆設定防火牆的ufw,但我希望能夠在設定檔層級進行管理,以便像pf.conf一樣易於遷移,所以我安裝了iptables-persistent。雖然似乎也有讓pf可用的核心補丁,但我覺得沒必要勉強使用,而且那樣也算是逃避iptables,所以我還是選擇了導入它。
安裝
由於iptables應該已經安裝了,所以只需安裝iptables-persistent。順帶一提,因為會產生衝突,ufw會被自動移除,所以請務必事先確認規則。
sudo apt install iptables-persistent
netfilter-persistent最基本的使用方法
將目前的規則儲存到/etc/iptables/下的情況
sudo netfilter-persistent save
使用目前的/etc/iptables/設定重新載入的情況
sudo netfilter-persistent reload
順帶一提,如果在沒有reload的情況下執行save,它會將目前的規則視為要儲存的內容,導致您寫入的設定消失,請務必小心。
設定
設定變成了這個樣子。iptables在save時會把註解和換行符號全部清除,這還挺麻煩的呢...
# cat rules.v4
# Generated by iptables-save v1.8.9 (nf_tables) on Sat Oct 11 16:27:52 2025
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [18:1900]
:TCP - [0:0]
:UDP - [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i 127.0.0.1/32 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -j ACCEPT
-A INPUT -i wg0 -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p icmp -m icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
COMMIT
# Completed on Sat Oct 11 16:27:52 2025
關於允許規則,基本上是允許本機和每個WireGuard介面。基本上是從Arch Wiki抄來的。
簡單的狀態防火牆 - ArchWiki
這是因為
如果不安裝-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT,例如,當執行curl時,回應將無法返回,因此對於明確建立的連線,似乎需要將其分配到不同的規則中。我再次意識到pf之所以強大,是因為它能很好地處理這類狀態管理,這一天讓我再次想好好地稱讚pf。
那麼,下次再見。
順帶一提,沒有IPv6
# cat rules.v6
# Generated by ip6tables-save v1.8.9 (nf_tables) on Sat Oct 11 17:37:50 2025
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Sat Oct 11 17:37:50 2025
請多關照。