第一章 关于本教程
我应该学习这门教程吗?
本教程演示了如何使用 netfilter 来建立功能强大的 Linux 有状态防火墙。您需要的只是使用 Linux 2.4 内核的现有 Linux 系统。安装了 Linux 2.4 内核的膝上型计算机、工作站、路由器或服务器都符合要求。
您应该相当熟悉标准网络术语,如 IP 地址、源和目标端口号、TCP、UDP 和 ICMP 等。学完本教程后,您将会懂得如何创建 Linux 有状态防火墙,而且会有几个示例配置可供您在自己的项目中使用。
关于作者
如果有关于本教程内容的技术问题,请通过
[email protected] 联系作者 Daniel Robbins。
Daniel Robbins 居住在新墨西哥州的 Albuquerque。他是 Gentoo Technologies, Inc. 的总裁兼 CEO,Gentoo Linux(用于 PC 的高级 Linux)和 Portage 系统(Linux 的下一代移植系统)的创始人。他还是 Macmillan 书籍 Caldera OpenLinux Unleashed、SuSE Linux Unleashed 和 Samba Unleashed 的合作者。Daniel 自二年级起就与计算机某些领域结下不解之缘,那时他首先接触的是 Logo 程序语言,并沉溺于 Pac-Man 游戏中。这也许就是他至今仍担任 SONY Electronic Publishing/Psygnosis 的首席图形设计师的原因所在。Daniel 喜欢与妻子 Mary 和新出生的女儿 Hadassah 一起共度时光。
第二章 首要步骤
定义目标
在本教程中,我们将创建 Linux 有状态防火墙。此防火墙将会在 Linux 膝上型计算机、工作站、服务器或路由器上运行;其主要目的是只允许某些类型的网络通信流通过。为了增加安全性,我们将配置防火墙,使它删除或拒绝我们不感兴趣的通信流,以及可能会造成安全性威胁的通信流。
获取工具
开始设计防火墙之前,需要做两件事。首先,需要确保 ""iptables"" 命令可用。作为 root,输入 ""iptables"",查看它是否存在。如果不存在,那么需要先安装它。以下是安装方法:访问 http://netfilter.samba.org,下载可以找到的 iptables.tar.gz 的最新版本(目前是 iptables-1.1.2.tar.gz)。然后,输入以下命令来安装它(为简便起见,省略了输出):
# tar xzvf iptables-1.1.2.tar.gz
# cd iptables-1.1.2
# make
# make install
内核配置,第 1 部分
安装之后,应该有一个 ""iptables"" 命令可供使用,还有一个方便的 iptables 帮助页面(""man iptables"")。好;现在只需要确保已在内核中构建了必需的功能。本教程假设您编译自己的内核。进入 /usr/src/linux,输入 ""make menuconfig"" 或 ""make xconfig"";我们将启用一些内核网络功能。
内核配置,第 2 部分
在 ""Networking options"" 部分中,确保至少启用了以下选项:
<*> Packet socket
[*] Network packet filtering (replaces ipchains)
<*> Unix domain sockets
[*] TCP/IP networking
[*] IP: advanced router
[*] IP: policy routing
[*] IP: use netfilter MARK value as routing key
[*] IP: fast network address translation
[*] IP: use TOS value as routing key
然后,在 ""IP: Netfilter Configuration --->"" 菜单中,启用每个选项,这样我们就拥有了完整的 netfilter 功能。虽然我们不会使用所有 netfilter 功能,但最好启用它们,这样您可以在以后进行一些实验。
内核配置,第 3 部分
""Networking options"" 类别下有一个网络选项不应该启用:明确拥塞通知。让这个选项保留禁用状态:
[ ] IP: TCP Explicit Congestion Notification support
如果启用了这个选项,那么 Linux 机器将不能继续与 8% 的因特网进行网络通信。启用 ECN 时,Linux 机器发送出的一些包将会设置 ECN 位;不过,这个位会使许多网际路由器感到困惑,因此一定要禁用 ECN。
好,现在已根据我们的需要正确配置了内核,编译一个新的内核,安装它,然后重新引导。现在开始使用 netfilter :)
防火墙设计基础
在创建防火墙时,""iptables"" 命令是我们的朋友。我们使用它与内核中的网络包过滤规则进行交互。我们将使用 ""iptables"" 命令来新建规则、列出现有规则、刷新规则和设置缺省包处理策略。这就意味着要创建防火墙,需要输入一系列 iptables 命令,这就是我们首先要讨论的内容(此时请别输入此命令!)……
# iptables -P INPUT DROP
您现在看到的是一个几乎“完美”的防火墙。如果输入此命令,您将会得到难以置信的完美保护,它可以防止任何形式的进入恶意攻击。那是因为此命令告诉内核删除所有进入网络包。虽然这个防火墙非常安全,但它有点傻。但在继续讨论之前,让我们研究一下此命令是如何执行操作的。
设置链策略
""iptables -P"" 命令用于为包过滤规则链设置缺省策略。在本示例中,iptables -P 用于为 INPUT 链设置缺省策略,INPUT 是一个内置链,包括了应用于每个进入包的规则。通过将缺省策略设置成 DROP,告诉内核应该删除(即,废弃)到达 INPUT 规则链末端的任意包。而且,由于我们还没有对 INPUT 链添加任何规则,因此所有包都会到达此链的末端,而且所有包都会被删除。
再次声明,这个命令本身根本没有用。但是,它演示了一个很好的防火墙设计策略。我们从缺省情况下删除所有包开始,然后逐步开放防火墙,这样它将会满足我们的需要。这种做法可以确保防火墙会尽可能安全。