客户 Android 下 Wstunnel + FIClash 远程排障全记录:从脚本创建到 IP 错配的坑
本文记录一次在 Termux 上配置 wstunnel 客户端 + FIClash 代理的完整踩坑历程,最终根因竟是 YAML 文件中的 IP 地址与服务器端不匹配。过程中遇到的脚本无法生成、域名替换报错、进程消失等问题也一并梳理,附截图和注解,供后来者参考。
一、项目背景
用户参照我的教程 https://www.shuijingwanwq.com/2026/06/02/15520/ 在 Android 手机上部署:
- Termux 运行 wstunnel 客户端
- FIClash(Clash 内核的 Android 图形端)作为代理客户端
我提供了自建的 VPN 服务器信息(域名 wg.shuijingwanwq.com,IP 154.21.196.249),用户照搬教程步骤操作,但最终手机无法上网。
二、脚本创建环节的连环坑
截图1 —— 用户询问“域名和IP在哪能找到”

问题:用户没有自己的 VPN,使用的是我提供的试用服务,因此域名和 IP 直接使用示例中的 wg.shuijingwanwq.com 和 154.21.196.249 即可。但用户没理解这一点,导致迟迟未替换。
解决办法:明确告知用户,试用场景下直接照抄示例中的域名和 IP。
截图2 —— 赋予权限时提示“No such file or directory”

排查:用户命令中确实写的是 start-wstunnel.sh(有 .sh),但文件不存在。
根因:用户执行 cat > ~/.termux/boot/start-wstunnel.sh << EOF 时,可能由于我的博客原文中 << 被错误转义为 <<(显示问题),导致复制的命令实际为 cat > ... << EOF 时出错,文件根本没有生成。
教训:<< 是 shell 的 heredoc 语法,必须原样输入。后续我已修正博客中的转义问题。
截图3 —— “你的域名”未替换导致 wstunnel 报错

用户尝试手动输入命令时,完全保留了教程中的“你的域名”和“你的服务器IP”占位符,未做任何替换,导致 wstunnel 客户端直接报“无效的 DNS 名称”错误。
同时,命令被错误地拆分成多行,进一步破坏了语法结构。
教训:无论教程如何强调,对于初次接触的用户,最好直接提供可复制的完整命令(将占位符替换为真实值后再发给用户)。
三、文件生成与权限修正
经过纠正,用户用正确的命令(替换了真实域名和 IP)创建了脚本(截图4):

随后用户执行 chmod +x ~/.termux/boot/start-wstunnel 时报错,缺少了 .sh 后缀。
我在聊天中及时提醒:
我:
chmod +x ~/.termux/boot/start-wstunnel.sh
我:你少了.sh
用户修正后,chmod 命令成功执行。
四、wstunnel 短暂启动后进程消失
用户执行 sh ~/.termux/boot/start-wstunnel.sh,终端打印了如下日志(截图5):

备注:日志显示 INFO Starting wstunnel client、UDP server listening、TLS handshake using SNI wg.shuijingwanwq.com,看似连接成功。
但用户执行 ps -ef | grep wstunnel 时看不到进程存在,感到困惑。
真实原因:虽然 TLS 握手日志打印出来了,但由于 YAML 文件中配置的客户端 IP(10.7.0.3)与服务器端实际分配的 IP(10.7.0.4)不一致,导致 WireGuard 虚拟网卡无法正确初始化路由。wstunnel 客户端在尝试建立完整的 UDP 通道后,因底层配置错误而自动崩溃退出,并非用户按了 Ctrl+C 导致。
因此,ps 看不到任何驻留的 wstunnel 进程。
五、FIClash 内置 WireGuard 协议
此时用户启动了 FIClash,并导入了我发送的 YAML 配置文件。
(需要注意的是:FIClash 本身已内置支持 WireGuard 协议,作为代理节点类型之一,因此用户无需额外安装独立的 WireGuard 应用程序。)
但仪表盘几乎无流量(截图6):

备注:上行/下行速度极低,内网 IP 显示为 WiFi IP(192.168.1.34),没有走代理流量。
手机桌面如图(截图7),仅安装了 Termux、FIClash、Termux Boot 等工具。

重启手机后问题依旧。
六、终极排障:IP 地址错配是元凶
1. 使用相同文件复现
由于该 YAML 文件是我直接发给用户的,我让用户把整套文件发回给我,直接在我自己的手机上使用同一份文件进行测试,果然复现了完全相同的问题——这证明问题出在配置文件本身,而非用户操作环境。
2. 查看服务器上的 client.conf(截图8)

备注:关键内容 ——
[Interface]
Address = 10.7.0.4/24
DNS = 8.8.8.8, 8.8.4.4
...
服务器分配给该客户端的虚拟 IP 是 10.7.0.4。
3. 检查发送给用户的 YAML 文件
YAML 中 proxies 下的 WireGuard 部分写着:
ip: 10.7.0.3 # 错误!应为 10.7.0.4
这个 IP 是我在准备示例文件时误写的,与服务器实际分配的 IP 不一致。
WireGuard 要求本地虚拟 IP 必须与服务器端 [Interface] 的 Address 一致(或至少属于同一子网且唯一),否则虽然 UDP 隧道可能建立,但路由和包转发会失败,流量无法正常出入。这也是导致 wstunnel 进程崩溃退出的根本原因。
4. 修改为正确 IP 后瞬间恢复(截图9)

备注:将 ip: 10.7.0.3 改为 ip: 10.7.0.4,重新导入 YAML 并连接,仪表盘立即显示正常的上行/下行流量,手机成功访问外网。
七、总结与避坑指南
根因复盘
- 直接原因:YAML 文件中的 WireGuard 客户端 IP 与服务器端分配的不一致(
10.7.0.3vs10.7.0.4)。 - 间接原因:启动脚本的创建过程因博客转义字符问题、占位符未替换、权限命令输错等,拖延了排查时间。
- 导火索:我发送的示例 YAML 文件本身有错误(写死
10.7.0.3而未与实际服务器同步)。
经验教训
- 脚本创建:务必使用正确的
<<heredoc 语法,并检查文件是否真的生成了(用ls -l确认)。发教程时,直接给替换好真实值的命令,避免用户漏改占位符。 - 进程诊断:
ps看不到进程时,不要想当然认为“用户退出了终端”,很可能是配置错误导致客户端主动崩溃,应检查系统日志(logcat或dmesg)或运行时的strace。 - 配置一致性:任何 VPN 客户端的 IP、端点、密钥都必须与服务器端完全匹配,切忌照搬示例而不核对。
- 内置协议认知:如今 FIClash 等客户端已内置 WireGuard 支持,无需额外安装独立应用,但这也意味着配置的
ip字段必须极其准确。 - 提供示例文件时:务必使用占位符(如
YOUR_CLIENT_IP)并单独标注,或者在发给用户前亲自跑一遍完整流程,确保无误。
附:最终的正确启动脚本(供参考)
#!/data/data/com.termux/files/usr/bin/bash
termux-wake-lock
~/bin/wstunnel client -L udp://127.0.0.1:51820:127.0.0.1:51820?timeout_sec=0 --tls-sni-override wg.shuijingwanwq.com wss://154.21.196.249:443
(注意:请将域名和 IP 替换为你的实际服务器信息)
后记:这次排障前后花了近一天时间,最后发现是配置文件中的一个小数字错误。希望这篇记录能帮助大家少走弯路,遇到类似问题时从“配置文件一致性”和“进程存活状态”双重入手,往往能快速定位。如果有其他疑问,欢迎留言讨论。