在/etc/NetworkManager/dispatcher.d/01ifupdown
最后的某处:
case "$2" in
up)
export MODE="start"
export PHASE="up"
if [ -d /var/run/network/ ] ; then
tmpfile=`mktemp -t`
if [ -e /var/run/network/ifstate ] ; then
cat /var/run/network/ifstate | grep -v ^$IFACE= > $tmpfile || true
fi
echo $IFACE=$IFACE >> $tmpfile
mv $tmpfile /var/run/network/ifstate
fi
exec run-parts /etc/network/if-up.d
exec /etc/iptables.rules
;;
我运行 iptables.rules 脚本,这是一个包含如下内容的 shell 脚本:
#!/bin/sh
...
echo "restoring iptables..."
/sbin/iptables-restore -v <<-EOF;
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i $EXTIF -p ICMP -s $UNIVERSE -d $EXTIP -j ACCEPT
COMMIT
EOF
如果我从 shell 运行此脚本,则可以看到规则已添加。但是,启动后规则不存在。/var/log/messages 没有显示任何内容,我甚至不确定脚本的回显是否应该在那里或其他地方可见。
答案1
基本上,有两种方法可以用这样的脚本配置你的防火墙。
其中之一是复制 /etc/init.d 中的框架脚本并根据您的需要进行修改,然后创建必要的链接(使用 update-rc.d)。这将创建一个“服务”,该服务在运行级别更改时启动和停止,具体取决于您的设置。
这与您的机器配合得如何则是另一个问题。NetworkManager 仅在用户登录时启动接口,而运行级别脚本则在启动时执行。由于您的网络接口在 NetworkManager 配置之前没有 IP 地址,因此任何具有连接到本地接口的 IP 地址的 iptables 规则都可能失败。
另一个选项是从 /etc/network/interfaces 文件中启动防火墙脚本。该文件中有几节告诉操作系统如何配置接口。每个应由 NetworkManager 配置的接口都以“allow-hotplug”开头。通常这些节只有这一行,因为其他所有内容通常由 DHCP 处理。但是,您可以添加以下格式的行
带参数的脚本
或者
带参数的脚本
当此特定接口打开或关闭时执行此命令(实际上,如果有人拉动网线,也会发生这种情况)。这应该可以帮你解决问题。阅读接口的手册页(man interfaces
)。
答案2
exec
导致将控制权以不返回的方式传递给它的参数,因此之后的任何内容exec run-parts /etc/network/if-up.d
都不会运行。
你必须找到其他地方来运行你的 iptables.rules 脚本