Sockets 使用TUN/TAP读取传入数据,封装为UDP并传输
我有一个tun/tap设备,用于从一个接口读取传入的数据包,并通过另一个接口将其作为UDP数据包发送。我可以实现这一点,可以读取发送到tun/tap接口的ICMP pakcets,还可以使用UDP远程获取它们。但是,当我尝试将输入接口的默认网关更改为tun/tap设备,以便可以从tun/tap读取所有传入数据时,就会出现问题。完成后,我无法发送UDP数据包,因为路由不正确 我还尝试在socket comm中为您提供“SO_BINDTODEVICE”选项,但仍然不起作用。请注意,我没有在tun/tap中使用write()方法。我只是使用read()函数,收集数据并通过UDP套接字通信发送 请让我知道,如果我的方法是错误的或任何其他工作来克服这一点。谢谢Sockets 使用TUN/TAP读取传入数据,封装为UDP并传输,sockets,networking,network-programming,udp,tunnel,Sockets,Networking,Network Programming,Udp,Tunnel,我有一个tun/tap设备,用于从一个接口读取传入的数据包,并通过另一个接口将其作为UDP数据包发送。我可以实现这一点,可以读取发送到tun/tap接口的ICMP pakcets,还可以使用UDP远程获取它们。但是,当我尝试将输入接口的默认网关更改为tun/tap设备,以便可以从tun/tap读取所有传入数据时,就会出现问题。完成后,我无法发送UDP数据包,因为路由不正确 我还尝试在socket comm中为您提供“SO_BINDTODEVICE”选项,但仍然不起作用。请注意,我没有在tun/t
/********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数据传输回来。如果我遗漏了什么,请告诉我。
再次感谢您的帮助。您的udp数据包也将被路由到tuntap接口。(根据某些设置,它们可能会被丢弃)。您需要为要发送到的udp对等方添加路由规则、主机规则或较小的网络规则,这些规则不会干扰您的其他通信。欢迎使用堆栈溢出。你在描述你的尝试方面做得很好。你能告诉我们你想完成什么吗?你想写的程序的功能是什么?我怀疑您选择的设计不允许您的程序执行您最初的计划。请编辑您的问题,并将您的课程总体目标添加到问题的底部。谢谢Tommi。我会尝试这种方式,并让你知道。现在我知道你正在努力实现什么。几句额外的建议:记住给VM4 eth0添加一个伪装规则,使用VM1 IP和tun/tap接口给VM4添加一个类似的主机规则,对于vm2,它的eth1和eth2网络都在路由表中就足够了(网络掩码不是默认的),然后您确实可以设置到tun/tap设备的默认路由,这样,到vm3的udp数据包和使用vm1的隧道通信将找到它们的路由。我已经做了很多类似的事情,请随意询问它是否有效。我也可能忽略了什么。嗨,汤米。请看上面的更新,因为我无法在这里的评论部分写下全部内容。谢谢。嗨,Tommi,提醒一下,以防你错过了之前的评论。您能告诉我在不同线程中实现tun/tap的读写功能是否有意义吗?谢谢。嗨,汤米,我终于可以让它工作了。正如你所说,VM4的路线指向第一个tun tap是正确的。这对我不起作用,因为所有这些接口之间都存在路由问题。现在这是固定的,它的工作良好。对于需要线程的第二个查询,我使用select()函数调用多路复用读写请求。我从[link]和David Brini的simple tun程序中获得了这个想法。再次感谢您的帮助:-)