让 Shadowrocket 和 Tailscale 在 Mac 上和平共处:一次路由冲突的完整排障记录
背景 我的场景很典型: Mac 上开着 Shadowrocket(TUN 模式)用于日常代理; 同时需要 Tailscale 连回家里的黑群晖 NAS(SA6400,Tailscale IP 100.101.102.15,MagicDNS 名 sa6400)。 注:文中所有 IP、主机名、tailnet 域名均已做脱敏替换,思路和命令不受影响,照抄时换成你自己的即可。 症状也很典型:两个同时开,总有一个不干活。Shadowrocket 开着的时候,ping 100.101.102.15 全部超时,DSM 网页打不开;关掉 Shadowrocket 就正常。 网上常见的答案是「在代理软件里把 100.64.0.0/10 加一条 DIRECT 分流规则」。先说结论:这个答案在 Mac 上的 Shadowrocket 是错的,而且真正的问题有两层。下面是完整的排障过程。 排障过程 第一坑:DIRECT 规则反而帮倒忙 按「标准答案」在 Shadowrocket 里加了规则: IP-CIDR, 100.64.0.0/10, DIRECT (不解析域名) 结果 ping 出现了诡异的输出: 92 bytes from 10.9.0.10: Time to live exceeded ... Src 10.0.8.44 Dst 100.101.102.15 注意源地址 10.0.8.44 —— 这不是 Tailscale 的地址,是物理网卡 en0 的局域网地址。包被甩给了物理网关,在运营商/校园网里绕圈直到 TTL 耗尽。 原因:Shadowrocket 的 DIRECT 意思是「从物理网卡直连」,它并不知道也不关心 Tailscale 的存在。而且这条规则会让 Shadowrocket 往系统路由表里写一条: ...