一句话:组网隧道本身是通的——同一部手机、同一分钟、同一个目标端口,浏览器能正常访问;但 Termux 里的
curl100% 超时,且在对端抓包显示该应用一个 SYN 都没进入隧道。怀疑与客户端按 UID 的代理范围(addAllowedApplication/ 应用排除列表)有关。
一、环境
| 项 | 值 |
|---|---|
| 客户端版本 | 星空 6.1.3(手机端 23116PN5BC、PC 端 master 均为 6.1.3) |
| 手机系统 | 小米 HyperOS / Android,纯蜂窝网络(无 Wi-Fi) |
| 手机组网虚拟 IP | 192.168.188.3(tun0) |
| 对端设备 | master = 192.168.188.1,Fedora 44 桌面,Linux 客户端 6.1.3 |
| 手机物理网络 | rmnet_data1 = 10.0.73.204(蜂窝 CGNAT) |
| 组网模式 | 「仅组网 / 分流」:访问 192.168.188.0/24 源地址为 192.168.188.3;访问 223.5.5.5、8.8.8.8 源地址为 10.0.73.204 |
| 传输路径 | 客户端日志显示 path=SN-TCP target=tcp-supernode(走中继) |
| 故障应用 | Termux,uid=10301(u0_a301),context=u:r:untrusted_app_30,无 root |
因无 root,手机侧 ip addr / ip rule / ip route 均返回 Cannot bind netlink socket: Permission denied(普通应用的正常 SELinux 限制),故路由取证全部在对端完成。
二、现象(同一手机、同一时间段、同一目标主机)
| # | 发起方 | 目标 | 结果 |
|---|---|---|---|
| 1 | 手机 Chrome | http://192.168.188.1:9999/ |
200 |
| 2 | 手机 Chrome | http://192.168.188.1:7681/ |
200 |
| 3 | 手机 Termux curl -m 8 |
http://192.168.188.1:9999/ |
curl: (28) Connection timed out after 8002 ms,http_code=000 |
| 4 | 手机 Termux nc |
192.168.188.1:22 / :80 |
全部 TCP 超时 |
| 5 | 手机 Termux curl |
https://223.5.5.5:443 |
OPEN,57 ms(该应用本身有网络) |
三、对端抓包取证
在对端组网虚拟网卡上抓包:
sudo tcpdump -i any -n -U -l 'net 192.168.188.0/24'
(1)浏览器那次访问,会话完整可见:
192.168.188.3.34628 > 192.168.188.1.9999: Flags [S]
192.168.188.1.9999 > 192.168.188.3.34628: Flags [S.]
192.168.188.3.34628 > 192.168.188.1.9999: Flags [.], ack 1
192.168.188.3.34628 > 192.168.188.1.9999: Flags [P.], seq 1:908 # 907 字节 HTTP GET
192.168.188.1.9999 > 192.168.188.3.34628: Flags [P.], seq 1:187 # 响应
... 正常四次挥手 ...
(2)Termux 那几次尝试:抓包中来自 192.168.188.3 的 TCP 包数量 = 0,一个 SYN 都没有出现。
(3)反向验证手机 TCP 栈是活的:
对端 → 192.168.188.3 的 22 / 9999 / 5555 发起 SYN
手机在约 100ms 内回 Flags [R.]
ARP:192.168.188.3 is-at 02:ff:3d:17:82:2b
ICMP echo 双向正常,RTT 65–70 ms
结论:隧道对 ICMP、对浏览器发起的 TCP 都是通的;唯独 Termux 发出的 TCP 离开手机后没有进入隧道。
四、已排除的可能
- 不是服务端 / 防火墙:对端
sshd监听0.0.0.0:22,firewalld已放行组网域,本机curl http://192.168.188.1:7681/返回200。 - 不是控制台连接参数:「客户端网络配置」中所有项(启用网络探测 STUN、智能连接 Happy Eyeballs、TCP 穿透、端口映射 UPnP、IP 传输模式、传输模式、启用中继加速、为其他用户提供中继、启用多播)均与「哪些应用走隧道」无关;本地控制台前端 bundle 内检索
allowlist|whitelist|per-app|split-tunnel命中 0。 - 不是 MTU / 整体路由缺失:浏览器走的是同一个
192.168.188.0/24路由、同一个tun0、同一个端口,能通。 - 不是手机 App 内可调项:手机端没有与分流 / 应用白名单相关的开关。
五、我的判断
Termux 能访问公网(223.5.5.5:443 通)、却访问不了组网地址,且包完全没有进入 tun0,符合 Android VPN 的「按 UID 排除」表现:
被排除的 UID,其 socket 不带 VPN fwmark,内核把流量交给默认路由(蜂窝);发往私有网段
192.168.188.1的包在运营商侧被丢弃,于是表现为超时。
也就是说:包不是被丢弃在隧道里,而是根本没有被 VpnService 接管。
六、希望确认的问题
- 「仅组网 / 分流」模式下,客户端 VpnService 是否调用了
addAllowedApplication()/addDisallowedApplication()或等价的按 UID 分流?应用名单是硬编码还是配置下发? - 该模式下是否提供「所有应用都走隧道」的选项?若没有,能否增加——Termux、JuiceSSH、Termius、
adb等开发运维工具必须能访问组网内主机。 uid=10301(Termux)是否命中某条排除规则?proot 内的子进程是否可能以其它 uid 运行而被单独排除?- 是否有客户端 debug 日志开关?需要我提供
adb logcat/dumpsys connectivity/ip rule输出时,请告知抓取方式与提交途径。
七、可提供的附件 / 配合
- 对端 pcap(含浏览器成功会话 + Termux 尝试期间的全量空记录)
- 两端客户端日志(PC:
/usr/local/lib/stars/res/stars.log) - 手机侧信息导出(受 SELinux 限制,仅 uid /
getprop部分可用)
可随时配合复现,约好时间我立即抓包。
附:一句话复现步骤
用任意安卓机安装 Termux(
com.termux),组网设为「仅组网」模式,在 Termux 内执行curl -m 5 http://<对端虚拟IP>:<任意监听端口>/,同时在对端抓包tcpdump -i <组网虚拟网卡> -n 'host <手机虚拟IP>'。若对端看不到任何 SYN,即可复现本问题。