我正在尝试为我的团队配置一个复杂的防火墙。我们正在研究具有不同类型的安全区域和流量的六个接口。
我有一个记录良好、干净的防火墙配置脚本,但如果我运行 iptables-save,结果当然不会有任何注释。结果也将与我们记录的策略不同步。
有没有一种简洁的方法,让我可以在 Redhat 上使用自己的配置文件,而不用撤消 Redhat 的 Rube Goldberg 脚本?同时,我想确保那些相同的脚本不会破坏我的配置,或者,例如,在有人执行 ifdown/ifup 时将防火墙撕开。
答案1
我建议编写一个脚本,例如:
#!/bin/bash
## Firewall flushing etc
for t in raw nat mangle filter; do
iptables -t $t -F
iptables -t $t -X
done
## Default policies
while read table chain policy; do
[[ -z $table ]] && continue ## Skip empty lines
iptables -t $table -P $chain $policy
done <<< "
raw PREROUTING DROP
filter FORWARD DROP
filter INPUT DROP
filter OUTPUT ACCEPT
"
## These rules perform foo
iptables ...
iptables ...
## These rules perform bar
iptables ...
iptables ...
... and so on ...
## Save them
iptables-save > /etc/firewall-rules.conf
exit 0
然后,编辑rc.local
并添加:
/sbin/iptables-restore < /etc/firewall-rules.conf
就在线之前exit 0
。
现在,如果您需要修改防火墙,只需编辑并执行第一个脚本。
答案2
在 RHEL 上管理 iptables 配置的最简单方法是完全忽略系统提供的配置脚本。我使用 puppet 管理我的所有 RHEL 系统,并使用基于片段的方法模块 Iptables 模式。
如果你不是木偶店,这可能不适合你,但从根本上讲,它所做的就是/etc/sysconfig/iptables
直接构建文件。这种方法可能会奏效非常对您来说很好。这样,您仍然可以保留您的评论,并按您想要的方式排列规则。
答案3
正如我已经说过的,恕我直言,编写 SHELL 脚本来配置 iptables 是一种愚蠢的方法。
iptables 自身的功能允许实现 99.99% 的策略,而无需引入一些额外的东西,例如 SHELL 脚本,例如
如果你需要将注释保存在你的 iptables 配置中,你可以使用-m comment --comment ""
答案4
您可以制作自己的启动脚本并使用 chkconfig 将其添加到现有服务中。
这是我经常使用的模板。
它会刷新所有规则并用允许 ssh、http 和 https 的自定义规则集替换它们。
#!/bin/bash
#
# firewall firewall script
# description: a firewall script
# chkconfig: 2345 91 09
#
IPTABLES=/sbin/iptables
start() {
ret=0
# input chain
$IPTABLES -A INPUT -m state --state INVALID -j DROP || ret=1
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT || ret=1
$IPTABLES -A INPUT -i lo -j ACCEPT || ret=1
$IPTABLES -A INPUT -p tcp --dport 22 --syn -m state --state NEW -j ACCEPT || ret=1
$IPTABLES -A INPUT -p tcp --dport 80 --syn -m state --state NEW -j ACCEPT || ret=1
$IPTABLES -A INPUT -p tcp --dport 443 --syn -m state --state NEW -j ACCEPT || ret=1
# output chain
$IPTABLES -A OUTPUT -m state --state INVALID -j DROP || ret=1
$IPTABLES -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT || ret=1
$IPTABLES -A OUTPUT -o lo -j ACCEPT || ret=1
return $ret
}
stop() {
ret=0
$IPTABLES -F || ret=1
$IPTABLES -F -t nat || ret=1
$IPTABLES -X || ret=1
$IPTABLES -P INPUT ACCEPT || ret=1
$IPTABLES -P OUTPUT ACCEPT || ret=1
$IPTABLES -P FORWARD ACCEPT || ret=1
return $ret
}
panic() {
ret=0
$IPTABLES -F || ret=1
$IPTABLES -F -t nat || ret=1
$IPTABLES -X || ret=1
$IPTABLES -P INPUT DROP || ret=1
$IPTABLES -P OUTPUT DROP || ret=1
$IPTABLES -P FORWARD DROP || ret=1
$IPTABLES -Z || ret=1
$IPTABLES -t nat -Z || ret=1
return $ret
}
status() {
$IPTABLES -t filter -L -v --line-numbers
$IPTABLES -t nat -L -v --line-numbers
return 0
}
restart() {
stop
start
}
case "$1" in
start)
stop
start
RETVAL=$?
;;
stop)
stop
RETVAL=$?
;;
restart)
restart
RETVAL=$?
;;
status)
status
RETVAL=$?
;;
panic)
panic
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|restart|status|panic}"
exit 1
;;
esac
exit $RETVAL
您可以简单地将该脚本放入其中/etc/init.d/
,使其可执行并运行chkconfig firewall --add && chkconfig firewall on
。
现在,您可以使用 启用防火墙service firewall start
,service firewall panic
停止所有网络流量并service firewall stop
禁用防火墙。
我想您明白了。
该系统的主要优点是您有一个脚本,可以对其进行大量自定义和写入注释,而无需触及操作系统的任何现有 iptables 设置。