如何绕过本地路由?

2022-01-20 19:22:40 +08:00
 cnt2ex
本机开了 VPN 。为了让全局流量都走 VPN ,加了类似如下路由:
0.0.0.0/1 dev vpn
128.0.0.0/1 dev vpn
除此之外,还加了几条路由让 VPN 服务器直连。配置好后,正常上网没有问题。

但用 wireshark 试着抓了一下本地接口上的包,发现有 ip 绕过了路由直连。后来发现,这个 ip 应该是 connectivity-check.ubuntu.com 的 ip ( 35.224.170.84 )。上网搜了一下,应该是 NetworkManager 发起的。

我检查过 ip rule ,只有默认的几个规则和路由表。并且我自己 ping 了一下 35.224.170.84 ,wireshark 并抓不到 icmp 包(因为按理说,这个 ip 该走的是 vpn 接口再从本地接口发送出去,所以在本地接口上是看不到的),所以路由规则应该没错,而是被某种方式绕过了。比较好奇,NetworkManager 是通过什么方式绕开了系统的路由的?
3656 次点击
所在节点    Linux
12 条回复
Ljcbaby
2022-01-20 21:33:23 +08:00
访问的时候直接指定了网卡?毕竟这种检查的都有类似的逻辑
yankebupt
2022-01-20 21:52:48 +08:00
Ubuntu (wisely) make it easy to turn off Network Connectivity Checking in Ubuntu 17.10:
Open Settings.
Select Privacy.
Turn 'network connectivity checking' off.

来源 google
tomychen
2022-01-20 22:12:09 +08:00
删除默认网关
route add -host VPN-IP/32 gw 路由 IP
然后 VPN 连接后,再走 VPN 网关出去。这样问题就解了
也就是只有一个路由是从本地走的,就是到 VPN 的,其他的并没路由表
tomychen
2022-01-20 22:18:17 +08:00
...哈,回错了,我以为问的是如何防止类似的包出去。
绕过的方式,可能就是类似于 ping -I 这种指定设备的
xuanbg
2022-01-21 02:50:20 +08:00
路由最基本的规则就是掩码越大优先级越高,0.0.0.0/1 dev vpn 这条路由是优先级最低的。
你把本机路由表打出来看看就知道了。
Kinnice
2022-01-21 09:40:47 +08:00
ip route get 35.224.170.84 看一下到底如何走的
cnt2ex
2022-01-21 16:42:23 +08:00
@Ljcbaby
@tomychen

我发现如果通过-I 选项,指定接口 ping ,的确能从本地接口直接出去。但是如果-I 给的是地址,依然会按照路由表,走 vpn 接口。但文档好像没写这两个做法的区别。
-I interface
interface is either an address, or an interface name. If interface is an address, it sets source address
to specified interface address. If interface in an interface name, it sets source interface to specified
interface.

除此之外,我发现系统的 ping 命令没有 setuid ,但是有 CAP_NET_RAW 。我把 ping 命令拷贝一份过后(此时没有 CAP_NET_RAW 了),依然可以通过-I 选项指定接口 ping 出去。原来 linux 的系统路由表是可以没有 root 权限就能绕过的吗?


@xuanbg
@Kinnice
应该不是路由规则的问题,ping 35.224.170.84 是从 vpn 接口出去的,ip route get 35.224.170.84 也是显示走 vpn 的接口。
yanqiyu
2022-01-21 17:43:10 +08:00
@cnt2ex 如果你的 VPN 和原来的网络都有默认路由的话也不算绕过了路由表...只是绕过了优先级,这事情 bind()就能干
你要不考虑把原先的网络的默认路由干掉,只留下必要的路由?
tomychen
2022-02-01 14:37:09 +08:00
@cnt2ex 其实我比较好奇的是 wireshark 抓到的包是什么,TCP ? UDP ? DNS ?还是 ICMP ?如果是 ICMP ,可能还 OK ,如果是其他协议的包,就真的有点意思了。
但没看到完整路由表,也不好说。

其实你可以用我之前方式测试,我测试的时候,习惯把默认路由摘掉,手动指定一条只静态只到 VPN 的路由,VPN 连上后,再全局走 vpn ,这样的测试保证一点就是,即便 VPN ,异常掉线,直接就没网络了,而不会走原有的网关出去。这或者才是“全局"VPN ,应该有的样子吧。
cnt2ex
2022-02-04 19:42:14 +08:00
@tomychen 抓到的是 HTTP 的包。

wireshark 在物理网卡上抓包,大部分流量是 VPN 的加密流量。少部分是 LLDP/mDNS 之类的流量。
然后就是正文楼里提到的 HTTP 流量。并且该 http 请求得到了响应(证明的确从物理网卡上出去并得到了响应),返回内容大概是这样

HTTP/1.1 204 No Content
Server: Apache/2.4.18 (Ubuntu)
X-NetworkManager-Status: online
Connection: close

路由表我省略了一些本地路由和 VPN 服务器的路由,但是我 ping HTTP 请求的目标地址,ICMP 是没有直接走物理网卡的,物理网卡抓不到 ICMP 相关的包,而在 VPN 的网卡上可以抓到,说明该 ICMP 的确是走了 VPN ,所以我排除了路由表的问题。

我对这抱的最大的疑问就是,原来程序不需要 root 权限就可以简单绕过系统的路由表?不仅仅是 ICMP ,连 HTTP 也是。
cnt2ex
2022-02-04 20:22:17 +08:00
应该是 @yanqiyu 说的,普通程序可以随意的改变优先级。如果某个目的有两条路由匹配的话,不需要特殊权限,普通程序也可以自己选择任意一条。
tomychen
2022-02-07 16:37:52 +08:00
@cnt2ex 这并不知道是非 root 干的吧,现在并不能确定是哪个进程在干这事。比如 root 的 crond 干的这事,不就可以解释了,但是我看了一下,还是楼上说到的,可能你的路由表优先级被“绕”了。

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

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

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

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

© 2021 V2EX