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 协调中心]
  1. 公网 IP 探测被劫持:
    本地电脑向外部发送 STUN 探测包(UDP 3478)以获取本机公网 IP 时,请求被 OpenClash 的内核劫持并通过境外代理节点发了出去。官方 STUN 服务器以为你的公网 IP 是“代理节点的境外 IP”。
  2. 产生“对称 NAT(Symmetric NAT)”假象:
    经过代理层封装转发后,UDP 端口映射产生漂移,原本家庭宽带具备良好打洞能力的 Cone NAT 被伪装成了几乎无法打洞的 Symmetric NAT。
  3. 打洞信令错位:
    远端设备尝试向错误的代理 IP 发起对撞握手,最终握手超时,被迫降级走慢速中继。
核心解决原则:让 Tailscale 的 STUN 探测流量与 WireGuard 通信流量直接穿透软路由走本地宽带出口,完全绕过 OpenClash 代理内核。

3. OpenClash 优化配置实操

步骤一:配置“不走代理的 WAN 端口”(最核心)

通过在软路由系统底层防火墙层面直接放行 Tailscale 专用端口,使数据包根本不进入 Clash 内核。

  1. 登录 OpenWrt 管理后台,打开 OpenClash 插件。
  2. 进入 【插件设置】 -> 【黑白名单】。
  3. 找到 【不走代理的 WAN 端口】,依次添加以下端口并点击 +:

    • 3478:标准 STUN 探测端口(测真实宽带公网 IP 必备)。
    • 41641:Tailscale 默认 WireGuard 通信与打洞端口。
    • (可选) 如果你有自建 DERP 或 Peer Relay 监听了其他端口(如 40000),也一并添加。
  4. 点击底部的 【保存配置】 -> 【应用配置】。

步骤二:添加 Fake-IP 过滤黑名单(防 DNS 虚拟化)

如果你使用的是 Fake-IP 模式,必须防止 Tailscale 相关域名被解析为 198.18.x.x 的保留虚拟 IP。

  1. 进入 【覆写设置】-> 【DNS 设置】。
  2. 找到 【Fake-IP 过滤黑名单 (Fake-IP Filter)】。
  3. 在列表中添加以下匹配规则(一行一个):

    +.tailscale.com
    +.tailscale.io
    +.ts.net
  4. 点击 【保存配置】 -> 【应用配置】。

步骤三:添加自定义分流直连规则(可选但推荐)

确保 Tailscale 的控制平面通信稳定直连:

  1. 进入 【规则设置】 -> 【自定义规则】。
  2. 在规则顶部添加以下内容:

    - DOMAIN-SUFFIX,tailscale.com,DIRECT
    - DOMAIN-SUFFIX,tailscale.io,DIRECT
    - DOMAIN-SUFFIX,ts.net,DIRECT
  3. 保存并应用。

步骤四:在 OpenWrt 开启 FullCone NAT

提升路由器本身的 NAT 兼容等级,将打洞成功率最大化:

  1. 进入 OpenWrt 后台 -> 【网络】 -> 【防火墙】。
  2. 如果你的固件支持 Turbo ACC 网络加速 或 FullCone NAT:

    • 勾选 启用 FullCone NAT(IPv4 / IPv6 均建议开启)。
  3. 点击 保存并应用。

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 高速稳定的内网直连能力。

最后修改:2026 年 08 月 22 日
如果觉得我的文章对你有用,请随意赞赏