Android VPN客户端隐藏本地SOCKS代理绕过检测
主流Android VLESS客户端会在固定端口开启本地SOCKS代理,导致应用能轻易检测VPN并获取服务器公网IP。通过RKNHardering等工具测试证实,即使在分流模式下,TUN接口、系统路由、数据包列表和可访问代理都暴露无遗。解决方案?动态生成随机端口和SOCKS5认证,且对其他应用不可见。
检测原理及反制方法
应用会扫描localhost上的开放SOCKS端口。标准客户端(如v2RayTun、v2rayNG、Hiddify)未隐藏这些端口,导致泄露。应对策略如下:
- 每次启动生成随机端口(如45478)。
- 自动创建唯一凭证(如upu6CHvvV:ZJC3GMDXKOLFdPKAfxBxrHiU)。
- 通过tun2socks仅供内部使用运行代理。
这样就能阻断扫描:其他应用无凭证无法连接,也无法发现真实IP。
使用Xray和tun2socks的技术实现
Xray-core提供跨平台VLESS/VMess二进制文件。为实现完整TUN支持,我们用tun2socks(静态linux-arm64构建)替换Xray原生隧道。设置步骤:
- 以随机端口启动Xray的SOCKS5。
- tun2socks将TUN文件描述符流量路由至代理。
- Flutter + Kotlin + C++封装管理进程。
为规避Android 10+限制(W^X违规):将二进制打包为lib/*.so文件。
示例启动日志:
[2026-04-12T09:44:46.641632] [INFO] Starting VPN
[2026-04-12T09:44:46.641818] [INFO] Underlying network set: 176
[2026-04-12T09:44:46.641946] [INFO] nativeSetMaxFds result (parent): 0
[2026-04-12T09:44:46.643867] [INFO] TUN established, dup fd=142
[2026-04-12T09:44:46.644004] [INFO] xray started
[2026-04-12T09:44:46.644130] [INFO] Starting tun2socks (native): /data/app/~~_xfukaXUtA4X7kd1BmB4UA==/com.teapodstream.teapodstream-zTL0GGuDWxPk8XDn0VkAiw==/lib/arm64/libtun2socks.so -device fd://142 -proxy socks5://upu6CHvvV:[email protected]:45478 -mtu 1500 -loglevel error -tcp-sndbuf 524288 -tcp-rcvbuf 524288 -tcp-auto-tuning
[2026-04-12T09:44:46.644247] [INFO] tun2socks started (pid=28880)
[2026-04-12T09:44:46.644399] [INFO] VPN connected
tun2socks参数:MTU 1500,TCP缓冲区524288字节,启用自动调优。进程追踪tun2socks PID,确保干净关闭。
客户端功能
TeapodStream实现覆盖核心场景:
- 协议:VLESS、VMess、Trojan、Shadowsocks。
- 分流隧道:排除指定应用。
- URL订阅,支持自动配置更新。
- 动态代理认证。
针对检测工具(原VLESS漏洞文章及RKNHardering)的测试显示,无SOCKS或IP泄露。
核心要点
- 用随机端口和凭证伪装本地SOCKS,这是对抗localhost扫描的关键。
- tun2socks + Xray提供稳固TUN支持,避免原生隧道麻烦。
- 将二进制打包为.so文件绕过Android SELinux。
- 分流支持无法隐藏其他痕迹(TUN、路由)。
- 开源代码可自行验证。
— Editorial Team
暂无评论。