现在我正在使用 /etc/rc.local 在启动时在我的 Linux 路由器上添加一些 iptables 规则,但有些规则没有添加。我认为这是因为界面还没有出现。
这就是我那里的内容:
sudo /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo /sbin/iptables -A FORWARD -i ppp0 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo /sbin/iptables -A FORWARD -i eth0 -o ppp0 -j ACCEPT
我认为 ppp0 接口必须需要一段时间才能在启动时出现,并且 iptables 可能会拒绝添加规则,因为 ppp0 接口不存在。有没有办法强制 iptables 添加规则?我想在添加规则之前在脚本中引入循环以等待接口存在之前应该检查这一点。
我还观察到,当界面消失并在添加规则后返回时,iptables 不会删除规则(在我的情况下这是良好的行为)。
答案1
在任何基于 Debian 的发行版上post-up
使用。/etc/network/interfaces
这允许您在脚本启动后立即运行该脚本ifup
。更多内容在手册页interfaces
。
旁注:post-down
当然可以用来删除规则。
如果这不起作用,因为您的系统通过某些脚本启动 ppp0,您可以使用与上述操作相对应的*.d
子文件夹中的挂钩脚本。/etc/network
脚本中将提供几个变量,例如等IFACE
。ADDRFAM
手册页非常详细。
另一方面,内部up
==post-up
和down
== post-down
,因此正确的子文件夹将分别是if-down.d
和if-up.d
。
/etc/network/interfaces
如果您想“调试”启动在其中声明(或source
从那里声明)的接口的过程,ifup(8)
请参阅详细信息。特别是您会想要ifup -nvl
(也许还有接口名称)。也可以在无特权的情况下运行,因为它不执行任何操作,只是模仿该过程。
可能的警告
这不适用于基于 Debian 但由网络管理器驱动的设置。但是当你提到路由器时,我认为它不太可能由网络管理器驱动。
答案2
你实际上可以添加iptables与您想要的任何不存在的接口进行规则,它都会起作用。尝试一下# iptables -A INPUT -i trollolo -j ACCEPT
,看看会发生什么# iptables -nvL
。问题在于/etc/rc.local方法 - 它是过时的现代 Linux 的初始化程序(在大多数情况下它是系统)默认情况下甚至不会读取它。默认情况下甚至没有rc-local.service在系统,这样如果您仍想使用,则需要手动重新创建它/etc/rc.local文件在你的Linux,尽管这被劝阻。
我选择保留 iptables 规则的方式是使用自定义 systemd 服务,该服务可以方便地依赖于其他系统服务,以便及时执行。
首先,使用 iptables 规则创建脚本文件:
touch /usr/local/sbin/init_fw.sh
把你的规则放在那里:
#!/bin/bash
iptables -F
iptables -P INPUT DROP
................ and so on ......
使文件可执行
# chmod +x /usr/local/sbin/init_fw.sh
创建 systemd 服务文件# nano /lib/systemd/system/customfw.service
并将此描述粘贴到此处
[Unit]
Description=Custom FW
[Service]
ExecStart=/usr/local/sbin/init_fw.sh
[Install]
WantedBy=network-pre.target
然后做# systemctl start customfw
。使用 来检查规则中的错误# systemctl status customfw
。如果一切正常,请将其设置为 autorun # systemctl enable customfw
。
注意 - 这个脚本不是守护进程,所以不活跃(死亡)状态很好——工作已经完成。您可以在下次启动时检查它iptables -nvL
另请注意通缉者=部分 - 它使这些规则在操作系统中建立任何网络连接之前应用。