代理 ARP 实际上仅用于将数据包从网络 1 传输到网络 0。要将数据包反向传输,则采用正常的 IP 路由功能。
在我的例子中,网络 1 具有 8 位子网掩码 (255.255.255.0)。我为网络 0 选择的子网掩码为 4 位 (255.255.255.240),允许网络 0 上有 14 个 IP 节点(2 ^ 4 = 16,减去全零和全一两种情况)。请注意,此处允许任何大小的子网掩码,但不能包括另一个网络的掩码大小(例如,在本例中为 2、3、4、5、6 或 7 位 - 对于一位,只需使用正常的代理 ARP!)。
网络 0 的所有 IP 地址(总共 16 个)在网络 1 中都显示为子集。请注意,在这种情况下,绝对不允许任何直接连接到网络 1 的机器拥有此范围内的 IP 地址!在我的例子中,我“保留”了网络 1 中以 64 .. 79 结尾的 IP 地址用于网络 0。在这种情况下,以 64 和 79 结尾的 IP 地址实际上不能被节点使用 - 79 是网络 0 的广播地址。
机器 A 被分配了两个 IP 地址,一个在网络 0 范围内,用于其真实的以太网接口 (eth0),另一个在网络 1 范围内,但在网络 0 范围之外,用于无线以太网接口 (eth1)。
假设机器 C(在网络 1 上)想要向机器 B(在网络 0 上)发送数据包。由于机器 B 的 IP 地址使机器 C 看起来好像它在同一个物理网络上,因此机器 C 将使用地址解析协议 (ARP) 在网络 1 上发送广播消息,请求具有机器 B IP 地址的机器响应其硬件(以太网或 MAC 层)地址。机器 B 不会看到此请求,因为它实际上不在网络 1 上,但同时位于两个网络上的机器 A 会看到它。
现在,第一个神奇之处发生了,机器 A 上配置正确的代理 ARP 子网划分条目的 Linux 内核 arp 代码确定 ARP 请求来自网络 1 接口 (eth1),并且正在 ARP 的 IP 地址在网络 0 的子网范围内。然后,机器 A 将其自身的硬件(以太网)地址作为 ARP 响应数据包发回给机器 C。
然后,机器 C 使用机器 A 的硬件(以太网)地址(在本例中为无线以太网接口)更新其机器 B 的 ARP 缓存条目。现在,机器 C 可以将发往机器 B 的数据包发送到此硬件(以太网)地址,并且机器 A 接收到该数据包。
机器 A 注意到数据包中的目标 IP 地址是机器 B 的 IP 地址,而不是它自己的。机器 A 的 Linux 内核 IP 路由代码尝试通过查看其路由表来转发数据包到机器 B,以确定哪个接口包含机器 B 的网络号。但是,机器 B 的 IP 地址对于网络 0 接口 (eth0) 和网络 1 接口 (eth1) 都是有效的。
此时,另一个巧妙之处发生了。由于网络 0 接口的子网掩码具有更多 1 位(它更具体),因此 Linux 内核路由代码会将机器 B 的 IP 地址与网络 0 接口匹配,而不会继续查找与网络 1 接口(数据包传入的接口)的潜在匹配。
现在,机器 A 需要找出机器 B 的“真实”硬件(以太网)地址(假设它在 ARP 缓存中尚未拥有该地址)。机器 A 使用 ARP 请求,但这次 Linux 内核 arp 代码注意到该请求不是来自网络 1 接口 (eth1),因此不会使用 eth1 的代理地址进行响应。相反,它在网络 0 接口 (eth0) 上发送 ARP 请求,机器 B 将在网络 0 接口上看到该请求,并响应其自身的(真实)硬件(以太网)地址。现在,机器 A 可以将(来自机器 C 的)数据包发送到机器 B。
机器 B 从机器 C(通过机器 A)接收到数据包,然后想要发回响应。这次,机器 B 注意到机器 C 在不同的子网上(机器 B 的子网掩码 255.255.255.240 排除了所有不在网络 0 IP 地址范围内的机器)。机器 B 设置了指向机器 A 的网络 0 IP 地址的“默认”路由,并将数据包发送到机器 A。这次,机器 A 的 Linux 内核路由代码确定目标 IP 地址(机器 C 的地址)位于网络 1 上,并通过以太网接口 eth1 将数据包发送到机器 C。
对于源自和发往两个网络上其他机器的机器 A 的数据包,也会发生类似(但不太复杂)的事情。
同样,应该很明显,如果网络 0 上的另一台机器 (D) 为机器 B 发起 ARP 请求,机器 A 将在其网络 0 接口 (eth0) 上接收到 ARP 请求,并且不会响应此请求,因为它被设置为仅在其网络 1 接口 (eth1) 上进行代理。
另请注意,机器 B 和 C(以及 D)都不需要做任何不寻常的 IP 设置。在我的例子中,网络 0 上混合使用了 Suns、Macs 和 PC/Windoze 95 机器,它们都通过 Linux 机器 A 连接到世界其他地方。
最后,请注意,一旦机器 A、B、C(和 D)中的每一台机器都发现了硬件(以太网)地址,它们就会被放置在 ARP 缓存中,随后的数据包传输将无需 ARP 开销。ARP 缓存通常在 5 分钟不活动后过期条目。