👁 1265

OpenWrt + OpenClash + EasyTier 异地组网失联修复

OpenWrt + OpenClash + EasyTier 异地组网失联修复实战:tun0消失、fake-ip劫持、DNS解析全踩坑

折腾了几个晚上,把 OpenWrt 上 EasyTier + OpenClash 的组合坑踩了个遍。进程活着但 tun0 消了、PPPoE 断线后组网瘫痪、fake-ip 把 peer 域名劫持了、Cloudflare 托管的域名在国内 DNS 死活解析不出 TXT 记录……每一个都够你喝一壶。本文记录完整排查和修复过程,帮你少走弯路。

背景

我的网络拓扑:OpenWrt 软路由做主路由,OpenClash 跑 fake-ip 模式代理上网,EasyTier 做异地组网把多台路由和 VPS 打通。peer 发现用的是 txt:// 域名方式,域名托管在 Cloudflare。

看起来很美好?实际跑起来,问题一个接一个。


坑一:EasyTier 进程在跑,但 tun0 消失失联

现象

某天发现远程设备全连不上。SSH 到 OpenWrt 一看:

进程没挂,但 TUN 设备没了,peer 列表空空如也。EasyTier 成了”植物人”——心跳还在,网络功能已经脑死亡。

原因

PPPoE 断线重连后,网络栈被刷新,tun0 虚拟网卡被系统回收,但 easytier-core 进程没有退出,procd 的 respawn 机制只管进程死没死,不管功能正不正常。进程活着但 tun0 丢了,它管不了。

修复:配置 checkip 健康检查

EasyTier 的 init 脚本自带健康检查逻辑,但 checkip 选项默认为空,检测脚本根本没启动。配上对端 IP 后,每 3 分钟 ping 一次,不通就自动 restart:

uci set easytier.@easytier[0].checkip='10.10.10.44 10.10.10.43'
uci set easytier.@easytier[0].checktime='3'
uci commit easytier
/etc/init.d/easytier restart

验证检测脚本是否启动:

ps | grep easytier_check
# 应该能看到 easytier_check 进程在跑

坑二:OpenClash fake-ip 劫持 peer 域名

现象

EasyTier 配置了 txt://peer1.example.xyz 作为 peer 发现地址,但 nslookup 查出来全是 198.18.0.x 的假 IP:

域名 本地DNS(OpenClash) 真实IP
peer1.example.xyz 198.18.0.140 ❌ 1.2.3.4
peer2.example.xyz 198.18.0.141 ❌ 5.6.7.8
peer3.example.xyz 198.18.0.142 ❌ 9.10.11.12

EasyTier 拿到 fake-ip 自然无法解析出 peer 地址,连不上对端。

原因

OpenClash fake-ip 模式会拦截所有 DNS 查询,返回 198.18.0.0/16 段的虚假 IP。正常情况下对 A 记录没问题(OpenClash 会根据域名匹配规则走代理或直连),但 EasyTier 的 txt:// 协议需要查询 TXT 记录,fake-ip 把 TXT 查询也卷进来了,返回假 IP 而非 TXT 记录内容。

修复:把 peer 域名加入 fake-ip-filter 白名单

编辑 /etc/openclash/custom/openclash_custom_fake_filter.list,添加:

+.example.xyz

这样 example.xyz 的所有子域名都不会被 fake-ip 劫持,DNS 查询走正常解析。


坑三:Cloudflare 域名国内 DNS 解析不了 TXT

现象

加了 fake-ip-filter 后,TXT 查询还是失败:

nslookup peer1.example.xyz 223.5.5.5
# SERVFAIL,解析不到

nslookup peer1.example.xyz 8.8.8.8
# 正常返回 TXT 记录

原因

peer 域名的 NS 托管在 Cloudflare。国内递归 DNS(阿里 223.5.5.5、腾讯 119.29.29.29)向 Cloudflare 权威 DNS 查询时,TXT 记录响应较大,容易触发 UDP 分片问题,在国内网络环境下丢包率极高,导致 SERVFAIL。

修复:nameserver-policy 指定海外 DNS

编辑 /etc/openclash/custom/openclash_custom_domain_dns_policy.list:

"+.example.xyz": [https://dns.google/dns-query, tls://8.8.8.8:853]

这样所有 peer 域名的查询都走 Google DNS,绕过国内递归 DNS 到 Cloudflare 的不稳定链路。

关键一步:开启 custom_name_policy 开关!

OpenClash 有个 UCI 开关控制 nameserver-policy 是否加载,默认是关的:

uci set openclash.config.custom_name_policy='1'
uci commit openclash
/etc/init.d/openclash restart

我改了 DNS 策略文件但没开这个开关,策略根本不生效,排查了好久才发现是这个开关的锅。

验证

通过 Clash 内部 DNS API 确认解析正确:

# secret 从 /etc/openclash/3tt.yaml 获取
curl -s -H "Authorization: Bearer YOUR_SECRET" 
  'http://127.0.0.1:9090/dns/query?name=peer1.example.xyz&type=TXT'
# 应该返回 TXT 记录内容

坑四:PPPoE 断线重连后 EasyTier 不自愈

现象

运营商每 48 小时强制踢一次 PPPoE,OpenWrt 能自动重拨成功,但 EasyTier 就此失联,直到手动 restart 才恢复。

原因

PPPoE 重连后:默认路由被刷新、DNS 临时不可用、STUN 穿透映射过期。EasyTier 正在进行的 txt:// peer 解析失败,内部没有重试,peer 列表清空后不再恢复。

修复

除了上面配置的 checkip 健康检查,还可以加一个 netifd hotplug 脚本,WAN 重连时主动重启 EasyTier:

cat > /etc/hotplug.d/iface/99-easytier << 'EOF'
#!/bin/sh
[ "$ACTION" = "ifup" ] && [ "$INTERFACE" = "wan" ] && {
    logger -t easytier "WAN ifup detected, restarting easytier"
    sleep 5
    /etc/init.d/easytier restart
}
EOF
chmod +x /etc/hotplug.d/iface/99-easytier

完整修复清单

修改项 文件/命令 作用
checkip 健康检查 uci set easytier.checkip/checktime 3分钟ping对端,不通自动restart
fake-ip-filter 白名单 openclash_custom_fake_filter.list 加入 peer 域名 peer域名不被fake-ip劫持
nameserver-policy openclash_custom_domain_dns_policy.list 指定海外 DNS Cloudflare TXT记录正常解析
custom_name_policy 开关 uci set openclash.config.custom_name_policy='1' 让DNS策略生效
WAN hotplug 脚本 /etc/hotplug.d/iface/99-easytier PPPoE重连时自动重启EasyTier

防复发建议

  1. 监控先行:checkip 必须配上,这是最后一道防线
  2. fake-ip-filter 要全面:所有组网相关域名(STUN、peer发现、NTP)都加进去
  3. peer 发现多路径:同时配 txt:// 和 tcp:// 直连,别只依赖 TXT
  4. 域名选择避开 Cloudflare:做 peer 发现优先用国内 DNS 服务商托管的域名
  5. 每台节点设唯一 hostname:config.toml 里 hostname 必须改,别都用默认的 OpenWrt
  6. OpenClash 开关要检查:改了自定义规则文件不等于生效,务必确认 UCI 开关已开启

总结

OpenWrt + OpenClash + EasyTier 这个组合本身没问题,问题出在三者之间的”缝隙”里——DNS 被劫持、网络栈被刷新、设备被回收。每个组件单独看都没 bug,但组合在一起就产生了连锁故障。

排查这类问题的关键思路:

  1. 先看进程和网卡:进程在 ≠ 功能正常
  2. 再看 DNS 解析:fake-ip 模式下,nslookup 的结果不可信,要用 Clash 内部 API 验证
  3. 最后看 DNS 策略是否生效:改了配置文件不等于 OpenClash 加载了,检查 UCI 开关

希望这篇文章能帮你少踩几个坑。


by 数码罗记·godsun.pro