![将数据包转发到同一网络中的另一台主机](https://linux22.com/image/675133/%E5%B0%86%E6%95%B0%E6%8D%AE%E5%8C%85%E8%BD%AC%E5%8F%91%E5%88%B0%E5%90%8C%E4%B8%80%E7%BD%91%E7%BB%9C%E4%B8%AD%E7%9A%84%E5%8F%A6%E4%B8%80%E5%8F%B0%E4%B8%BB%E6%9C%BA.png)
我在同一个子网中有 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
一般来说,为了实现这一点,您需要执行以下操作:
确保主机
C
将接收数据包,例如通过使用 tcpdump 或接口上的其他 pcap 程序在接口上捕获数据包。您必须确保数据包将被传送到主机
C
。这取决于所使用的链路层。假设每个主机都有以太网和 1 个 NIC 接口:- 如果您使用带有集线器或正确配置的交换机的以太网,那么数据包就可以直接广播到两个端口。
- 如果你使用带有 MAC 表的以太网交换机,则必须在主机上更改目标 MAC 地址
B
,否则交换机将不会将数据包路由到C
- 例如,在使用 Wi-Fi 的情况下,由于它充当集线器,因此两台电脑上的 MAC 地址和 IP 地址都可以相同
- 那么,就有两个选择:
- 主机
B
应该接收该数据包,并创建它的副本,或者 - 主机
B
应该只将数据包转发到主机C
(在这种情况下,主机C
充当主机数据包转发的默认网关B
,其中主机B
充当路由器)
- 主机
由于您的原始问题并不假设数据包实际上会被主机接收B
而只是转发到主机,因此C
我将在主机上执行以下操作B
:
- 允许数据包转发
sysctl -w net.ipv4.ip_forward=1
- 例如,在 ID 为 100 的单独表中创建一条规则来路由此数据包
ip rule add to 192.168.0.2 lookup 100
- 在 ID 为 100 的表中添加数据包应该去往的默认网关:链接到的接口名称在
ip route add default via 192.168.0.3 dev ethXXX
哪里ethXXX
C
但是,这会在主机上产生一个循环B
,只有用完才能解决TTL
,并且会在网络上产生过载。这是我实现此目的的最简单的方法。
最好有一个正确配置的交换机,或者一个单独的主机链接B->C
来发送这些数据包。在单接口和未配置的交换机情况下,除非您使用 pcap 编写专门的软件,否则您总是会导致循环,并且无论如何您都必须通过假装已配置 IP 地址来欺骗交换机。