启动 14.04 iptables 间歇性失败

启动 14.04 iptables 间歇性失败

我有一台装有 Ubuntu 14.04 的 kvm VM,将其设置为虚拟网络中的防火墙(带有 eth0 和 eth1)

这不是课程,而是工作。我必须学习这个。

eth1 有时会无法启动。

eth0 和 eth1均/etc/network/interfaces手动设置。

当 eth0 应该启动时,有一个 up 命令/etc/interim-fw.sh ,它不允许任何操作,也不允许端口之间进行转发。

然后是 eth1。有一个预先设置,我向日志文件发送一条注释,说明已到达此点。然后链接 up,然后 up 命令/etc/firewall.sh将加载包含所有所需规则的 iptables。

随机情况下,这将无法加载,并且仅达到 eth1 的预启动。但是一旦 VM 加载完毕,如果我运行 bash /etc/firewall.sh它,它将完全加载,一切都会好起来!

所以我的问题是:我该如何解决这个问题?如果我遇到了竞争条件,为什么会这样呢?

在 /etc/网络/接口:

auto lo  
iface lo inet loopback  

auto eth0  
iface eth0 inet manual  
  up ip a a 5.156.241.126/25 dev eth0  
  up ip li set up dev eth0  
  up /etc/interim-fw.sh  
  down ifconfig eth0 0.0.0.0 down  


 auto eth1  
 iface eth1 inet manual  
    up ip a a 5.156.241.129/27 dev eth1  
    up ip li set up dev eth1  
    up ip route add default via 5.156.241.158  
    post-up /etc/firewall.sh  
    down ifconfig $IFACE 0.0.0.0 down  

/etc/防火墙.sh

!/bin/bash -e

I_INT=eth0  # Intranet-LAN-Interface  
I_DMZ=eth1  # DMZ-LAN-Interface  
NAME=5.156.241.130                       
MASTER=5.156.241.1    
UBUNTU=141.30.13.10,141.30.13.20,141.76.1.200,141.76.1.204,141.76.1.208  
REACTOS=178.63.204.104,188.40.64.41  
MOZILLA=52.222.170.144  
PYTHON=151.101.0.223,151.101.64.223,151.101.128.223,151.101.192.223  
MAIL=5.156.241.142  
WWW=5.156.88.1  
STATE_NEW="-m state --state NEW"  
STATE_ESTABLISHED="-m state --state ESTABLISHED"  
PING="-p icmp --icmp-type 8"                        #ICMP packet type 8 alias echo request (= ping request )
REM="-m comment --comment"
{
iptables-restore << @@@@@@@@

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
-A INPUT -i lo -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A INPUT   $STATE_ESTABLISHED -j ACCEPT
-A OUTPUT  $STATE_ESTABLISHED -j ACCEPT
-A FORWARD $STATE_ESTABLISHED -j ACCEPT


-A INPUT  -p icmp -m icmp --icmp-type any  $STATE_NEW  $REM "traceroute" -j ACCEPT
-A INPUT  -p udp      --dport 33434:33523  $STATE_NEW  $REM "traceroute" -j ACCEPT

-A INPUT   -i $I_INT -p tcp           --dport 22345 $STATE_NEW  $REM "ssh" -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -p tcp --dport 22345 $STATE_NEW  $REM "ssh" -j ACCEPT

-A OUTPUT -o $I_DMZ -d $SATURN -p tcp --dport 53  $STATE_NEW $REM "dns"  -j ACCEPT
-A OUTPUT -o $I_DMZ -d $SATURN -p udp --dport 53  $STATE_NEW $REM "dns"  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -d $SATURN -p tcp --dport 53  $REM "dns" $STATE_NEW  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -d $SATURN -p udp --dport 53  $REM "dns" $STATE_NEW  -j ACCEPT

-A FORWARD -i $I_INT -o $I_DMZ -d $MASTER -p tcp --dport 53  $REM "dns" $STATE_NEW  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -d $MASTER -p udp --dport 53  $REM "dns" $STATE_NEW  -j ACCEPT

-A OUTPUT -o $I_DMZ $PING $STATE_NEW $REM "Ping"  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ $PING $STATE_NEW $REM "Ping" -j ACCEPT

-A FORWARD -i $I_INT -o $I_DMZ -d $UBUNTU -p tcp --dport 80 $STATE_NEW $REM "Ubuntu"  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -d $REACTOS -p tcp -m multiport --dports 80,443 $STATE_NEW $REM "Reactos"  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -d $MOZILLA -p tcp -m multiport --dports 80,443 $STATE_NEW $REM "Mozilla"  -j ACCEPT
-A FORWARD -i $I_INT -o $I_DMZ -d $PYTHON -p tcp -m multiport --dports 80,443 $STATE_NEW $REM "Python"  -j ACCEPT
-A OUTPUT            -o $I_DMZ -d $UBUNTU -p tcp --dport 80 $STATE_NEW $REM "Ubuntu"  -j ACCEPT

-A FORWARD -i $I_INT -o $I_DMZ -d $WWW -p tcp --dport 80 $STATE_NEW $REM "www"  -j ACCEPT
-A OUTPUT            -o $I_DMZ -d $WWW -p tcp --dport 80 $STATE_NEW $REM "www"  -j ACCEPT

COMMIT

@@@@@@@@
} && {
  test $(sysctl -n net.ipv4.ip_forward) -eq 0 && sysctl net.ipv4.ip_forward=1  #Forwarding aktivieren
        echo "ok"
  echo "GOT HERE - ok!" >> /tmp/fw.log
  exit 0
} || {
  test $(sysctl -n net.ipv4.ip_forward) -ne 0 && sysctl net.ipv4.ip_forward=0  #Forwarding de-aktivieren
  /etc/firewall-vorlaeufig.sh

echo "GOT HERE - not ok " >> /tmp/fw.log

这并不重复如何保存iptables的规则? 原因是我的高级管理员坚持让我使用这个 /etc/firewall.sh 脚本。该脚本运行正常,但偶尔会失败。

感谢您迄今为止的评论。如果能找到原因,我将不胜感激。谢谢。鲍勃

答案1

您的情况很复杂,因为您正在运行虚拟机,并且您似乎正在使用某种脚本,并且您正尝试在网络前/后启动/关闭规则中调用该脚本。

在我看来,大多数用于生成 iptables 规则的“脚本”都过于复杂,完全没有必要。大多数脚本可能看起来很“聪明”,但通常唯一的目的就是掩盖 iptables。

保存/恢复规则的最简单方法是使用iptables-persistent

sudo apt-get install iptables-persistent

一旦您安装了该软件包,它将恢复您的规则,无论您是手动输入它们还是通过某种脚本生成它们。

如果您确实需要脚本方面的帮助,您需要发布它以及您的配置文件。

相关内容