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

如何绕过本地路由?

  •  
  •   cnt2ex · 2022-01-20 19:22:40 +08:00 · 3465 次点击
    这是一个创建于 799 天前的主题,其中的信息可能已经有所发展或是发生改变。
    本机开了 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 是通过什么方式绕开了系统的路由的?
    12 条回复    2022-02-07 16:37:52 +08:00
    Ljcbaby
        1
    Ljcbaby  
       2022-01-20 21:33:23 +08:00
    访问的时候直接指定了网卡?毕竟这种检查的都有类似的逻辑
    yankebupt
        2
    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
        3
    tomychen  
       2022-01-20 22:12:09 +08:00
    删除默认网关
    route add -host VPN-IP/32 gw 路由 IP
    然后 VPN 连接后,再走 VPN 网关出去。这样问题就解了
    也就是只有一个路由是从本地走的,就是到 VPN 的,其他的并没路由表
    tomychen
        4
    tomychen  
       2022-01-20 22:18:17 +08:00
    ...哈,回错了,我以为问的是如何防止类似的包出去。
    绕过的方式,可能就是类似于 ping -I 这种指定设备的
    xuanbg
        5
    xuanbg  
       2022-01-21 02:50:20 +08:00
    路由最基本的规则就是掩码越大优先级越高,0.0.0.0/1 dev vpn 这条路由是优先级最低的。
    你把本机路由表打出来看看就知道了。
    Kinnice
        6
    Kinnice  
       2022-01-21 09:40:47 +08:00
    ip route get 35.224.170.84 看一下到底如何走的
    cnt2ex
        7
    cnt2ex  
    OP
       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
        8
    yanqiyu  
       2022-01-21 17:43:10 +08:00
    @cnt2ex 如果你的 VPN 和原来的网络都有默认路由的话也不算绕过了路由表...只是绕过了优先级,这事情 bind()就能干
    你要不考虑把原先的网络的默认路由干掉,只留下必要的路由?
    tomychen
        9
    tomychen  
       2022-02-01 14:37:09 +08:00
    @cnt2ex 其实我比较好奇的是 wireshark 抓到的包是什么,TCP ? UDP ? DNS ?还是 ICMP ?如果是 ICMP ,可能还 OK ,如果是其他协议的包,就真的有点意思了。
    但没看到完整路由表,也不好说。

    其实你可以用我之前方式测试,我测试的时候,习惯把默认路由摘掉,手动指定一条只静态只到 VPN 的路由,VPN 连上后,再全局走 vpn ,这样的测试保证一点就是,即便 VPN ,异常掉线,直接就没网络了,而不会走原有的网关出去。这或者才是“全局"VPN ,应该有的样子吧。
    cnt2ex
        10
    cnt2ex  
    OP
       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
        11
    cnt2ex  
    OP
       2022-02-04 20:22:17 +08:00
    应该是 @yanqiyu 说的,普通程序可以随意的改变优先级。如果某个目的有两条路由匹配的话,不需要特殊权限,普通程序也可以自己选择任意一条。
    tomychen
        12
    tomychen  
       2022-02-07 16:37:52 +08:00
    @cnt2ex 这并不知道是非 root 干的吧,现在并不能确定是哪个进程在干这事。比如 root 的 crond 干的这事,不就可以解释了,但是我看了一下,还是楼上说到的,可能你的路由表优先级被“绕”了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2758 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 11:59 · PVG 19:59 · LAX 04:59 · JFK 07:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.