Redhat IPTables 上的手动防火墙配置

Redhat IPTables 上的手动防火墙配置

我正在尝试为我的团队配置一个复杂的防火墙。我们正在研究具有不同类型的安全区域和流量的六个接口。

我有一个记录良好、干净的防火墙配置脚本,但如果我运行 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 startservice firewall panic停止所有网络流量并service firewall stop禁用防火墙。
我想您明白了。

该系统的主要优点是您有一个脚本,可以对其进行大量自定义和写入注释,而无需触及操作系统的任何现有 iptables 设置。

相关内容