从ufw到iptables-persistent的持久化和迁移
大家好,我是无能。
我一直使用ufw来轻松配置防火墙,但我想在配置文件级别进行管理,以便像pf.conf那样易于迁移,所以安装了iptables-persistent。
似乎也有内核补丁可以让pf可用,但强行使用它也不对,而且那也意味着逃避iptables,所以我还是选择了它。
安装
iptables应该已经安装了,所以只需安装iptables-persistent。
顺便说一下,由于冲突,ufw会被自动删除,所以请务必提前确认现有规则。
sudo apt install iptables-persistent
netfilter-persistent最基本的使用方法
将当前规则保存到/ets/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
请多关照。