下一页 上一页 目录

2. 数据包过滤基础

2.1 是什么?

通过网络的所有流量都以数据包的形式发送。例如,下载这个软件包(假设它有 50k 大小)可能会导致您接收大约 36 个每个 1460 字节的数据包(随机举例)。

每个数据包的开头说明了它的目的地、来源、数据包类型以及其他管理细节。数据包的这个开头部分称为头部。数据包的其余部分,包含实际传输的数据,通常称为主体

一些协议,例如用于网络流量、邮件和远程登录的 TCP,使用了“连接”的概念——在发送任何包含实际数据的包之前,会交换各种设置包(带有特殊的头部),内容是“我想连接”、“好的”和“谢谢”。然后才交换正常的数据包。

数据包过滤器是一种软件,它查看通过的数据包头部,并决定整个数据包的命运。它可能决定拒绝数据包(即丢弃数据包,就好像从未收到过它一样),接受数据包(即让数据包通过),或者驳回数据包(类似于拒绝,但会告知数据包的来源它已被驳回)。

在 Linux 下,数据包过滤内置于内核中,我们可以对数据包做一些更复杂的事情,但查看头部并决定数据包命运的一般原则仍然存在。

2.2 为什么?

控制。安全。监视。

控制

当您使用 Linux 机器将您的内部网络连接到另一个网络(例如,互联网)时,您有机会允许某些类型的流量,并禁止其他类型的流量。例如,数据包的头部包含数据包的目标地址,因此您可以阻止数据包前往外部网络的特定部分。再举一个例子,我使用 Netscape 访问 Dilbert 漫画存档。页面上有来自 doubleclick.net 的广告,Netscape 浪费我的时间,愉快地下载它们。告诉数据包过滤器不允许任何往返于 doubleclick.net 拥有的地址的数据包就可以解决这个问题(尽管有更好的方法来做到这一点)。

安全

当您的 Linux 机器是互联网的混乱与您美好的、井然有序的网络之间的唯一屏障时,很高兴知道您可以限制进入您家门的东西。例如,您可能允许任何东西从您的网络出去,但您可能会担心来自恶意外部人员的众所周知的“死亡之 Ping”进来。再举一个例子,您可能不希望外部人员 telnet 到您的 Linux 机器,即使您的所有帐户都有密码;也许您想(像大多数人一样)成为互联网上的观察者,而不是服务器(无论是否自愿)——只需阻止任何人连接进来,通过让数据包过滤器拒绝用于建立连接的传入数据包。

监视

有时,本地网络上配置错误的机器会决定向外部世界发送大量数据包。如果发生任何异常情况,告诉数据包过滤器通知您是很好的;也许您可以为此做些什么,或者也许您只是天生好奇。

2.3 如何?

带有数据包过滤的内核

您需要一个内核,其中包含新的 IP 防火墙链。您可以通过查找文件 `/proc/net/ip_fwchains` 来判断您当前运行的内核是否已安装此功能。如果它存在,那么您就具备了。

如果不存在,您需要构建一个具有 IP 防火墙链的内核。首先,下载您想要的内核源代码。如果您拥有的内核编号为 2.1.102 或更高版本,则无需对其进行修补(它现在已包含在主流内核中)。否则,应用上面列出的网页中的补丁,并按照下面详述的方式设置配置。如果您不知道如何执行此操作,请不要惊慌——阅读 Kernel-HOWTO。

对于 2.0 系列内核,您需要设置的配置选项是


        CONFIG_EXPERIMENTAL=y
        CONFIG_FIREWALL=y
        CONFIG_IP_FIREWALL=y
        CONFIG_IP_FIREWALL_CHAINS=y

对于 2.1 或 2.2 系列内核


        CONFIG_FIREWALL=y
        CONFIG_IP_FIREWALL=y

工具 ipchains 与内核对话,并告诉内核要过滤哪些数据包。除非您是程序员或过于好奇,否则这将是您控制数据包过滤的方式。

ipchains

ipchains 工具从内核的数据包过滤部分插入和删除规则。这意味着无论您设置什么,它都会在重启时丢失;请参阅 使规则永久生效,了解如何确保它们在下次 Linux 启动时恢复。

ipchains 取代了 ipfwadm,后者用于旧的 IP 防火墙代码。ipchains ftp 站点提供了一组有用的脚本

http://netfilter.filewatcher.org/ipchains/ipchains-scripts-1.1.2.tar.gz

其中包含一个名为 ipfwadm-wrapper 的 shell 脚本,它允许您像以前一样进行数据包过滤。除非您想要快速升级使用 ipfwadm 的系统(它速度较慢,并且不检查参数等),否则您可能不应该使用此脚本。在那种情况下,您也不太需要这个 HOWTO。

有关 ipfwadm 问题的更多详细信息,请参阅附录 ipchains 和 ipfwadm 之间的差异 和附录 使用 `ipfwadm-wrapper' 脚本

使规则永久生效

您当前的防火墙设置存储在内核中,因此将在重启时丢失。我建议使用 `ipchains-save` 和 `ipchains-restore` 脚本使您的规则永久生效。为此,请设置您的规则,然后运行(以 root 身份)

# ipchains-save > /etc/ipchains.rules
#

创建一个如下所示的脚本

#! /bin/sh
# Script to control packet filtering.

# If no rules, do nothing.
[ -f /etc/ipchains.rules ] || exit 0

case "$1" in
    start)
        echo -n "Turning on packet filtering:"
        /sbin/ipchains-restore < /etc/ipchains.rules || exit 1
        echo 1 > /proc/sys/net/ipv4/ip_forward
        echo "."
        ;;
    stop)
        echo -n "Turning off packet filtering:"
        echo 0 > /proc/sys/net/ipv4/ip_forward
        /sbin/ipchains -F
        /sbin/ipchains -X
        /sbin/ipchains -P input ACCEPT
        /sbin/ipchains -P output ACCEPT
        /sbin/ipchains -P forward ACCEPT
        echo "."
        ;;
    *)
        echo "Usage: /etc/init.d/packetfilter {start|stop}"
        exit 1
        ;;
esac

exit 0

确保此脚本在启动过程的早期运行。在我的情况下(Debian 2.1),我在 `/etc/rcS.d` 目录中创建一个名为 `S39packetfilter` 的符号链接(这将在 S40network 之前运行)。


下一页 上一页 目录