NetworkManager启动脚本

NetworkManager启动脚本

/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 脚本

相关内容