我有一个 tun/tap 设备,用于从一个接口读取传入的数据包,并通过另一个接口将它们作为 UDP 数据包发送。我可以实现这一点,可以读取发送到 tun/tap 接口的 ICMP 包,还可以使用 UDP 远程获取它们。但是当我尝试将输入接口的默认网关更改为 tun/tap 设备时,就会出现问题,以便我可以从 tun/tap 读取所有传入数据。完成后,由于路由不正确,我无法发送 UDP 数据包。
我还向您尝试了套接字通信中的“SO_BINDTODEVICE”选项,但仍然没有用。请注意,我没有在 tun/tap 中使用 write() 方法。我只是使用了 read() 函数,收集数据并通过 UDP 套接字通信发送它们。
请让我知道我的方法是否错误或任何其他解决方法来克服这个问题。谢谢。
/********More Details********/
谢谢罗布。
我想要实现的是在高延迟通道中模拟基于 IP 的标头通信(ROHC)。
为此,我有 4 个虚拟机。VM1 是一台普通的台式机。VM2 是一个网关,它使用 tun/tap(来自 VM1)获取数据包,并与 VM4 进行基于 UDP 的通信。VM3 是可以设置延迟、错误率等参数的通道。VM4 连接到 WAN。VM1 中的用户应该能够像平常一样浏览 WAN。请找到下面的图表。
IP Packets
|
| +------------------+ +--------------+ +----------------+
'---|eth1..... | | | | |
| | | | | | |
| tun/tap | | eth0|___|UDP Sock eth0|___
| | | | | | | | | |
| ..UDP Sock|_____|eth1 | | | | | |
| | | | | +tun/tap+ | '
+------------------+ +--------------+ +----------------+ WAN
VM2 VM3(Channel) VM4
更新:
谢谢汤米。你的解决方案奏效了。我可以通过一种方式将 UDP 数据包传送到最终的 NAT 网关。但是直到现在我都无法找到相反的工作方式。我尝试使用 iptables 启用伪装,并在 VM1 上设置到 tuntap 的主机路由,但它不起作用。我对此有一些疑问。1) 在 VM4 中,我接收 UDP 数据并写入 tun/tap。这将由内核路由到 WAN。但是对于传入的数据包,我是否需要再次使用 tun/tap 读取?在这种情况下,我是否需要在不同的线程中进行读写?我问这个是因为我需要将它们也作为 UDP 数据传输回来。如果我在这里遗漏了什么,请告诉我。再次非常感谢您的帮助。