我有一台装有 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
一旦您安装了该软件包,它将恢复您的规则,无论您是手动输入它们还是通过某种脚本生成它们。
如果您确实需要脚本方面的帮助,您需要发布它以及您的配置文件。