将数据包转发到同一网络中的另一台主机

将数据包转发到同一网络中的另一台主机

我在同一个子网中有 3 个主机,每个主机都有一个网络接口:

A: 192.168.0.1/24
B: 192.168.0.2/24
C: 192.168.0.3/24

在主机 A 上,我只需 ping 主机 B 一次。这应该会生成一个数据包 (A->B) 并发送给 B。B 可以正常接收该数据包。

现在,当 B 收到来自 A 的数据包时,我如何才能将同一个数据包 (A->B) 重新转发到主机 C,而不更改任何源或目标 IP?
即,我实际上希望主机 C 以 (A->B) 而不是 (A->C) 或 (B->C) 接收数据包

非常感谢,

答案1

是的,可以在将数据包再次发送到网络之前更新源和目标 MAC 地址,但保持 IP 地址不变。

一些基于 DSR 的负载均衡器采用了这一原则。引用HAProxy 博客文章

在 DSR 模式下,负载均衡器将数据包路由到后端,而不会改变其中的任何内容,但会改变目标 MAC 地址。

答案2

如果这是 Linux,我可能会建议研究预路由和后路由。查看手册页,这应该是一个开始。

如果这是一个应用程序,则根据您的协议,使用最终目标 IP 创建您自己的自定义数据包(我必须这样做)。

希望这可以帮助!

答案3

一般来说,为了实现这一点,您需要执行以下操作:

  1. 确保主机C将接收数据包,例如通过使用 tcpdump 或接口上的其他 pcap 程序在接口上捕获数据包。

  2. 您必须确保数据包将被传送到主机C。这取决于所使用的链路层。假设每个主机都有以太网和 1 个 NIC 接口:

    1. 如果您使用带有集线器或正确配置的交换机的以太网,那么数据包就可以直接广播到两个端口。
    2. 如果你使用带有 MAC 表的以太网交换机,则必须在主机上更改目标 MAC 地址B,否则交换机将不会将数据包路由到C
    3. 例如,在使用 Wi-Fi 的情况下,由于它充当集线器,因此两台电脑上的 MAC 地址和 IP 地址都可以相同
  3. 那么,就有两个选择:
    1. 主机B应该接收该数据包,并创建它的副本,或者
    2. 主机B应该只将数据包转发到主机C(在这种情况下,主机C充当主机数据包转发的默认网关B,其中主机B充当路由器)

由于您的原始问题并不假设数据包实际上会被主机接收B而只是转发到主机,因此C我将在主机上执行以下操作B

  1. 允许数据包转发sysctl -w net.ipv4.ip_forward=1
  2. 例如,在 ID 为 100 的单独表中创建一条规则来路由此数据包ip rule add to 192.168.0.2 lookup 100
  3. 在 ID 为 100 的表中添加数据包应该去往的默认网关:链接到的接口名称在ip route add default via 192.168.0.3 dev ethXXX哪里ethXXXC

但是,这会在主机上产生一个循环B,只有用完才能解决TTL,并且会在网络上产生过载。这是我实现此目的的最简单的方法。

最好有一个正确配置的交换机,或者一个单独的主机链接B->C来发送这些数据包。在单接口和未配置的交换机情况下,除非您使用 pcap 编写专门的软件,否则您总是会导致循环,并且无论如何您都必须通过假装已配置 IP 地址来欺骗交换机。

相关内容