Paranoid Penguin - Linux 防火墙,人人适用
Linux 内核包含通用操作系统中最强大和灵活的防火墙代码。此代码称为 Netfilter,但我们大多数人使用其用户空间命令 iptables 的名称来称呼它。Netfilter/iptables 允许您的 Linux 内核检查通过系统的所有网络流量,并根据非常丰富的标准集决定如何处理该流量。
使用 iptables 构建 Linux 防火墙是一个很大的主题——已经有关于它的整本书籍(请参阅“资源”)。实际上,防火墙工程本身就是一种职业(实际上是我的职业)。因此,唉,没有人可以在一篇杂志文章中告诉您构建 iptables 防火墙所需了解的一切。
但是,我可以概述 iptables 可以做的事情、一些 Linux 防火墙设计的合理原则、一些用于构建不同类型 Linux 防火墙的便捷工具的描述,以及指向有关 Linux 防火墙的更详细信息的指针。
防火墙或更准确地说,数据包过滤,可以用于许多事情。它可以本地用于单个服务器和桌面系统,以进行主机级别的网络攻击防护。它可以在网络基础设施级别用于保护整个网络免受其他网络的攻击,并且可以用于以各种方式重定向甚至更改网络数据包。
Linux 防火墙可以是基于 Linux 的专用硬件设备、具有多个网络接口的 PC,甚至可以是普通的单接口工作站或服务器。许多商业防火墙设备都是基于 Linux/iptables 的。与您可能认为的相反,如果部署在功能足够强大的硬件上,基于 PC 的 Linux 防火墙可以表现良好并很好地扩展。
这些是 Linux 防火墙采用的外形尺寸,它们在两种不同的角色中发挥作用。防火墙设备和多接口基于 PC 的防火墙用作我所说的网络防火墙。它们充当专用网络设备,在逻辑上等同于调节不同网络之间流量的 IP 路由器。(从技术上讲,防火墙是路由器;它们只是比普通路由器更挑剔它们路由的内容。)网络防火墙通常还执行网络地址转换 (NAT),通常是为了允许具有不可通过 Internet 路由的 IP 地址的主机与 Internet 通信。
然后,还有我所说的本地防火墙——工作站或服务器,它们的主要功能根本不是防火墙,而是保护自身的需求。在我看来,连接到 Internet 的任何计算机,无论是服务器还是工作站,都应运行本地防火墙策略。对于 Linux 系统,我们没有理由不利用 Linux 内置的 Netfilter/iptables 功能。此外,这是最容易创建的防火墙脚本类型,我将在本文后面展示。
在我们讨论 Linux 防火墙工具之前,我们应该介绍一些通用的防火墙设计原则。无论您是使用 iptables 保护单个主机还是整个网络,这些原则中的大多数都是(或应该是)同样有效的。
首先,这里是一些术语
数据包过滤:检查单个网络数据包,对照一组规则进行比较并相应地处理它们的实践。
防火墙策略:一组特定的 iptables 命令或一组更高级别的设计目标,您的 iptables 命令强制执行这些目标。
防火墙规则或数据包过滤规则:防火墙策略的各个组成部分——即,单个 iptables 命令迭代。
构建任何数据包过滤规则集的第一步是准确确定您希望防火墙执行的操作——即,制定您的高级防火墙策略。例如,如果我正在为工作站创建本地防火墙脚本,我的逻辑策略可能如下所示
允许从本地系统到整个外部世界的出站 DNS 查询、通过 HTTP 和 HTTPS 进行 Web 冲浪、通过 IMAP 进行电子邮件检索、出站 SSH 和出站 FTP 事务。
允许从我地下室中的另一台工作站到此系统的入站 SSH 连接。
阻止其他一切。
跳过定义高级策略的这个关键步骤类似于在没有首先定义需求的情况下编写软件应用程序。您有浪费时间在您不需要的规则上以及忽略您需要的规则的风险。
我进一步建议,无论您决定采用什么策略,您都应使其尽可能具有限制性。Marcus Ranum 多年前非常简洁地陈述了防火墙设计的指导原则:“凡未明确允许的,皆为禁止”。原因很简单;仅仅因为您无法想到如何滥用允许但不需要的网络事务,并不意味着某些攻击者无法滥用它。
因此,每个防火墙策略在逻辑上都必须以阻止之前未指定的所有内容的规则结尾。
这不仅适用于网络/企业防火墙策略,也适用于个人/本地防火墙策略。个人防火墙上常见的错误是允许所有“出站”事务,假设所有本地进程都是“受信任的”。但是,如果您的系统感染了蠕虫、木马或病毒,则此假设就会失效。
如果发生此类感染,您可能不希望恶意软件能够使用您的系统发送垃圾邮件、参与分布式拒绝服务攻击等等。因此,最好不仅限制“入站”(外部发起)网络事务,而且还限制出站(内部/本地发起)事务,即使在桌面系统和服务器的本地防火墙策略上也是如此。
另一个重要的防火墙设计原则是,在可能的情况下,将相似的风险组合在一起。换句话说,具有不同信任级别和不同风险暴露级别的系统和网络应通过网络防火墙彼此隔离。
在实践中,此原则的经典示例是 DMZ 或非军事区,这是一个包含组织所有可访问 Internet 的系统的网络。图 1 显示了 DMZ 之间的关系:包含组织工作组和其他非面向公众的网络资源的“内部”网络以及 Internet。

图 1. DMZ 网络
通过将 DMZ 网络与 Internet 和内部(受信任)网络分开的防火墙,您可以编写规则,以非常精细的方式指定这三个区域中的主机如何相互交互。在制定此类规则时,您应该假设,由于暴露于几乎无限范围的潜在攻击者(通过 Internet),DMZ 中的主机应最好被视为半信任——也就是说,您应该假设 DMZ 中的任何主机都可能在某个时候被入侵。因此,您应该尽可能少地允许从 DMZ 发起传输到内部网络的事务。
您还应考虑受损的 DMZ 主机可能对外部世界造成的威胁。例如,如果基于 Internet 的攻击者入侵了您的 DNS 服务器,即使攻击者试图侵入您的内部网络的尝试被防火墙规则阻止,如果受损的服务器能够任意连接(即攻击)Internet 上的其他系统,该攻击者仍然可能给您的组织带来尴尬甚至法律问题。我再说多少遍都不为过:防火墙策略应仅允许您的用户和系统完成其工作所需的最低限度的网络事务集。不必要的数据流将会迟早被滥用。
您可能注意到图 1 中使用了两个防火墙。这是经典的防火墙三明治 DMZ 架构,但许多组织选择更经济的多宿主防火墙 DMZ 架构(图 2),其中具有多个网络接口的单个防火墙互连并限制不同网络之间的流量。虽然三明治拓扑结构提供了更大的保护,例如,防止外部防火墙本身以某种方式受到入侵(假设另一个防火墙不受完全相同的漏洞的影响),但只要您足够仔细地编写规则,多宿主防火墙方法同样有效。

图 2. DMZ 和多宿主防火墙
此外,无论您使用单个多宿主防火墙还是成对的防火墙,每个网络区域(内部、外部/Internet 和 DMZ)都连接到防火墙上的专用物理网络接口都非常重要。是的,这确实使您的防火墙成为潜在的单点故障。但是,如果一个网络区域中的主机有可能在不遍历防火墙的情况下将数据包路由到其他网络区域,那么您的防火墙将几乎没有实际价值!
我现在提到的最后一个通用防火墙设计原则仅适用于多接口防火墙(即,不适用于本地/个人防火墙):始终使用反欺骗规则。
考虑图 1 中的面向 Internet 的防火墙。它有两个网络接口:内部(面向 DMZ)和外部(面向 Internet)。假设图 1 中的内部网络使用 C 类网络空间 192.168.55.0/24 中的 IP 地址,DMZ 使用 192.168.77.0/24。
因此,此防火墙可以并且应该丢弃在其 Internet 接口上接收到的任何源 IP 地址来自这两个专用 IP 范围的数据包。可以安全地假设此类数据包是伪造的(欺骗的)。攻击者有时会伪造其数据包的源 IP 地址,试图使它们通过防火墙或击败其他基于源 IP 的身份验证机制(TCPwrappers、hosts.equiv 等)。
实际上,任何防火墙上的任何面向 Internet 的网络接口都应丢弃源 IP 地址来自任何不可通过 Internet 路由的 IP 范围的数据包,特别是 RFC 1918 中指定的那些:10.0.0.0/8、172.16.0.0/12 和 192.168.0.0/16。(如果这些数字(以 CIDR 表示法表示的 IP 地址范围)使您感到困惑,请不要惊慌!本文稍后讨论的一些 iptables 工具假设没有特定的网络专业知识。)
为了更普遍地表达这个重要的防火墙设计原则:您应该配置防火墙以丢弃任何带有不可能的源 IP 地址的数据包。
这些是所有防火墙都应该做的一些事情。现在,我们如何使它们做到这些事情?
所有 Linux 防火墙的工作方式都相同。一系列 iptables 命令按顺序执行,以将防火墙规则加载到内核内存空间中。然后,内核根据这些规则评估所有进入所有网络接口的数据包,并进行相应的处理。这些规则组织在表(以前,并且偶尔仍然称为链)中。可以使用 iptables 命令随时插入、附加、更改和删除任何表中的规则,并立即生效。
创建 Linux 防火墙策略最直接的方法是从头开始编写 iptables 启动脚本,然后像管理 init.d 中的任何其他启动脚本一样管理它。这就是我管理自己的 Linux 防火墙的方式,如果您了解网络,熟悉 iptables 命令,并且没有太多不同的防火墙要管理,或者在任何给定的防火墙上没有超过几个不同的策略,则此方法效果很好。
要了解如何编写自己的 iptables 脚本,请参阅本文的“资源”。正如我之前所说,我无法在这里公正地对待这个主题。(请注意,不同的 Linux 发行版以不同的方式处理启动脚本。)如果您想利用 iptables 的全部功能,包括 NAT、自定义链和数据包修改,这确实是最好的方法。
假设您不能或不想直接编写 iptables 脚本,以下是一些指向可以提供帮助的工具的指针。
我在此处讨论的第一类 iptables 工具可能已存在于您的系统中。如今,几乎所有 Linux 发行版都在其安装实用程序中包含防火墙向导。几乎总是,此向导旨在创建本地防火墙策略——即,仅保护本地主机的个人防火墙脚本。
这些向导的工作方式都相同。它们询问您希望允许外部主机访问哪些本地服务(如果有)。例如,如果我在 SMTP 电子邮件服务器上安装 Linux,我将仅允许入站连接到 TCP 端口 25 (SMTP),但也可能允许连接到 TCP 端口 22(Secure Shell,我可能需要用于远程管理)。
根据您的响应,向导然后创建一个启动脚本,其中包含 iptables 命令,这些命令允许对您指定的服务/端口的传入请求,阻止所有其他入站(外部发起)事务,并允许所有出站(本地发起)网络事务。
但是等等!第三个命令违反了 Ranum 的原则(拒绝所有未明确允许的内容),不是吗?是的,确实如此。这就是为什么即使对于本地防火墙策略,我也要编写自己的 iptables 脚本。您需要根据具体情况自行决定是否可以接受“允许一些入站,允许所有出站”的折衷方案,这无疑是本地防火墙最简单的方法,或者您是否足够担心恶意软件恶作剧的威胁,从而编写更具限制性的脚本,无论是手动还是使用比 Linux 发行版安装程序更复杂的防火墙工具。
请注意,与其他 Linux 安装程序功能一样,这些防火墙向导通常可以在以后再次运行,例如,在 SUSE 中通过 YaST 的“安全性和用户”→“防火墙”模块。
我们已经讨论了困难的方法(编写您自己的 iptables 启动脚本)和简单的方法(让您的 Linux 安装程序生成本地防火墙脚本)。但是,还有许多其他工具可用于生成和管理复杂的防火墙脚本。最受欢迎的两种是 Shorewall 和 Firewall Builder(请参阅“资源”)。
Shorewall 本质上是一个脚本/宏环境,可让您以文本文件形式创建防火墙策略,然后将其“编译”为 iptables 脚本。Shorewall 的优势在于其灵活性、其使用户无需学习 iptables 语法的能力以及自动生成启动脚本的便利性。但是,如果您了解网络,那么学习使用 Shorewall 不一定比学习 iptables 花费的时间少得多。
因此,我个人并没有经常使用 Shorewall。但是,我的朋友们,他们对网络的了解不如我对系统管理的了解,却对它赞不绝口。
Firewall Builder,我在 2003 年 5 月和 6 月的Linux Journal期刊中介绍了它,它完全是另一回事。它是防火墙等效于集成开发环境——即,用于生成 iptables 脚本(以及其他防火墙类型)的图形化、面向对象的界面。
从概念上讲,Firewall Builder 与 Check Point 防火墙中的策略编辑器非常相似。您为您要在规则中使用的网络和主机创建“对象”,然后将这些对象和预定义的“服务”对象(HTTP、IMAP、FTP 等)排列成图形规则语句。Firewall Builder 不仅将这些生成为 iptables 脚本,而且还可以通过 SSH 将它们安装在其他系统上。
根据我的经验,Firewall Builder 的主要缺点是其依赖项列表有点长,其中最主要的是用于 GUI 开发的 Qt 库。但是,Firewall Builder 需要的许多东西现在是典型发行版中包含的标准 Linux 软件包,因此这已不再像过去那样成为问题。有关详细的安装说明,请参阅 Firewall Builder 主页。
其他图形化 iptables 实用程序包括 Firestarter 和 Guarddog(请参阅“资源”)。
几年前,Linux Journal将 iptables 评为年度安全工具。它确实是一项了不起的成就。如果您对网络安全认真对待,您将需要比我们在本文中更详细地探索 iptables 的强大功能,从 iptables(8) 手册页开始,并逐步浏览 Netfilter 主页上提供的操作指南(请参阅“资源”)。
无论您是使用 iptables 保护笔记本电脑还是整个企业网络,我都希望您发现此介绍很有用。注意安全!
资源
Netfilter 主页,您可以在其中找到最新的 iptables 相关操作指南:www.netfilter.org
Firewall Builder 的主页,这是一个面向对象的 GUI,用于生成和管理多种不同类型防火墙的规则,包括 iptables:www.fwbuilder.org
Shorewall (Shoreline Firewall) 主页:www.shorewall.net
Suehring, S. 和 Ziegler, R. Linux 防火墙,第 3 版。Upper Saddle River, NJ: Novell Press, 2005。
Firestarter 的主页,一个 iptables GUI:www.fs-security.com
Guarddog iptables GUI 的主页:www.simonzone.com/software/guarddog
Mick Bauer (darth.elmo@wiremonkeys.org) 是美国最大的银行之一的网络安全架构师。他是 O'Reilly 图书Linux 服务器安全(第 2 版)(以前称为使用 Linux 构建安全服务器)的作者,信息安全会议的偶尔演讲者,以及“网络工程波尔卡”的作曲家。