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

2018-06-18 20:25:23 +08:00
 cnt2ex

比如 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 文档似乎没有提到任何全局模式)。

7516 次点击
所在节点    Linux
23 条回复
wwqgtxx
2018-06-18 20:28:13 +08:00
自己用 ip route 设置路由表呀
realpg
2018-06-18 20:33:56 +08:00
直接自己手动设置路由表就是了……愿意怎么设怎么设
cnt2ex
2018-06-18 20:36:35 +08:00
@wwqgtxx @realpg

我正文里说了就是如果直接改路由表是不行的。。
realpg
2018-06-18 20:37:53 +08:00
@cnt2ex #3
那是你对路由表的操作不正确
引申出来的是你根本不理解网络路由机制……
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
2018-06-18 20:43:22 +08:00
@realpg

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

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

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

sysctl -w net.ipv4.ip_forward=1

这条要每次启动运行。
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
2018-06-18 22:42:45 +08:00
直接路由表就可以了,路由是先匹配细路由再匹配粗路由,先匹配 metric 低的再匹配高,最后匹配 default,除非你不停地指向自己造成 routing loop 否则不可能有问题。
ioiioi
2018-06-18 22:45:41 +08:00
我知道你所说的意思,你可以参考下官方的文档:
https://www.tinc-vpn.org/examples/redirect-gateway/
wwqgtxx
2018-06-18 22:58:03 +08:00
@cnt2ex 你可以试试把你添加路由表的命令贴上来给大家看看你到底是哪里没有设置对导致的死循环,一般原因都是忘记设置 vpn 服务器的特例路由,或者是你设置错了。你这样直接否定别人的正确操作却不贴上你自己的做法别人也没法给你找原因
Tyanboot
2018-06-19 01:00:05 +08:00
#5 说的没错,你还得检查对端服务器有没有开启 IP 转发,以及有没有对应的 iptables masquerade 的规则。

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

当然如果你只是想实现一个全局 VPN,还可以尝试更简单暴力的 shadowvpn。
tempdban
2018-06-19 01:23:56 +08:00
“不知道你到底看没看我正文里说的”
...
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
2018-06-19 06:09:07 +08:00
开 ssh,让我上去试试
aru
2018-06-19 06:51:40 +08:00
@cnt2ex
先将 vpn 服务器的 IP 网关加一条路由从原来的默认路由走
snail1988
2018-06-19 09:42:24 +08:00
@cnt2ex 楼主别急 先学习一下路由表,和 iptables 转发
你现在基础都不懂,即使按照文章通了,以后也难处理相关的问题
cnt2ex
2018-06-19 21:16:32 +08:00
感谢前面给的官方文档。
看到有人收藏就顺便写下咋解决的吧。

问题不是出在系统的路由表上。
而是 tincd 自己内部也维护了一个路由表,所以得在 tincd 的配置里把 subnet 也对应修改掉(改成 0.0.0.0 )。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/463922

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX