1. 背景与痛点
很多家庭宽带及 Homelab 爱好者都会在软路由(OpenWrt)上配置 OpenClash 实现透明分流代理,同时使用 Tailscale 打通跨地域的设备内网(如 NAS、手机、办公室电脑等)。
然而,很多用户在开启 OpenClash 后都会遇到一个普遍问题:Tailscale 设备之间无法建立点对点(P2P)直连。
每次运行 tailscale ping 查看连接状态时,流量总是被迫降级走海外官方公共 DERP 中继服务器(如 via DERP(sfo) / via DERP(tok)),导致:
- 延迟高达 300ms ~ 1000ms+
- 大文件传输速度严重受限(通常只有几百 KB/s)
- 远程桌面、SSH 终端明显卡顿
2. 为什么 OpenClash 会破坏 Tailscale 打洞?
要解决问题,首先要了解底层网络原理。Tailscale 建立 P2P 直连依赖于 STUN(NAT 穿透探测) 机制:
[家庭电脑] ---> (OpenClash 代理拦截) ---> [境外代理节点] ---> [Tailscale 官方 DERP/STUN]
│
错误测得:公网 IP = 代理节点 IP
▼
[远端手机] <--- (尝试向代理节点 IP 发起直连握手,失败!) <--- [Tailscale 协调中心]- 公网 IP 探测被劫持:
本地电脑向外部发送 STUN 探测包(UDP 3478)以获取本机公网 IP 时,请求被 OpenClash 的内核劫持并通过境外代理节点发了出去。官方 STUN 服务器以为你的公网 IP 是“代理节点的境外 IP”。 - 产生“对称 NAT(Symmetric NAT)”假象:
经过代理层封装转发后,UDP 端口映射产生漂移,原本家庭宽带具备良好打洞能力的 Cone NAT 被伪装成了几乎无法打洞的 Symmetric NAT。 - 打洞信令错位:
远端设备尝试向错误的代理 IP 发起对撞握手,最终握手超时,被迫降级走慢速中继。
核心解决原则:让 Tailscale 的 STUN 探测流量与 WireGuard 通信流量直接穿透软路由走本地宽带出口,完全绕过 OpenClash 代理内核。
3. OpenClash 优化配置实操
步骤一:配置“不走代理的 WAN 端口”(最核心)
通过在软路由系统底层防火墙层面直接放行 Tailscale 专用端口,使数据包根本不进入 Clash 内核。
- 登录 OpenWrt 管理后台,打开 OpenClash 插件。
- 进入 【插件设置】 -> 【黑白名单】。
找到 【不走代理的 WAN 端口】,依次添加以下端口并点击
+:3478:标准 STUN 探测端口(测真实宽带公网 IP 必备)。41641:Tailscale 默认 WireGuard 通信与打洞端口。- (可选) 如果你有自建 DERP 或 Peer Relay 监听了其他端口(如
40000),也一并添加。
- 点击底部的 【保存配置】 -> 【应用配置】。
步骤二:添加 Fake-IP 过滤黑名单(防 DNS 虚拟化)
如果你使用的是 Fake-IP 模式,必须防止 Tailscale 相关域名被解析为 198.18.x.x 的保留虚拟 IP。
- 进入 【覆写设置】-> 【DNS 设置】。
- 找到 【Fake-IP 过滤黑名单 (Fake-IP Filter)】。
在列表中添加以下匹配规则(一行一个):
+.tailscale.com +.tailscale.io +.ts.net- 点击 【保存配置】 -> 【应用配置】。
步骤三:添加自定义分流直连规则(可选但推荐)
确保 Tailscale 的控制平面通信稳定直连:
- 进入 【规则设置】 -> 【自定义规则】。
在规则顶部添加以下内容:
- DOMAIN-SUFFIX,tailscale.com,DIRECT - DOMAIN-SUFFIX,tailscale.io,DIRECT - DOMAIN-SUFFIX,ts.net,DIRECT- 保存并应用。
步骤四:在 OpenWrt 开启 FullCone NAT
提升路由器本身的 NAT 兼容等级,将打洞成功率最大化:
- 进入 OpenWrt 后台 -> 【网络】 -> 【防火墙】。
如果你的固件支持 Turbo ACC 网络加速 或 FullCone NAT:
- 勾选 启用 FullCone NAT(IPv4 / IPv6 均建议开启)。
- 点击 保存并应用。
4. 验证与效果测试
配置完成后,不需要重启路由器,只需在局域网内的设备上进行以下验证:
1. 检查 NAT 类型与公网 IP 探测
在 Windows 电脑上打开命令提示符(CMD),运行:
tailscale netcheck预期正常输出:
MappingVariesByDest: false(说明已摆脱 Symmetric NAT,恢复为易打洞的 Cone NAT)。IPv4:探知到的 IP 已经变回你本地宽带的真实公网 IP(可与ip138.com查询结果核对),不再是境外代理节点的 IP。
Report:
* UDP: true
* IPv4: yes, 你的真实宽带IP:端口
* MappingVariesByDest: false
...2. 检查 OpenClash 活跃连接
进入 OpenClash 控制台(Yacd 面板)的 【连接 (Connections)】 页面:
- 触发一次打洞或网络探测。
- 列表中不会出现目标端口为
3478或41641的连接(说明流量在进入代理内核之前已在防火墙层直接旁路放行)。
3. 测试 P2P 直连打洞效果
在 Windows CMD 中直接 ping 远端设备(如手机或异地 NAS):
tailscale ping <目标节点名称或IP>预期效果:
连接将不再走慢速的 via DERP(...),而是直接显示:
pong from nas-node (100.64.x.x) via 123.123.x.x:41641 in 18ms
direct connection established延迟从原本的数百毫秒骤降至十几毫秒,局域网间的大文件传输与串流体验恢复满血状态。
5. 总结
Tailscale 的设计哲学是尽可能利用 UDP 打洞实现零配置的去中心化 P2P 互联,而透明代理由于其劫持流量与端口伪装的特性,天然容易对 STUN 穿透造成干扰。
通过在 OpenClash 中放行 3478 和 41641 端口并配置 Fake-IP 过滤,我们既保留了软路由全屋科学上网的便利,又完美恢复了 Tailscale 高速稳定的内网直连能力。