liandu2024:Open-Box 修复 GL.iNet 断网保护与 TUN 标记冲突

liandu2024 在 Open-Box #157 中说明,sing-box 为跳过 TUN 设置的 0x2024 标记仍会继续匹配 GL.iNet 的 VPN 断网保护黑洞规则,导致内核自身的直连和代理连接全部报 no route to host。临时可关闭 VPN 策略路由或断网保护;Open-Box v0.1.230 起会在更高优先级让该标记查询主路由表,并在停内核时撤销规则。

作者原文

找到原因了,你贴的 ip rule 就是答案:

9000: from all fwmark 0x2024 goto 9002     ← sing-box 装的"跳过 tun"
9002: from all nop
9910: not from all fwmark 0/0xf000 blackhole   ← GL.iNet 的 VPN 断网保护
9920: from all iif br-lan blackhole

内核自己发出去的流量会打上 0x2024 这个标记,好让策略路由跳过 tun。但 sing-box 装的那条是 goto 一个空规则(9002 nop),查找不终止 —— 接着就撞上你固件的 9910:0x2024 & 0xf000 = 0x2000 ≠ 0,正好命中,整包丢弃。所以日志里直连和代理全部 connect: no route to host,连国内 IP 直连都不通。

两个办法:

1. 立刻能用:在 GL.iNet 后台关掉 VPN 策略路由 / 断网保护(Kill Switch),9910、9920 这两条就没了。临时验证可以直接:

ip rule del pref 9910

(重启会回来。)

2. 升级到 v0.1.230 及以上:我们在内核启动时补了一条优先级更高的规则,让带这个标记的流量查到主路由表为止,到不了后面的黑洞:

8999: from all fwmark 0x2024 lookup main

停内核时会自己撤掉,普通固件上行为不变。

升级后如果还不通,把新的 ip rulelogread -e sing-box | tail -n 40 贴上来。