透明防火墙技术

作者:Federico

在处理防火墙时,最困难的问题之一是我们想要保护的网络或子网通常必须分成至少两个子网:一个在外部,一个在内部受保护侧。除了规划阶段外,这可能导致网络中所有机器都需要重新配置以适应新的配置。更糟糕的是,如果防火墙发生硬件故障,您将不得不重新配置网络中的所有机器,以便它们能够看到外部网络,直到您修复防火墙机器。如果您无法访问实际将您的网络连接到外部世界的机器(通常是路由器或从电信公司租用的设备)的配置,则防火墙的配置可能会更加困难。

我们将解释一种更智能的方式,将防火墙添加到您的网络中,而无需将其分成子网或重新配置内部或外部网络上的任何机器(防火墙机器本身除外),只需欺骗其他机器,让它们认为没有任何改变。我们将介绍网络配置和数据包路由的方面,而不是真正的数据包过滤防火墙技术,因为这已经在另一期 Linux Journal 中深入讨论过(请参阅“资源”)。

需求和假设

在实际示例中,我们将假设我们有一个 C 类网络,其中我们与外部网络的联系是网络中的 .1 机器(可以是路由器、机器或其他任何东西)。我们将假设 IP 地址 .2 和 .3 可供我们使用。我们还需要另一个大于或等于 .4 的 IP,因此我们必须确保这些 IP 没有用于其他目的。当然,对于不同的网络配置,您需要调整一些计算,使该方法适合您的需求。为了使以下示例更清晰,让我们将我们的 C 类网络固定为 1.2.3.0。

至于将用作防火墙的 Linux 机器,您实际上必须编译带有常用网络选项的内核,包括 IP 转发和 IP 防火墙技术以及您可能需要的任何其他选项,例如 IP 记帐。此外,在内核中启用 IP 转发;在较新的内核中,这可以通过直接在 /proc 文件系统中启用它来完成。(例如,通过使用 echo 1>/proc/sys/net/ipv4/ip_forward。您的初始化脚本应该负责处理这个问题。)另一件需要注意的是,您应该在系统上安装一个可用的 arp 程序。实际上,某些发行版附带的 arp 二进制文件是在没有新的 SIOCSARP 内核接口的情况下编译的,因此它不起作用,如果您忘记检查这一点,可能会给您带来许多不必要的麻烦。

Linux 机器必须安装两张以太网卡:eth0,连接到内部网络;eth1,直接连接到我们网络通往外部世界的网关机器。

网络配置

现在,必须配置防火墙机器上的网络接口。内部网络接口的配置方式将与其他内部机器相同,就好像它拥有网络上的所有机器一样。因此,在我们的 C 类示例中,eth0 配置将如下所示

inet addr :  1.2.3.4
network   :  1.2.3.0
broadcast :  1.2.3.255
netmask   :  255.255.255.0

请记住,您可以使用任何其他未使用的地址来代替 1.2.3.4。执行此操作的命令是

ifconfig eth0 1.2.3.4 netmask 255.255.255.0\
   broadcast 1.2.3.255
route add -net 1.2.3.0
此配置也将应用于防火墙后面的内部网络中的所有机器;当然,每台机器上的 IP 地址都会更改。

第二个网络接口 eth1 将被配置为好像它有一个非常小的网络;实际上,四个 IP 是我们可以管理的最小值。这将是放置防火墙机器和网关的地方。

inet addr :  1.2.3.2
network   :  1.2.3.0
broadcast :  1.2.3.3
netmask   :  255.255.255.252

这可以通过使用以下命令获得

ifconfig eth1 1.2.3.2 netmask 255.255.255.252\
   broadcast 1.2.3.3
route add -net 1.2.3.0
route add default gw 1.2.3.1
现在路由表已设置,以便将整个 C 类网络的数据包重定向到内部 eth0 接口,而将小网络的数据包路由到外部 eth1 接口。最后,必须为内部网络上的所有机器设置默认网关,即 1.2.3.1。请注意,此路由方案有效,因为最具体的路由首先应用。

还有两个问题需要解决。首先,网关如何知道如何到达内部机器?请记住,我们没有更改网关配置,因此它仍然认为它连接了 C 类网络。其次,机器如何能够到达网关?毕竟,它们仍然认为它们的网络接口上有整个 C 类网络,包括 1.2.3.1。好吧,这很容易;我们只是让所有机器都认为它们在 C 类网络上。诀窍是破解将 IP 地址转换为硬件(在我们的例子中是以太网)地址的过程,这称为 ARP(地址解析协议)。(如果您不熟悉这一点,请查阅 NET-HOWTO 和 Proxy-ARP miniHOWTO。)这可以很容易地通过告诉我们的防火墙机器来完成,让它应答内部网络上针对网关的所有 ARP 请求,并回复来自网关的对任何内部机器的所有请求。实际上,这分两个阶段完成。首先,通过 arp 在内部网络上发布网关和防火墙机器,更准确地说

arp -v -i eth0 -Ds 1.2.3.1 eth0 pub
arp -v -i eth0 -Ds 1.2.3.2 eth0 pub

因此,当有人在内部网络上请求 .1 或 .2 时,防火墙将回复,给出其以太网硬件地址。在第二阶段,我们将在防火墙-网关小网络上发布从 .4 到 .255 的所有内部网络 IP。对于整个 C 类网络,它看起来像这样

arp -v -i eth1 -Ds 1.2.3.128 eth1 netmask\
   255.255.255.128 pub
arp -v -i eth1 -Ds 1.2.3.64 eth1 netmask\
   255.255.255.192
pub
arp -v -i eth1 -Ds 1.2.3.32 eth1 netmask\
   255.255.255.224 pub
arp -v -i eth1 -Ds 1.2.3.16 eth1 netmask\
   255.255.255.240
pub
arp -v -i eth1 -Ds 1.2.3.8 eth1 netmask\
   255.255.255.248
pub
arp -v -i eth1 -Ds 1.2.3.4 eth1 netmask\
   255.255.255.252 pub
这样,我们划分了地址空间并发布了我们所有的 IP。当网关询问内部机器的硬件地址时,防火墙将回复给出其地址。由于我们启用了 IP 数据包转发,一旦防火墙收到数据包并回复 ARP 请求,它将根据路由表将其转发到目标机器。

事实证明,此解决方案对我们非常有用,尤其是在我们必须增强现有网络而又不想引起“太多麻烦”时。当然,最后一步是在 Linux 机器上调整防火墙、IP 记帐、透明代理或您需要的任何东西——但那是另一个故事了。

资源

Federico 在乌迪内大学学习计算机科学。在不进行黑客攻击或编程时,他喜欢阅读科幻小说、听音乐和弹吉他。可以通过 drzeus@infis.univ.ts.it 与他联系。

Christian Pellegrin 在的里雅斯特大学学习天体物理学,并在高中兼职担任系统管理员和教师。当不玩 Linux 和其他有趣的软件或硬件时,他喜欢与女友讨论谁是有史以来最好的电影导演。欢迎发送电子邮件至 chri@infis.univ.ts.it

加载 Disqus 评论