Paranoid Penguin - 使用 Linux 构建透明防火墙,第二部分

作者:Mick Bauer

上个月,我开始了关于透明防火墙的系列文章,首先简要阐述了在 Web 应用程序和隧道流量时代,防火墙仍然重要的原因。我还解释了标准路由防火墙和透明桥接防火墙之间的区别。

本月,我开始讨论实际构建透明防火墙。使防火墙对网络不可见已经很酷了,但为了更添趣味,我将展示如何使用运行在廉价宽带路由器上的 OpenWrt 构建透明防火墙。让我们开始吧!

可能的拓扑

我想直接深入主题,所以这次我不会回顾太多上次的内容。现在只需说明,普通的“路由”防火墙充当其互连网络之间的 IP 网关,而“桥接”防火墙更像一个交换机——防火墙任何一侧都不需要显式地将防火墙定义为通往另一侧任何东西的路由。

其中一个重要的结果是,对于路由防火墙,连接到每个防火墙接口的网络需要位于不同的 IP 子网中。这意味着如果您在不同的网络之间插入防火墙,这些网络通常至少需要重新划分子网,如果不是完全重新分配 IP 地址。

相比之下,我们将在本系列文章中构建的桥接防火墙不需要重新配置您网络上的任何内容。最坏的情况是,您需要重新布线,将防火墙放置在您想要彼此隔离的网络部分之间的“咽喉点”。

假设您想在家用网络上使用透明防火墙来保护它免受来自互联网的攻击者侵害。在这种情况下,您可能只需要两个防火墙区域,例如“外部”(互联网)和“内部”(您的家庭网络)。可以肯定地说,大多数家庭用户将其网络中的所有设备直接通过某种 802.11 无线局域网 (WLAN) 连接到其 DSL 或有线调制解调器,可能有一两个设备连接到同一调制解调器上的以太网接口。图 1 显示了那种类型的典型家庭网络。

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

图 1. 典型的家庭网络

如果您是这样的用户,部署透明防火墙的第一步是将所有设备从 DSL/有线调制解调器上移开(当然,实际的 DSL 或有线连接除外),然后移到透明防火墙(如果它有足够的接口)、以太网交换机(如果您不需要 WLAN)、“宽带路由器”(带有内置以太网交换机的 WLAN 接入点),或这些东西的某种组合上。

当然,第二步是将透明防火墙放置在 DSL/有线调制解调器和您连接网络其余部分的任何设备(或多个设备)之间。尽管上一段列出了许多选项,但实际上只有两种方法:将网络中的所有设备连接到透明防火墙(如果您的防火墙有足够的接口并且您的网络足够小,这可能是完全可行的),或者将它们折叠回一个或多个其他网络设备,而这些设备又连接到防火墙。

图 2 显示了后一种方法。在图 2 中,两台无线笔记本电脑和一台有线网络打印机连接到一台宽带路由器,该路由器的“Internet”以太网接口通过电缆连接到透明防火墙的“内部”接口。防火墙的“外部”接口通过电缆连接到 DSL 或有线调制解调器的以太网接口。

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

图 2. 家庭网络,使用防火墙重新布线

(如果我在 20 世纪 90 年代写这篇文章,此时,我将不得不解释交叉电缆。但在现代,几乎所有以太网硬件都自动检测“交叉”与“直通”连接,您只需要普通的跳线即可。但是,如果您确实需要交叉电缆,那么它们将是图 2 中连接到防火墙的两根电缆。)

尽管我即将解释为什么以及如何使用 Linksys WRT54GL 宽带路由器作为我的透明防火墙平台(它拥有五个以太网端口和 802.11g WLAN),但为了简单起见,我将假设您至少暂时使用一个单独的网络设备,如图 2 中的宽带路由器。尽管我保留在本系列的后续文章中介绍其他拓扑的权利,但当前的Task将是构建一个简单的双接口防火墙。(为什么?主要是因为解释如何在防火墙上设置无线网络会占用太多空间。)

那么,我们的双端口透明防火墙将做什么呢?主要来说,它将保护内部网络免受来自外部世界的任意连接。在我们的“基本家庭用户”测试场景中,没有 Web 服务器、SMTP 中继或其他“堡垒主机”。(与防火墙上的 WLAN 一样,我可能会在本系列的后续文章中介绍添加“Internet DMZ”区域。)防火墙将允许大多数源自内部网络的事务,但有一些例外。

首先,也是最重要的,我们将配置防火墙以了解我们 ISP 的 DNS 服务器的 IP 地址,并且只允许向它们发出出站 DNS 查询。这将保护我们免受“DNS 重定向”攻击(但不能防御高度本地化的攻击,这些攻击将 DNS 重定向到其他内部系统,例如 WLAN 连接的攻击者的恶意 DNS 服务器与攻击者一起坐在您房子外面的面包车中的情况)。

其次,我们将强制使用本地 Web 代理,例如我在 2009 年 4 月、5 月、7 月和 8 月的Linux Journal杂志的四部分系列文章“构建安全的 Squid Web 代理”(请参阅“资源”)中逐步构建的那个。换句话说,我们的防火墙策略将只允许源自我们的 Web 代理的 IP 地址的 Web 事务访问外部世界。这将允许我们对禁止或已知的危险站点强制执行黑名单,并阻止任何可能最终渗透到我们内部网络的非代理感知恶意软件的活动。

最后,我们将限制出站 SMTP 电子邮件流量到我们 ISP 的 SMTP 服务器,阻止任何发往其他地方的 SMTP。这也将为防范恶意软件活动提供一个小小的保障。

您可能会想,为什么不为了简单起见而允许所有内部发起的流量通过呢?这是一个有效的选项,并且相当流行。但是,这与 Ranum 的格言相矛盾:凡未明确允许的,均被拒绝。换句话说,假设意外情况也是不可取的。

这个格言背后有一些简单的数学道理。恶意流量可以采取无限多种不同的形式。“已知良好”的流量,对于大多数组织来说,往往构成一个可管理的短列表。如果您只允许您期望的事务,并且如果您在识别和预测您应该期望的一切方面做了功课,那么其他事务是不必要的,恶意的或两者兼而有之。

而且,内部本应“受信任”的东西,什么会导致意外的事务呢?从统计学上讲,可能是恶意软件——蠕虫、木马和病毒。蠕虫在网络中自我传播,因此根据定义,它们会产生大量流量。木马和病毒不会自我传播,但当它们在受害者系统上登陆(通常来自电子邮件附件、恶意网站或隐藏在用户被诱骗安装的某些其他应用程序中)后,它们通常会“打电话回家”,以便恶意软件的作者可以从远处控制受感染的系统。

传统上,用于垃圾邮件传播和分布式拒绝服务 (DDoS) 攻击的僵尸网络代理使用 IRC 协议进行命令和控制功能。仅凭这一点就足以阻止所有出站 IRC,但由于 IRC 几乎可以使用任何 TCP 或 UDP 端口,因此仅仅阻止 TCP/UDP 端口 194、529 和 994(其“分配的”端口)是不够的。此外,恶意软件可以同样容易地使用一些非 IRC 协议,再次通过完全任意的端口。

如果恶意软件作者足够聪明,可以预料到可能的防火墙限制,以至于他们的代码检查受感染系统的本地 SMTP 和 Web 代理设置怎么办?如果该恶意软件尝试与您的 Web 代理黑名单上的某些“已知恶意”站点发起 Web 事务,您仍然可以阻止它。无论如何,安全永远不是绝对的。良好的安全性涉及采取合理的措施,以最大限度地增加攻击者为了成功而必须付出的努力。可悲的是,攻击者总是能够通过足够的努力、内部信息和运气来成功。(好消息是大多数攻击者都是机会主义者和懒惰的!)

因此,我们的防火墙不会允许我们在保持内部系统完全打补丁、教育我们的用户不要安装来自不受信任来源的软件或访问潜在的恶意网站等方面偷懒。但它在我们的“安全洋葱”中提供一个重要的层次,这将使我们的网络对于针对我们 ISP 进行大规模端口扫描的攻击者来说不那么明显,并且它将使任何确实溜进去的异常情况更难连接回去。

关于我们的防火墙设计,我现在要说的最后一件事是我们不必担心网络地址转换 (NAT) 或 DHCP。事实上,这是透明防火墙的好处之一!之前提供 NAT 和 DHCP 服务(可能是 DSL 或有线调制解调器,在我们的家庭使用场景中)的任何设备都可以继续这样做,如果我们正确放置防火墙,NAT 和 DHCP 应该会像以前一样继续工作。

硬件考虑因素

现在您了解了防火墙设置之前和之后的样子,让我们来谈谈防火墙硬件。本系列文章不是我第一次尝试使用透明 Linux 防火墙。多年前,当我开始研究被动网络监控时,我设置了几台“白盒”PC,每台 PC 都有多个网络接口,可以透明地监控和限制网络流量。

当我开始研究这个新系列时,我的第一个想法是恢复其中一个旧系统或构建一个新的系统。然而,这似乎是在浪费电力。对于通常由优化的网络设备处理的事情,为什么要处理机箱和 CPU 风扇、硬盘驱动器等等呢?

这种思路让我产生了工业/嵌入式平台的想法——运行 Atom 或 ARM 处理器的小型无盘计算机。但是这些平台的成本,尤其是具有多个网络接口的型号,与 PC 类似,我想尽可能少花钱。

然后我突然意识到,这正是 OpenWrt 设计的目的!如果您不熟悉 OpenWrt,它是一个免费的 Linux 发行版,旨在在商用 WLAN 网关和宽带路由器(例如 Linksys 著名的 WRT54G 系列)上运行。一方面,我对在本系列中介绍 WLAN 防火墙不太感兴趣(尽管一旦正确配置,具有 WLAN 接口的防火墙可以像对待任何其他网络接口一样对待它)。但另一方面,WRT54G 基本上是一台小型计算机,具有五个网络接口和 WLAN。撇开小内存和慢速 CPU 不谈,它应该是一个理想的 Linux 防火墙平台。

这就是我最终选择 Linksys WRT54GL wireless-G 宽带路由器的原因,它只花了我 58 美元,作为我的透明 Linux 防火墙实验的测试平台。它的性能和可扩展性如何,稳定性如何?时间会证明一切。我猜简短的答案是“对于家庭使用来说足够好,但还不足以用于财富 500 强企业”。此外,它是亮蓝色的,便宜又酷。

如果这种硬件折腾不是您的菜,我希望您仍然可以继续关注本系列,因为我们在构建透明防火墙示例时使用的大部分真正的 iptables 魔法都适用于任何具有多个网络接口的 Linux 系统。

关于硬件选择的最后一点说明。作为 Linux 防火墙平台,笔记本电脑在成本和功耗方面是宽带路由器和台式 PC 之间的一个很好的中间地带,并且您可以通过 USB 轻松地向其添加网络接口。虽然即使是二手笔记本电脑也比 OpenWrt 兼容的宽带路由器贵,但它将能够运行几乎任何主流 Linux 发行版,让您可以访问比您可以在 OpenWrt 上运行的软件更广泛的范围。

如果您选择笔记本电脑方法,请务必选择支持 USB 2.0 的 USB 以太网接口(这对于任何接近可接受性能的设备来说都是必要的——USB 2.0 的运行速度为 480Mbps,但 USB 1.1 只有 12Mbps,而 1.0 只有微不足道的 1.5Mbps!),当然,还要确保它们与 Linux 兼容!

我使用 D-Link DUB-E100,USB 2.0,快速以太网 (100Mbps) 接口,效果很好。Linux 通过 usbnet 和 asix 内核模块支持它。(我的 Ubuntu 系统自动检测到我的 DUB-E100 接口并加载这两个模块。)

在 Linksys WRT54GL 上安装 OpenWrt

回到我的 OpenWrt 冒险之旅,请允许我再写几段(加上下个月的几段),然后再着手进行适当的防火墙配置。选择与 OpenWrt 一起使用的硬件的第一步是查阅 OpenWrt 网站,以查看当前版本的 OpenWrt 支持哪些硬件(请参阅“资源”)。

如果您选择 Linksys 设备(考虑到 OpenWrt 项目始于 Linksys WRT54G 产品线,这可能是一个不错的选择),请务必选择型号编号以 L 结尾的型号,这表示“与 Linux 兼容”。正如我之前提到的,我选择了 Linksys WRT54GL,在撰写本文时,它仍然可以从各种在线零售商处购买。

OpenWrt 硬件表提供了指向其他 OpenWrt 页面的链接,这些页面提供了在每个受支持设备上安装和配置 OpenWrt 的详细说明。对于我的 Linksys WRT54GL,我按照以下步骤安装了 OpenWrt

1. 我从 OpenWrt 网站 (downloads.openwrt.org/kamikaze/8.09.2/brcm-2.4) 下载了镜像文件 openwrt-wrt54g-squashfs.bin。

2. 我打开了 WRT54GL 的电源,它带有出厂安装的固件。

3. 我通过在连接到 WRT54GL 的以太网端口之一(而不是其“Internet”端口)的笔记本电脑的浏览器中输入 URL http://192.168.1.1/Upgrade.asp 连接到 WRT54GL。请注意,我的笔记本电脑的网络接口配置为使用 DHCP,实际上是通过 DHCP 从 WRT54GL 获取其 IP 地址。因此,它被分配了一个 IP 地址,该地址位于 WRT54GL 默认使用的子网 192.168.1.0/24 中。

4. 我使用文件 openwrt-54g-squashfs.bin “升级”了 WRT54GL 的固件,并等待了几分钟,以便上传完成并让 WRT54GL 使用新固件重新启动。

5. 最后,在我的笔记本电脑上,我运行了命令telnet 192.168.1.1以连接到 WRT54GL,我收到了以下消息和提示符

=== IMPORTANT ============================
 Use 'passwd' to set your login password
 this will disable telnet and enable SSH
------------------------------------------


BusyBox v1.11.2 (2009-12-02 06:19:32 UTC) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 KAMIKAZE (8.09.2, r18961) -------------------------
  * 10 oz Vodka       Shake well with ice and strain
  * 10 oz Triple sec  mixture into 10 shot glasses.
  * 10 oz lime juice  Salute!
 ---------------------------------------------------
root@OpenWrt:/#

成功!我不仅成功地将我的廉价宽带路由器变成了具有五个以太网接口的 Linux 计算机,我还学会了一种令人耳目一新的鸡尾酒 Kamikaze 的配方。环顾四周,我很高兴地发现了一个相当普通的 Linux 环境。

唯一缺少的是 Linux 2.6 内核。在继续将这个蓝色小野兽变成防火墙之前,我还有一项任务——升级其内核。根据 OpenWrt Wiki,您只能在首先安装 2.4 内核(我刚刚完成)并通过 telnet 更改一些 NVRAM 设置后才能这样做

root@OpenWrt:/# nvram set boot_wait=on
root@OpenWrt:/# nvram set boot_time=10
root@OpenWrt:/# nvram commit && reboot

完成此操作后,在我的笔记本电脑上,我从 downloads.openwrt.org/backfire/10.03/brcm47xx 下载了最新 Backfire 版本的 OpenWrt(在撰写本文时为 v. 10.03)。我为我的 WRT54GL 下载的文件是 openwrt-wrt54g-squashfs.bin。

为了将其刷入我的 WRT54GL,我在我的 Windows 笔记本电脑上打开了一个命令窗口,导航到我刚刚下载新固件镜像的目录,并且在尚未按 Enter 键的情况下,输入了以下命令

tftp -i 192.168.1.1 PUT openwrt-wrt54g-squashfs.bin

在按 Enter 键之前,我拔掉了我的 WRT54GL 的电源,等待了几秒钟,重新插上电源,然后在我的 Windows 笔记本电脑的命令窗口中立即按 Enter 键以执行该 tftp 命令。几秒钟后,我收到了“传输成功”消息。路由器解压缩了新的固件镜像,并重新启动到 Backfire。当我 telnet 回到路由器时,我收到了一个新的横幅

BusyBox v1.15.3 (2010-04-06 04:08:20 CEST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

  _______                     ________        __
 |       |.-----.-----.-----.|  |  |  |.----.|  |_
 |   -   ||  _  |  -__|     ||  |  |  ||   _||   _|
 |_______||   __|_____|__|__||________||__|  |____|
          |__| W I R E L E S S   F R E E D O M
 Backfire (10.03, r20728) --------------------------
  * 1/3 shot Kahlua    In a shot glass, layer Kahlua
  * 1/3 shot Bailey's  on the bottom, then Bailey's,
  * 1/3 shot Vodka     then Vodka.
 ---------------------------------------------------
root@OpenWrt:/# which tftp

再次,成功!现在,我的 WRT54GL 宽带路由器不仅在运行 Linux,而且还在运行相当新的 2.6 内核。我绝对准备好开始配置这台机器以执行其新的隐形防火墙职责。

结论

但是,这个月我只能带您到这里。下次,我将开始展示如何在我们的透明防火墙上配置网络、桥接,当然还有 iptables。

如果您迫不及待想等到那时,请访问 OpenWrt 主页了解更多信息,或者如果您真的有冒险精神,请在 Web 上搜索有关使用 OpenWrt 创建透明防火墙的其他教程。但是,如果我这么说,我们有了一个良好的开端!

资源

OpenWrt 项目主页:www.openwrt.org

OpenWrt 的(受支持)硬件表:oldwiki.openwrt.org/TableOfHardware.html

Mick Bauer 的“构建安全的 Squid Web 代理,第一部分”,LJ,2009 年 4 月:www.linuxjournal.com/article/10407

Mick Bauer 的“构建安全的 Squid Web 代理,第二部分”,LJ,2009 年 5 月:www.linuxjournal.com/article/10433

Mick Bauer 的“构建安全的 Squid Web 代理,第三部分”,LJ,2009 年 7 月:www.linuxjournal.com/article/10488

Mick Bauer 的“构建安全的 Squid Web 代理,第四部分”,LJ,2009 年 8 月:www.linuxjournal.com/article/10513

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

加载 Disqus 评论