安卓端「仅组网模式」下部分应用流量完全不进 tun0:Termux 100% 超时,同一端口浏览器正常

Viewed 7

一句话:组网隧道本身是通的——同一部手机、同一分钟、同一个目标端口,浏览器能正常访问;但 Termux 里的 curl 100% 超时,且在对端抓包显示该应用一个 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 接管。

六、希望确认的问题

  1. 「仅组网 / 分流」模式下,客户端 VpnService 是否调用了 addAllowedApplication() / addDisallowedApplication() 或等价的按 UID 分流?应用名单是硬编码还是配置下发?
  2. 该模式下是否提供「所有应用都走隧道」的选项?若没有,能否增加——Termux、JuiceSSH、Termius、adb 等开发运维工具必须能访问组网内主机。
  3. uid=10301(Termux)是否命中某条排除规则?proot 内的子进程是否可能以其它 uid 运行而被单独排除?
  4. 是否有客户端 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,即可复现本问题。

1 Answers

补充一个决定性对照,问题范围可以缩到「按 UID 的接管范围」:

同一部手机、同一分钟、同一目标主机 192.168.188.1,只换执行进程的身份:

  • su 到 root(uid 0)后 ssh silver@192.168.188.1 → 登录成功。服务端日志:
    Accepted password for silver from 192.168.188.3 port 34066 ssh2(01:56:43),
    组网网卡抓包同时看到 192.168.188.3.34066 > 192.168.188.1.ssh: Flags [S]。
  • Termux 普通应用(uid=10301,u:r:untrusted_app_30)执行 curl -m 8 http://192.168.188.1:9999/
    → curl: (28) Connection timed out,http_code=000;同一时段抓包里来自 192.168.188.3 的 TCP 包数量为 0,一个 SYN 都没进隧道。

而同一部手机的浏览器访问同一地址 :9999 / :7681 都是 200,抓包能看到完整三次握手 + HTTP 往返。手机自身网络正常(curl https://223.5.5.5:443 57ms 通)。

所以想问一下:

  1. 「仅组网 / 分流」模式下,客户端 VpnService 是否使用了 addAllowedApplication() / addDisallowedApplication(),或者对部分 UID 打「非 VPN」的 fwmark?排除名单是硬编码还是配置下发?
  2. 能否加一个「所有应用都走隧道」的开关?Termux / JuiceSSH / Termius / adb 这类运维工具是组网的核心用途。
  3. 有没有客户端 debug 日志开关?需要 adb logcat、dumpsys connectivity、ip rule 之类的输出我可以提供。

现有绕法(都不需要 root):控制台「网络管理 → 端口转发」映射出公网端口给任何 App 用;或者电脑上跑 ttyd,手机浏览器直接开 shell。

再补一个更影响使用的问题:隧道对长连接不稳定,短请求正常。

现象(同一台手机、同一个 192.168.188.1):

  • 普通 HTTP 请求、网页能正常打开(浏览器访问 :7681 / :3081 都是 200,抓包有完整三次握手)。
  • 但长连接会静默断流:手机浏览器开一个走 WebSocket/SSE 持续推流的页面,服务端明明还在工作,
    手机端却停住不再更新;页面不报错、连接也不显示断开。必须手动关掉再打开(重新建连)才继续收数据。
    一天里出现频率很高,基本没法长时间挂着用。

对端测量(同一时段):

ping -c 40 -i 0.25 192.168.188.3
40 packets transmitted, 40 received, 0% packet loss
rtt min/avg/max/mdev = 57.540/66.685/78.079/4.580 ms

ICMP 层面 0 丢包、RTT 很稳,但客户端自己的日志里反复出现:

[SN-RTT] Supernode 业务包往返偏慢: peerIP=192.168.188.3 rtt=1.054s path=SN
[SN-RTT] Supernode 业务包往返偏慢: peerIP=192.168.188.3 rtt=3.481s path=SN
[SN-RTT] Supernode 业务包往返偏慢: peerIP=192.168.188.3 rtt=5.735s path=SN

即小包稳定、业务包吞吐波动 1–6 秒。单向灌流实测:手机→电脑 TCP 稳定在约 0.4 MB/s,
不快但不断;而需要「长时间保持 + 低频小包」的会话却会掉。

想请教三个问题:

  1. 中继(supernode)对长连接有没有空闲超时/会话回收?超时时间是多少?能否调大?
  2. UDP 传输在断线重连时会换中继节点吗?换节点时已建立的 TCP 会话是不是直接失效?
  3. 控制台里的「启用 TCP 穿透」「启用中继加速」能不能改善这种长连接场景?免费版能不能用?

客户端配置(日志原样):transport=P2P stun=true tcpP2P=false portMapping=true meshRelay=false httpsRelay=false,
实际选路 path=SN target=62.234.168.115:7654,也就是全程走中继、没有直连。

Related