V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
feng32
V2EX  ›  程序员

创建网络隧道如何防止默认路由造成的环路?

  •  
  •   feng32 · 2020-12-04 21:30:02 +08:00 · 1166 次点击
    这是一个创建于 1232 天前的主题,其中的信息可能已经有所发展或是发生改变。

    假设有 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 去封装第二次、第三次

    如何能避免这个问题呢?

    3 条回复    2020-12-04 23:53:59 +08:00
    fasionchan
        1
    fasionchan  
       2020-12-04 21:44:30 +08:00
    加一条到 80.0.0.1 的主机路由,从正常的上网路劲出去?
    feng32
        2
    feng32  
    OP
       2020-12-04 21:54:46 +08:00
    @fasionchan 好像只要这条路由比 tun0 路由优先级还要高就行了 -_- 等下周试下
    bearice
        3
    bearice  
       2020-12-04 23:53:59 +08:00
    #1 的说法是正确的 路由永远是最长匹配优先,不需要改优先级什么的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   907 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 20:52 · PVG 04:52 · LAX 13:52 · JFK 16:52
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.