假设有 1 台家用路由器和 1 台服务器
br-lan +--------+ eth0 eth0 +--------+
192.168.1.1 | router | 60.0.0.1 80.0.0.1 | server |
+--------+ +--------+
现在我们要在两者之间建立一个简单的隧道,基本思想是,把原本准备发出去的包,放在 udp payload 中,发送给 server 的某个指定端口,由 server 代为转发
br-lan +--------+ eth0 eth0 +--------+
192.168.1.1 | router | 60.0.0.1 80.0.0.1 | server |
| | tun0 tun0 | |
| | 10.0.0.2 10.0.0.1 | |
+--------+ +--------+
为了把所有的 IP 流量都进行一次封装,需要建立一条 tun0 的默认路由 (优先级最高)
原先 client (192.168.1.2) -> target (8.8.8.8) 的流量,首先经过一次 NAT,变成 10.0.0.2 -> 8.8.8.8,这个和路由器原本就一直在做的 NAT 没有什么区别
隧道处理程序从 client 的 tun0 口读取 IP 包,添加到 udp payload 中,然后发送给 server eth0 的指定端口 (60.0.0.1 -> 80.0.0.1)
这样上行包的一半逻辑已经设计完了,但是问题来了,既然 tun0 的默认路由是优先级最高的默认路由 (我们要保证所有包都进 tun0 去被封装一次),封装完的包按照这个规则,还会继续被送到 tun0 去封装第二次、第三次
如何能避免这个问题呢?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.