使用 IP Chains 构建防火墙
对于将内核从 2.0.36 升级到 2.2.x 系列的用户来说,IP chains 可能是新的,但对于那些在 2.1.x 系列中工作过的用户来说,则是旧的。ipchains 是对著名的 ipfwadm 的重写,而 ipfwadm 又是对 BSD 的 ipfw 的重写,ipfw 用于在 2.0.x 内核中构建防火墙。进行此重写有很多原因,但也许最重要的原因是 ipfwadm 除了 TCP、UDP 或 ICMP 之外,无法处理其他协议,并且它无法处理分片。
Linux IP 防火墙链软件是一个使用内核 IP 数据包过滤功能的程序。数据包过滤器查看数据包的头部,并决定整个数据包的命运。它可以决定 DENY 数据包(丢弃数据包,就像从未收到过一样)、ACCEPT(让数据包通过)或 REJECT(类似于 DENY,但通知数据包的来源)。
当您构建防火墙时,您寻求的是对网络的控制和安全,而良好的防火墙脚本是实现此目标的关键。如果您不断收到来自特定 IP 地址的 ping 洪水攻击,您可以通过创建一个具有此策略的链来拒绝来自该 IP 的所有数据包。ipchains 能够读取脚本的策略,并向 IP 数据包过滤器发出关于如何处理传入/传出数据包的指令。
首先,您的内核必须能够使用 IP chains。查找文件 /proc/net/ip_fwchains,如果它存在,一切正常。如果不存在,您需要重新编译内核并设置以下选项
CONFIG_FIREWALL=y CONFIG_IP_FIREWALL=y
接下来,您需要了解创建功能脚本所需的 ipchains 语法。让我们想象一个名为 scriptf 的假设文件,其中包含一些规则
ipchains -N ippolicy ipchains -I input -j ippolicy ipchains -A ippolicy -p icmp -s 198.162.1.2 -j\ DENY ipchains -A ippolicy -p TCP -t 200.241.233.1 -j\ DENY此脚本将 DENY 来自特定源地址(在我们的示例中:192.168.1.2)的每个 ICMP 协议数据包,并且还将 DENY 目标是所选地址(在我们的示例中再次为:200.241.233.1)的每个 TCP 协议数据包。以下是逐步解释
ipchains -N ippolicy:此行创建一个名为 ippolicy 的新链。
ipchains -I input -j ippolicy:此行表示所有数据包都将由 ippolicy 规则验证。
ipchains -A ippolicy -p icmp -s 198.162.1.2 -j DENY:此行将规则 ippolicy 附加到 ICMP 协议数据包,源地址为 192.162.1.2 并拒绝它们。选项是
-A:将一个或多个规则附加到选定的链。
-p:指定协议。
-s:指定源地址(0/0 表示所有地址)。
-j:指定规则的目标,即,如果数据包匹配规则,该怎么做。
ipchains -A ippolicy -p TCP -t 200.241.233.1 -j DENY:此行将规则 ippolicy 附加到 TCP 协议数据包,目标地址为 200.241.233.1 并拒绝它们。
/etc/rc.d/init.d/scritpf在 /etc/rc.d/rc.sysinit 文件中启动它。一个将来可能对您有帮助的重要选项是 -F 标志,当您想要创建新规则并覆盖所有先前规则时使用它,即
ipchains -F ippolicy
Ip chains 是一个非常强大的工具,允许您创建许多复杂的规则来保护您的网络。只是为了好玩,我编写了一个小的 C 程序来构建简单的防火墙脚本并简化 rc.d 过程。它是开源的,可在 linuxgo.persogo.com.br/ipchains.html 获取。获取有关如何构建出色脚本的更多信息的好地方是 HOWTO(请参阅资源)。在开始构建自己的防火墙脚本之前,请阅读它们。
