16.3. 使用 Proxy-ARP 的伪桥接

如果你只想实现伪桥接,请跳过几节到“实现它”部分,但明智的做法是先了解一下它的实际工作原理。

伪桥接的工作方式略有不同。 默认情况下,桥接器将数据包从一个接口原封不动地传递到另一个接口。 它只查看数据包的硬件地址来确定数据包的去向。 这反过来意味着你可以桥接 Linux 不理解的流量,只要它有硬件地址即可。

“伪桥接”的工作方式不同,它更像是一个隐藏的路由器而不是桥接器,但与桥接器一样,它对网络设计的影响很小。

它不是桥接器的优点在于数据包实际上是通过内核传递的,因此可以被过滤、更改、重定向或重新路由。

真正的桥接器也可以实现这些功能,但它需要特殊的代码,例如以太网帧分流器或上面提到的补丁。

伪桥接的另一个优点是它不会传递它不理解的数据包 - 从而清理网络中大量的垃圾数据。 如果你需要这些垃圾数据(例如 SAP 数据包或 Netbeui),请使用真正的桥接器。

16.3.1. ARP 和 Proxy-ARP

当一台主机想要与同一物理网段上的另一台主机通信时,它会发送一个地址解析协议数据包,该数据包经过简化后,内容类似于“谁拥有 10.0.0.1,告诉 10.0.0.7”。 作为回应,10.0.0.1 会回复一个简短的“我在这里”数据包。

然后 10.0.0.7 将数据包发送到“我在这里”数据包中提到的硬件地址。 它会将此硬件地址缓存相对较长的时间,并且在缓存过期后,它会重新询问该问题。

在构建伪桥接时,我们指示桥接器回复这些 ARP 数据包,这会导致网络中的主机将其数据包发送到桥接器。 然后桥接器处理这些数据包,并将它们发送到相关的接口。

简而言之,每当桥接器一侧的主机请求另一侧主机的硬件地址时,桥接器都会回复一个数据包,内容为“交给我”。

这样,所有数据流量都会传输到正确的位置,并始终通过桥接器。

16.3.2. 实现它

在过去的日子里,可以指示 Linux 内核为任何子网执行“proxy-ARP”。 因此,要配置伪桥接,您必须指定桥接器两侧的正确路由,并创建匹配的 proxy-ARP 规则。 这样做很糟糕,因为它需要大量输入,而且还因为它很容易让您犯错误,使您的桥接器响应它不知道如何路由的网络的 ARP 查询。

在 Linux 2.4/2.5(以及可能 2.2)中,此功能已被撤销,并被 /proc 目录中名为“proxy_arp”的标志所取代。 然后,构建伪桥接的步骤是

  1. 为两个接口分配 IP 地址,即“左”接口和“右”接口

  2. 创建路由,以便您的机器知道哪些主机位于左侧,哪些位于右侧

  3. 在两个接口上启用 proxy-ARP,echo 1 > /proc/sys/net/ipv4/conf/ethL/proxy_arp, echo 1 > /proc/sys/net/ipv4/conf/ethR/proxy_arp,其中 L 和 R 代表您的左右两侧接口的编号

另外,不要忘记打开 ip_forwarding 标志! 从真桥接转换时,您可能会发现此标志已关闭,因为它在桥接时不需要。

转换时您可能需要注意的另一件事是,您需要清除网络中计算机的 arp 缓存 - arp 缓存可能包含旧的、桥接前的硬件地址,这些地址已不再正确。

在 Cisco 上,这可以使用命令“clear arp-cache”完成,在 Linux 下,使用“arp -d ip.address”。 您也可以手动等待缓存过期,这可能需要相当长的时间。

您可以使用出色的“arping”工具来加速此过程,该工具在许多发行版中是“iputils”软件包的一部分。 使用“arping”,您可以发送未经请求的 ARP 消息,以便更新远程 arp 缓存。

这是一项非常强大的技术,也被“黑帽”用于破坏您的路由!

Note

在 Linux 2.4 上,您可能需要执行“echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind”才能发送未经请求的 ARP 消息!

如果您过去/现在习惯于在指定路由时不使用子网掩码,您可能还会发现您的网络配置错误。 解释一下,某些版本的 route 可能过去猜对了您的子网掩码,或者猜错了但您没有注意到。 当执行如上所述的精细路由时,检查您的子网掩码 *至关重要*!