vtun
vtun copied to clipboard
太鱼了,有些问题想问
知道的和不清楚的
- 客户端和服务端都是
tun + socket的组合,客户端tun负责采集所有除了到dns server和vpn server的IP Packet,然后通过socket发给服务端 - 服务端启动了转发,
FORWARD使其能接收dstIP不为自己的包,转发时tun和物理网卡都因iptables masquerade改写srcIP为自己 - 服务端从
socket接收到的数据就是客户端tun捕获的包,udptotun写入tun,然后我就迷糊了。。。tun是怎么通过物理网卡发出去的,回包又是怎么被再次交给tun或者socket? 具体看下面的我的想法

- 这个图是描述客户端
APP通过端口12345请求互联网上的服务器IP: E, Port: 30000的udp类型的服务时,数据传输过程 - 图中带颜色方格是一个
IP packet,颜色不同用于区分(srcIP, srcPort, dstIP, dstPort)有区别,连在一起的两个方格是一个包,后一个是前一个的payload
我理解的流程如下
app发起请求,生成红色的包,由于iptables设定,所以流入tun设备vpn从tun读出这个包并作为udp socket的payload发出。我这画的绿色的包可能有问题,udp socket建立时选的默认网卡可能大概率就是物理网卡,不过应该不影响后续过程。如果选的是tun设备作为本地地址,那么出去的时候由于iptables masquerade也会改写成蓝色的包- 蓝色的包到达服务端后,通过
udp socket交给了vpn,序号6的位置,现在想是画错了,应该没有蓝色的包了,直接就是红色包 - 红色包被
vpn写入tun,tun送到内核,iptables masquerade改变srcIP为C,得到黑色包,经过物理网卡发送时,srcIP变为D,得到紫色包 - 服务响应发回橘黄包
我的问题
- 橘黄包要发送到
D的12345端口,然而这个请求不是D发的,内核自然没办法给相应用户进程去处理? - 图中序号 8-10 的过程是怎么完成的,服务端的配置仅仅是添加并启动了
tun设备,并没有设置tun设备的路由,vpn把udp的payload数据写入到tun,tun发给内核,内核查询路由发现什么都做不了?
希望能得到解答,感谢
- 第一个问题我理解了,之前对
masquerade理解有问题。回包也会查询是否之前做了masquerade并修改,所以会有物理网卡到tun到vpn进程的过程。 - 现在回包到达
tun的是(E, 30000, C, 12345),这时候被从tun读出,在服务器上是否有其对应的进程根本没关系,因为由vpn处理了,不需要常规情况下内核处理时要通过(E, 30000, C, 12345)找到fd呈递给相应进程的过程。 - 所以我的问题只有最后一个了,在没设置路由的情况下,怎么把
tun数据从物理设备发出,又是怎么回来的
怎么把 tun 数据从物理设备发出,又是怎么回来的? 用iptables相互转发
Masquerade outgoing traffic
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE
Allow return traffic
iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -i tun0 -m state --state RELATED,ESTABLISHED -j ACCEPT
Forward everything
iptables -A FORWARD -j ACCEPT