偏执的企鹅 - 使用 Linux 构建透明防火墙,第一部分

作者:Mick Bauer

当我于 2000 年秋季开始撰写这个专栏时,我的日常工作是防火墙工程师。我喜欢那种类型的工作,但我有足够的大局观,意识到防火墙在整体方案中的重要性逐年下降。事实上,我确信在十年左右的时间里,防火墙即使不是完全过时,也将几乎变得无关紧要。

但是,我错了!防火墙并没有消亡。它们正在进化,即使传统防火墙技术可能比十年前的作用要小,但如果我们没有它们,我们将面临的威胁仍然证明了保留它们的努力和费用是合理的。

所以,我认为现在是我回到我的根源的时候了,可以这么说。本月,我开始撰写一系列我一直想解决的文章:如何使用 Linux 构建透明防火墙。首先,我通过解释为什么防火墙仍然在首位相关,以及“路由”防火墙和“桥接”(透明)防火墙之间的区别来奠定基础。

防火墙的作用和不作用

我曾经想从防火墙架构和设计的入门知识开始,讨论多宿主和“三明治”拓扑、规则设计方法等等之间的区别。但是,我的 2007 年 4 月的文章“适用于每个人的 Linux 防火墙”已经做得很好,您仍然可以在线阅读它(请参阅资源)。相反,我将讨论为什么防火墙仍然有用。

IP 防火墙,与应用程序防火墙或 XML 网关不同,它在 IP 和 TCP/UDP 层检查网络流量,可能具有非常有限的应用程序智能(例如,能够区分 FTP “get” 和 “put” 命令、HTTP “post” 与 “get” 等等)。在实际应用中,大多数数据包过滤和“状态” IP 过滤防火墙主要基于源和目标 IP 地址以及源和目标 UDP 或 TCP 端口来评估流量。

当我刚开始从事网络工程时,仅基于这几个标准过滤流量似乎对于大多数实际防火墙应用程序来说已经足够强大了,特别是如果防火墙足够智能,可以按会话而不是按单个数据包跟踪网络流量。(在过去,仅在 IP 过滤防火墙中编程以允许通过 UDP 端口 53 进行出站 DNS 查询是不够的;您还需要添加相应的规则以允许源自 UDP 端口 53 的 DNS 回复。状态跟踪或“状态”防火墙会自动将数据包与已允许的会话关联起来。)

因为在那些遥远的过去,不同的网络应用程序都使用不同的 TCP 和 UDP 端口——TCP 端口 23 用于 telnet,TCP 和 UDP 端口 53 用于 DNS,TCP 端口 20 和 21 用于 FTP 等等——按端口号过滤就等于按应用程序类型过滤。

这并不意味着防火墙可以检测或阻止可能在允许的源/目标/地址/端口组合上发生的恶意行为。我们没有幻想防火墙可以阻止,例如,针对可通过 TCP 端口 80 从全世界访问的公共 Web 服务器的 Apache 缓冲区溢出攻击。但是,防火墙可以(并且可以)阻止尝试通过 TCP 端口 22 上的安全外壳连接到该 Web 服务器,除非可能是从某些内部授权访问点。

问题是,我们越来越无法依赖于这样一种假设,即我们最应该担心的事情将发生在防火墙可以完全阻止的端口上。这是因为人们使用网络的大部分内容都发生在仅有的两个 TCP 端口上:TCP 80 (HTTP) 和 TCP 443 (HTTPS)。

即使在十年前,开发人员也在竞相从客户端-服务器应用程序架构(其中每个网络应用程序都使用自己的通信协议)迁移到 Web 服务模型,其中实际上只有两种类型的网络事务:Web 会话和数据库事务。在那之前很久,人们开始想出通过 HTTP 使用 Web 浏览器来完成实际上可以通过网络完成的所有事情的方法——从浏览文件系统到运行远程桌面会话。

但这真的意味着防火墙已经过时了吗?绝对不是,即使在涉及 Web 服务器的环境中也是如此。假设所有两个安全区域之间的网络流量都通过 TCP 端口 443。通过按源 IP 地址和目标 IP 地址限制流量,您仍然可以决定哪些主机可以发起任何到任何其他给定主机的事务。

如果仅严格根据源和目标 IP 地址过滤流量,实际上不按 TCP/UDP 端口(服务类型)过滤,您可能会认为您没有取得多大成就。攻击者为了攻击受保护的系统,所要做的就是获得对防火墙允许与其目标系统发起事务的某些其他系统的访问权限。但是,如果防火墙认为受信任的那些“二级”系统中没有一个是外部可访问的呢?如果是这种情况,那么您“粗糙”的防火墙规则实际上可能有效地减轻了该系统的远程入侵风险。

图 1 说明了这种情况,其中显示了一个防火墙,它位于两个不同的网络区域 A 和区域 B 以及 Internet 之间。防火墙阻止来自 Internet 的所有入站流量到任何一个区域,但允许区域 B 中的主机发起与区域 A 中的主机的事务。在这种情况下,即使防火墙仅按源 IP 地址进行过滤,防火墙也非常有效地使基于 Internet 的攻击者难以利用区域 A 和区域 B 之间的信任关系。

Paranoid Penguin - Building a Transparent Firewall with Linux, Part I

图 1. 仅按源 IP 地址过滤

但是,我并不是真的提倡仅地址过滤。事实是,仍然有很多重要的网络服务使用 TCP 80/443 和 HTTP/HTTPS 之外的端口和协议。域名服务仍然使用 TCP 和 UDP 53;Microsoft 远程桌面协议(终端服务)仍然使用 TCP 端口 3389;Oracle 仍然使用 TCP 端口 1521;等等。现代防火墙仍然基于服务类型,对允许哪些流量做出许多有意义的决策。

反对防火墙有用性的另一个论点是,恶意软件(病毒、木马、蠕虫)已经从主要是一种滋扰演变为渗透甚至安全网络的复杂手段。十年前,病毒或蠕虫爆发在一个组织中最可能的影响是服务中断。恶意软件倾向于消耗系统和网络资源,但由于其不分青红皂白的性质,它对于窃取数据或破坏敏感系统不是很有用。

然而,如今,恶意软件通常针对特定组织,攻击者首先会竭尽全力了解要让他们的恶意软件查找哪些数据和系统,这基于这些系统上已知的(或极有可能的)漏洞。换句话说,如今,恶意黑客经常部署蠕虫作为他们自己的“化身”!

这种有针对性的恶意软件极其难以检测、补救或追溯。通常,它是由被收买的内部人员直接放置在目标网络或系统上的。因此,防火墙通常在阻止有针对性的恶意软件的活动中几乎没有作用。如果您的邮件室人员已被收买而忽略了寄给您国王的大包裹正在滴答作响的事实,那么您的堡垒墙有多厚都无关紧要。

但是我想问您,坏人可能只是邮寄给您的国王一枚炸弹这一事实,是否意味着您可以安全地用纸板取代那些昂贵的城堡墙——任何一年的城堡墙的修补费用可能都是天文数字?我个人不认为您可以这样做。

仅仅因为攻击者正在开发越来越复杂的工具,并不意味着他们会忘记如何使用旧工具。还记得 1990 年代后期的 LAND 攻击吗?它涉及发送欺骗的 TCP 数据包,这些数据包的源 IP 地址与您发送的目标地址相同,从而导致大规模的“回复自己”循环,这会损害系统性能(可能造成严重破坏)。系统补丁和防火墙保护使 LAND 过时了——或者我们曾经这样认为。但在 2005 年,一位名叫 Dejan Levaja 的安全研究人员发现 Windows Server 2003 和 Windows XP SP2 容易受到 LAND 攻击。

防火墙(仍然)可以轻松阻止 LAND 攻击这一事实实际上与重点无关。我真正想说明的是,只要攻击仍然可行并且系统容易受到攻击,就没有真正的过时攻击。从理论上讲,如果您的组织严格加固了连接到网络的每台计算机,如果您关闭防火墙,您可能不会立即受到感染或攻击。但我向您保证,您迟早会受到感染或攻击,而且并非严格采用最先进的攻击技术。

因此,总结一下,即使您认为您的防火墙所做的只是阻止来自意外来源的流量,它仍然提供了有意义的保护。现代网络流量实际上并非仅由 HTTP 和 HTTPS 组成;它仍然在令人惊讶的各种不同端口和协议上进行。而且,有针对性的恶意软件和针对 Web 应用程序的攻击的增加并不是反对防火墙的论据;它们仅仅是防火墙本身不足以保护关键系统的原因。

那么,我们是否可以同意防火墙仍然是网络安全工具包中的重要工具?我希望如此,因为我将花费几个月的时间向您展示如何构建一种特别巧妙的 Linux 防火墙:透明防火墙。

路由防火墙与桥接防火墙

通常,防火墙充当路由器。它接收来自两个或多个网络接口的流量,并决定是否以及如何路由该流量。任何需要通过防火墙发送流量的主机都必须使用面向它的防火墙接口的 IP 地址作为其默认网关,或者必须配置该主机和防火墙之间的路由器,以将防火墙用作通往防火墙另一侧的任何网络的路由。

图 2 显示了一个路由防火墙。如您所见,每个防火墙接口都有自己的 IP 地址,该 IP 地址在该接口连接的网络上有效,并且该 IP 地址充当通往防火墙另一侧的路由。在本例中,网络 A 中的主机必须知道(或将数据包发送到知道的网络路由器)10.20.30.254 是到达网络 B 的网关。网络 B 中的主机必须知道(或与知道的网络路由器对话)44.55.66.254 是到达网络 A 的网关。

Paranoid Penguin - Building a Transparent Firewall with Linux, Part I

图 2. 标准(路由)防火墙

“防火墙作为路由器”方法的一个结果是,通常,如果您有一大堆现有系统要划分为两个安全区域,一个“受信任”区域和一个“不受信任”区域,您可能需要重新 IP 寻址一个或两个区域中的主机(或重新掩盖它们所在的子网,这可能是不可能的),并在这些区域之间插入配置为网关的防火墙。换句话说,将路由防火墙插入现有网络通常意味着重新配置网络和连接到网络的系统。

但是,如果您想在同一网络的两个部分之间插入防火墙,而无需重新寻址任何内容怎么办?是否可以将防火墙配置为更像桥接器而不是路由器?

的确,可以。最棒的是,防火墙的规则看起来和行为方式与标准路由防火墙非常相似!所有的诀窍都在防火墙的网络配置中。

什么是桥接,确切地说?

本月的专栏假设您对网络有一定的了解。IP 防火墙,无论是标准/路由防火墙还是透明/桥接防火墙,至少都是中级主题,除非您对 TCP/IP 协议的工作原理有实际的了解,否则您真的不能指望配置任何一种防火墙。但即使您了解,您可能对桥接和路由之间的区别有点生疏。这是一个快速、简化的入门知识。

路由器在第 3 层(IP 层)运行。它们基于网络数据包的 IP 标头评估网络数据包。相比之下,桥接器在第 2 层(数据链路层,现在最常见的是以太网)运行。桥接器评估以太网标头。“交换机”只是一个具有许多端口的桥接器。

“路由”是根据数据包的目的地 IP 地址来决定如何处理数据包——具体而言,是确定将数据包传递到其目的地的最有效的“路由”(一系列转发路由器)。这些决策可能很复杂。可能有许多可能的路由,并且由于给定路由中网关之间的各个“跃点”可能会变得拥塞或速度减慢,因此数据包流的“最佳”路由可能会在单个网络事务过程中发生变化。

因此,路由器使用路由算法、路由表和转发表的组合来“动态”计算路由。但是请注意,尽管防火墙的行为路由器,但它们很少需要像真正的路由器通常那样做出如此复杂的路由决策。通常,防火墙对所有通往“内部”网络的路由使用单个网关,对所有其他(“外部”)网络使用另一个网关,其中两个网关都是实际的路由器。

相比之下,桥接要简单得多。桥接器或交换机查看进入每个桥接器/交换机端口的每个传入以太网帧,并确定其目的地以太网地址(也称为 MAC 地址)。然后,它将其与本地 MAC 表(这只是当前连接到活动端口的所有设备的 MAC 地址列表)中的条目进行匹配,并将帧传递到相应的本地端口。

有关路由器和桥接器/交换机如何工作的更完整讨论,Wikipedia 是一个不错的起点。

图 3 显示了一个透明(桥接)防火墙。在本例中,防火墙已被配置为将其两个网络接口都视为交换机端口。没有接口绑定了 IP 地址!相反,它们组成的虚拟交换机具有共享 IP 地址 44.55.66.254。虽然防火墙可能可以通过此 IP 地址访问(实际上有充分的理由这样做),但区域 A 中的主机都不需要使用该 IP 作为网关才能到达区域 B 中的主机,反之亦然。与任何其他交换机一样,防火墙将自动传播数据包,而无需显式路由通过。

Paranoid Penguin - Building a Transparent Firewall with Linux, Part I

图 3. 透明(桥接)防火墙

但是,防火墙仅在首先将其与防火墙规则集匹配并确定它是否应该传播它们之后才会传播数据包。如果您想根据以太网标头属性评估数据包,可以使用 ebtables 来执行此操作。但是,在这个关于构建您自己的透明 Linux 防火墙的系列文章中,我们将使用普通的 iptables 以与路由防火墙相同的方式评估数据包,使用 IP/TCP/UDP 标头信息。

结论

但是,那将不得不等到下次了。希望您现在了解了标准路由防火墙和透明桥接防火墙之间的区别。在我的下一篇专栏文章中,我将概述一个示例用法场景(概念上与图 3 中的网络非常相似),描述几种选择 Linux 防火墙硬件的不同方法,并开始展示如何配置透明防火墙,从桥接器/交换机设置开始。在那之前,请注意安全!

资源

Mick Bauer 的“适用于每个人的 Linux 防火墙”,LJ,2007 年 4 月:www.linuxjournal.com/article/9569

互联网新闻关于 Dejan Levaja 后来的 LAND 攻击 Windows Server 2003 和 Windows XP SP2 的报告:www.internetnews.com/security/article.php/3488171

“以太网桥接器”(Wikipedia):en.wikipedia.org/wiki/Ethernet_bridge

Mick Bauer (darth.elmo@wiremonkeys.org) 是美国最大的银行之一的网络安全架构师。他是 O'Reilly 图书Linux 服务器安全第二版(以前称为使用 Linux 构建安全服务器)的作者,偶尔在信息安全会议上发表演讲,并且是“网络工程波尔卡舞”的作曲家。

加载 Disqus 评论