我依靠我的特定服务在 debian 安装启动时加载 iptables 规则,该服务调用
iptables-restore my_rules.v4
ip6tables-restore my_rules.v6
并执行一些其他脚本
但是我意识到,在启用接口和应用固件规则之间存在应用默认规则的一小段时间,这可能会使机器面临一些风险。
我已经启用了 iptables-persistent 服务,但我不确定它是否在网络部分启动之前加载。
在网络上线并可用之前加载脚本的最佳方法是什么?
我听说过接口中的 pre-up,但我有很多接口,所以我不确定首先放置哪个接口,并且在所有接口上使用 pre-up 会导致脚本运行太多次而不是只运行一次。
答案1
在 Debian 12 中,iptables
默认是新nftables
子系统的包装器。该iptables-persistent
包依赖于 package ,它创建一个名为和的别名的netfilter-persistent
服务。netfilter-persistent.service
iptables.service
ip6tables.service
的定义netfilter-persistent.service
如下:
systemctl cat netfilter-persistent.service
# /lib/systemd/system/netfilter-persistent.service
[Unit]
Description=netfilter persistent configuration
DefaultDependencies=no
Wants=network-pre.target systemd-modules-load.service local-fs.target
Before=network-pre.target shutdown.target
After=systemd-modules-load.service local-fs.target
Conflicts=shutdown.target
Documentation=man:netfilter-persistent(8)
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/sbin/netfilter-persistent start
ExecStop=/usr/sbin/netfilter-persistent stop
[Install]
WantedBy=multi-user.target
# /usr/lib/systemd/system/netfilter-persistent.service.d/iptables.conf
[Install]
Alias=iptables.service ip6tables.service
注意DefaultDependencies=no
,Wants=network-pre.target
和Before=network-pre.target
。假设您使用任何预期的方式来配置网络接口,这些已经确保在配置任何网络接口之前恢复 iptables/nftables 规则。
所以答案是,是的,iptables-persistent
在启动任何网络接口之前加载。
如果您想为 iptables/nftables 规则创建自己的自定义服务,您应该以相同的方式设置该服务的依赖项netfilter-persistent.service
。
network-pre.target
请参阅的文档systemd.special(7)
手册页(强调我的):
network-pre.target
这个被动目标单元可能会被想要在任何网络建立之前运行的服务拉入,例如为了设置防火墙。所有网络管理软件都会在此目标之后自行排序,但不会将其拉入。另请参阅网络通后运行服务了解更多信息。
答案2
取决于您的发行版,例如 Fedora Linux 会为您做到这一点。奇怪的是你的发行版没有 - 那是安全漏洞绝对值得报告和修复。 Systemd 对加载单元有依赖性,您需要使网络依赖于您的防火墙单元。如果您使用不同的初始化系统,请咨询它。