使用 IP Chains 构建防火墙

作者:Pedro Paulo Bueno

今天,计算机世界最重要的主题之一就是安全。如何提高单机或互联机器的安全性有时很难理解,也很难实施。在本文中,我将讨论如何在 Linux 机器上使用 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 目录中,将 scriptf 文件复制到此目录,并添加类似如下的行
/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(请参阅资源)。在开始构建自己的防火墙脚本之前,请阅读它们。

资源

Building a Firewall with IP Chains
Pedro Paulo Ferreira Bueno,巴西戈亚斯天主教大学(UCG- Brazil)理科计算机专业学生,是 LinuxGO(戈亚斯 Linux 用户组)的经理,也是 Linux 知识库的网络卡版主。自从他在 Kernel 2.0.7 开始使用 Linux 以来,他就是一个狂热的 linux 用户。当他不坐在他的 linux 机器前时,他很可能在踢足球。可以通过 pedro.bueno@persogo.com.br 联系到他。
加载 Disqus 评论