V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
cnt2ex
V2EX  ›  Linux

如何使 tun 的接口作为默认路由?

  •  
  •   cnt2ex · 2018-06-18 20:25:23 +08:00 · 7486 次点击
    这是一个创建于 2110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 tincd 创建了一个 vpn0 接口,地址是 192.168.200.2,掩码 255.255.255.0。现在只有目的地址为 192.168.200.0/24 的包会从 vpn0 这个接口出去,然后被 tincd 处理再从另外一个接口发送出去。

    我想要把这个 VPN 作为全局的,但是如果我现在强行把 vpn0 接口作为默认路由,任何包都是发不出去的(个人猜测是任何包从 vpn0 出去后,被 tincd 处理,又会再从 vpn0 出去再被 tincd 接受,形成一个死循环)。

    我知道类似的实现 openvpn 是可以实现全局模式的 VPN 的,不知道 tinc 之类能否通过手动修改路由表之类的来实现全局模式( tinc 文档似乎没有提到任何全局模式)。

    23 条回复    2019-08-27 22:11:20 +08:00
    wwqgtxx
        1
    wwqgtxx  
       2018-06-18 20:28:13 +08:00
    自己用 ip route 设置路由表呀
    realpg
        2
    realpg  
       2018-06-18 20:33:56 +08:00
    直接自己手动设置路由表就是了……愿意怎么设怎么设
    cnt2ex
        3
    cnt2ex  
    OP
       2018-06-18 20:36:35 +08:00
    @wwqgtxx @realpg

    我正文里说了就是如果直接改路由表是不行的。。
    realpg
        4
    realpg  
       2018-06-18 20:37:53 +08:00
    @cnt2ex #3
    那是你对路由表的操作不正确
    引申出来的是你根本不理解网络路由机制……
    ipwx
        5
    ipwx  
       2018-06-18 20:42:24 +08:00
    你先瞅一眼你的 default 和你的 vpn 路由是怎么写的,一般来说像这样:

    default via XX.XX.XX.XX dev ethX onlink
    192.168.200.0/24 via YY.YY.YY.YY dev vpn0

    然后你瞅一眼你的 VPN 服务器 IP 是啥,比如 ZZ.ZZ.ZZ.ZZ

    然后:

    ip route add ZZ.ZZ.ZZ.ZZ/32 via XX.XX.XX.XX dev ethX onlink
    ip route add 0.0.0.0/1 via YY.YY.YY.YY dev vpn0
    ip route add 128.0.0.0/1 via YY.YY.YY.YY dev vpn0
    cnt2ex
        6
    cnt2ex  
    OP
       2018-06-18 20:43:22 +08:00
    @realpg

    我正文里也说了,我猜测的是,如果把 tun 设备直接作为全局路由,那么会形成死循环,不知道你到底看没看我正文说的。

    网上随便找了一篇引用
    https://www.cnblogs.com/woshiweige/p/4532207.html
    ipwx
        7
    ipwx  
       2018-06-18 20:44:49 +08:00
    @cnt2ex 他没说错,你还是脑筋太死,或者没理解透。

    路由表不是规则顺序匹配,而是最大前缀长度匹配。你不想某些地址走默认路由,就加一条更长的规则覆盖默认规则呗(比如我上面给的方案)
    cnt2ex
        8
    cnt2ex  
    OP
       2018-06-18 20:48:52 +08:00
    @ipwx
    实际上你这个我也试过了(这个我的确没有提到,因为我觉得我思路可能完全是错的),我甚至在服务器那边加上了 NAT 的规则也没能把包发过去。
    我按照你那样的改法,ping 服务器 ZZ.ZZ.ZZ.ZZ 是能 ping 通的,但是 ping 其他任何地址都是不行的,但是通过 192.168.200.0 接口依然不行。
    ipwx
        9
    ipwx  
       2018-06-18 20:58:41 +08:00
    @cnt2ex 是不是你服务器没配置好。ip forward 开了吗?

    sysctl -w net.ipv4.ip_forward=1

    这条要每次启动运行。
    noe132
        10
    noe132  
       2018-06-18 22:02:36 +08:00
    静态路由表了解一下。

    我曾今在大学时,用路由器搭建 VPN server,然后路由器作为 Client 连接手机热点,其他电脑通过校园网连接路由器
    vpn server 通过手机热点上网。
    手动设置一下路由就行了。设置 0.0.0.0/32 的流量 从路由器连接手机热点的 ip 走,然后设置内网网段 172.0.0.0.0/24 走路由器的上一级端口,把内网网段的路由跃点数设置小于 0.0.0.0/32 的跃点数即可。
    bao3
        11
    bao3  
       2018-06-18 22:42:45 +08:00
    直接路由表就可以了,路由是先匹配细路由再匹配粗路由,先匹配 metric 低的再匹配高,最后匹配 default,除非你不停地指向自己造成 routing loop 否则不可能有问题。
    ioiioi
        12
    ioiioi  
       2018-06-18 22:45:41 +08:00   ❤️ 2
    我知道你所说的意思,你可以参考下官方的文档:
    https://www.tinc-vpn.org/examples/redirect-gateway/
    wwqgtxx
        13
    wwqgtxx  
       2018-06-18 22:58:03 +08:00
    @cnt2ex 你可以试试把你添加路由表的命令贴上来给大家看看你到底是哪里没有设置对导致的死循环,一般原因都是忘记设置 vpn 服务器的特例路由,或者是你设置错了。你这样直接否定别人的正确操作却不贴上你自己的做法别人也没法给你找原因
    Tyanboot
        14
    Tyanboot  
       2018-06-19 01:00:05 +08:00 via Android
    #5 说的没错,你还得检查对端服务器有没有开启 IP 转发,以及有没有对应的 iptables masquerade 的规则。

    除此以外 tincd 的工作模式有 router 模式和 switch 模式,根据你的描述 tun 设备的话应该是用了 router 模式,可以尝试改成 switch 模式,并把 via 的地址改成对端地址(另一台作为出口设备上 tap 分配的地址)。

    当然如果你只是想实现一个全局 VPN,还可以尝试更简单暴力的 shadowvpn。
    tempdban
        15
    tempdban  
       2018-06-19 01:23:56 +08:00 via Android
    “不知道你到底看没看我正文里说的”
    ...
    yegle
        16
    yegle  
       2018-06-19 03:09:40 +08:00
    OpenVPN 的解决方法是,不动系统默认路由,而是加一条`0.0.0.0/1`的路由到 TUN 的网关。这样绝大多数 IP 都能走 TUN 网关,但是到系统原默认网关的流量不走 TUN。

    参考: https://serverfault.com/questions/312860/why-openvpn-use-network-0-0-0-0-netmask-128-0-0-0-as-default-route
    defunct9
        17
    defunct9  
       2018-06-19 06:09:07 +08:00 via iPhone
    开 ssh,让我上去试试
    aru
        18
    aru  
       2018-06-19 06:51:40 +08:00
    @cnt2ex
    先将 vpn 服务器的 IP 网关加一条路由从原来的默认路由走
    snail1988
        19
    snail1988  
       2018-06-19 09:42:24 +08:00
    @cnt2ex 楼主别急 先学习一下路由表,和 iptables 转发
    你现在基础都不懂,即使按照文章通了,以后也难处理相关的问题
    cnt2ex
        20
    cnt2ex  
    OP
       2018-06-19 21:16:32 +08:00
    感谢前面给的官方文档。
    看到有人收藏就顺便写下咋解决的吧。

    问题不是出在系统的路由表上。
    而是 tincd 自己内部也维护了一个路由表,所以得在 tincd 的配置里把 subnet 也对应修改掉(改成 0.0.0.0 )。
    chunchu
        21
    chunchu  
       2019-08-27 22:05:50 +08:00
    我也遇到了类似的问题,不过我的与你还是有点不同。
    A B C
    192.168.0.* <---> 192.168.0.130 111.111.111.111 <---> Internet
    10.0.2.70 <---> 10.0.2.251
    tinc tinc
    想通过 iptables 设置达到目的,不知道该怎么写 iptables。
    chunchu
        22
    chunchu  
       2019-08-27 22:09:59 +08:00
    chunchu
        23
    chunchu  
       2019-08-27 22:11:20 +08:00
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5850 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 01:59 · PVG 09:59 · LAX 18:59 · JFK 21:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.