2

我有一个 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 数据传输回来。如果我在这里遗漏了什么,请告诉我。再次非常感谢您的帮助。

4

1 回答 1

1

您的 udp 数据包也将被路由到您的 tuntap 接口。(好吧,根据某些设置,它们可能会被丢弃)。您需要为发送它们的 udp 对等方添加路由规则、主机规则或不会干扰其他通信的较小网络规则。

于 2011-04-27T05:13:35.100 回答