← 返回 CN2免流 - 官网 首页

Mihomo 配置 Tailscale 后连不上?最小 YAML 与排查步骤

更新于 2026-10-24 · justcn2.online

简答:Mihomo 配置 Tailscale,先使用支持 type: tailscale 的版本,声明 tailscale 出站并加入策略组,再用 Tailnet IP 或实际子网规则分流。连不上时依次检查配置校验、规则命中、日志、DNS 与路由。

定义:Mihomo 配置 Tailscale,是在 Mihomo 中声明 type: tailscale 出站,让命中规则的连接通过 Tailnet、子网路由或出口节点转发。

先试这一步:选择方案并写入最小配置

想让 Mihomo 只把访问家里 NAS、办公网段或 Tailnet 设备的流量交给 Tailscale,其余连接继续按原有规则处理?优先使用 Mihomo 原生的 type: tailscale 出站,不要把原生 Tailscale 客户端、userspace SOCKS5 和 Mihomo 出站当成同一种方案。本文是第三方使用指南,Mihomo、Tailscale 及图形客户端的具体版本和界面以各自项目资料为准。

Mihomo 的 v1.19.25 发布说明已经列出 Tailscale outbound support;实际使用时,应确认当前二进制支持 type: tailscale,而不是只看客户端名称。参考:Mihomo v1.19.25 发布说明。

需求优先方案关键设置是否需要 TUN
只访问 Tailnet 设备Mihomo 原生 tailscale 出站出站、策略组、设备 IP 或域名规则不需要
访问家中或办公室子网Mihomo 原生 tailscale 出站accept-routes: true,对端发布并批准子网路由按客户端接管范围决定
让选定公网流量经过出口节点Mihomo 原生 tailscale 出站exit-node 填出口节点 IP 或 auto:any按客户端接管范围决定
全系统都加入 Tailnet原生 Tailscale 客户端系统级接口、路由和 DNS由原生客户端管理
旧 Mihomo 无法识别 tailscale升级;无法升级时使用原生客户端或 userspace SOCKS5先确认客户端能否接收 SOCKS5按替代方案决定

下面是一个新建最小配置的示例。若你是在已有配置中追加,请确保策略组名称与规则中的 Tailscale 完全一致;真实 auth-key 不要发布到订阅、代码仓库或截图中。

mixed-port: 7890
external-controller: 127.0.0.1:9090
secret: change-this-secret

proxies:
  - name: ts-home
    type: tailscale
    hostname: mihomo
    auth-key: tskey-auth-替换为你的密钥
    control-url: https://controlplane.tailscale.com
    state-dir: /var/lib/mihomo/tailscale
    ephemeral: false
    udp: true
    accept-routes: true

proxy-groups:
  - name: Tailscale
    type: select
    proxies:
      - ts-home
      - DIRECT

rules:
  - IP-CIDR,100.64.12.34/32,Tailscale,no-resolve
  - IP-CIDR,192.168.10.0/24,Tailscale,no-resolve
  - DOMAIN-SUFFIX,example.ts.net,Tailscale
  - MATCH,DIRECT

state-dir 使用绝对路径更容易管理。若使用相对路径,它相对于 Mihomo 的工作目录,也就是启动时由 -d 指定的目录,而不一定是配置文件所在目录。官方文档列出的字段包括 hostname、auth-key、control-url、state-dir、accept-routes 和 exit-node,可对照Mihomo Tailscale 配置文档检查拼写。

auth-key、state-dir 与 control-url 怎么填

auth-key 是注册 Mihomo 这个 Tailscale 节点时使用的预认证密钥;不填写时,官方 Mihomo 文档说明首次启动日志会输出交互式登录链接。服务器、容器或没有浏览器的环境通常更适合使用 auth-key。

  1. 进入 Tailscale 管理控制台的 Keys 页面。
  2. 选择生成 auth key,根据环境选择一次性、可复用、预授权、标签或临时节点等选项。
  3. 将密钥放入本地配置或安全的密钥注入方式中,不要提交到公开仓库。
  4. 测试结束后,撤销不再使用的密钥;如果密钥已经泄露,应立即撤销并重新生成。

Tailscale 官方说明 auth-key 可用于无浏览器注册节点,一次性密钥只能使用一次,可复用密钥适合多次注册但泄露风险更高。官方还提醒,把密钥直接作为命令参数可能写入 shell history;可参考Tailscale Auth keys和Securely handle an auth key。

state-dir 是 tsnet 保存节点状态的目录。长期运行的 Mihomo 建议使用持久化目录并设置 ephemeral: false;临时容器或短生命周期任务可以考虑 ephemeral: true,但重建后通常会以新的临时节点重新注册。control-url 默认可使用 Tailscale 控制面地址,也可以改成自建 Headscale 的控制服务地址;该字段只负责指定控制服务器,不代表它会自动创建 Headscale 或替你完成访问策略。

如果 Tailnet 控制面、DERP 或 STUN 连接必须经过已有的 Mihomo 出站,可以在同一配置里声明一个已经存在的出站名称,再填入 dialer-proxy。官方 Mihomo 文档说明,该字段用于 Tailscale 控制面、DERP/STUN 及其他服务连接;不要写一个没有声明的策略组或节点名称。

三种流量场景:Tailnet 设备、子网路由与出口节点

场景配置写法规则或验证重点
访问 Tailnet 内的单台设备不需要 accept-routes;使用设备的实际 Tailscale IPIP-CIDR,100.64.12.34/32,Tailscale,no-resolve
访问家中或办公室网段accept-routes: true对端发布了目标网段,且管理控制台已批准
经出口节点访问公网exit-node: 100.64.12.34 或 exit-node: auto:any对比出口 IP,并确认策略命中 Tailscale

官方 Mihomo 文档明确支持用出口节点的节点 IP,也支持 auto:any;它没有把普通主机名列为该字段的通用写法,因此配置时优先填写出口节点的 Tailscale IP,或使用 auto:any 自动选择可用出口节点。

proxies:
  - name: ts-exit
    type: tailscale
    hostname: mihomo-exit
    auth-key: tskey-auth-替换为你的密钥
    state-dir: /var/lib/mihomo/tailscale-exit
    accept-routes: true
    exit-node: 100.64.12.34
    exit-node-allow-lan-access: true

proxy-groups:
  - name: Tailscale
    type: select
    proxies:
      - ts-exit
      - DIRECT

rules:
  - DOMAIN-SUFFIX,office.example,Tailscale
  - IP-CIDR,192.168.10.0/24,Tailscale,no-resolve
  - MATCH,DIRECT

出口节点和子网路由不要混淆:子网路由用于访问已经发布的指定内网网段;出口节点用于承载不属于 Tailnet 路由的公网流量。Mihomo 文档还说明,如果目标不在 Tailscale 路由内,连接会直接失败,不会自动回落到 DIRECT;需要出口节点或覆盖目标的子网路由。出口节点的官方说明可参考Tailscale Exit nodes。

规则范围不要一开始写成整个 100.64.0.0/10。Tailscale 使用该 CGNAT 地址段分配设备 IP,而部分运营商或其他网络也可能使用同一范围,整段导入可能产生路由冲突。优先按真实设备 IP 使用 /32,或按实际发布的子网收窄。需要 IPv6 时,再按实际地址处理 Tailscale 的 fd7a:115c:a1e0::/48 网段。相关地址与冲突说明见Tailscale Reserved IP addresses和Tailscale 与其他 VPN 共存说明。

Windows、Linux、Docker 与图形客户端的差异

Clash Party、Clash Verge Rev 等图形客户端主要负责界面、配置管理和 TUN 开关,实际是否支持某个字段仍取决于它捆绑或调用的 Mihomo 内核版本。裸核部署则由你自己指定工作目录、运行用户和权限。常见环境可以按下面的表格选路径。

环境state-dir 建议是否需要 TUN 权限主要注意点
Windows 裸核如 C:\mihomo\tailscale仅使用 tailscale 出站时通常不需要;开启 Mihomo TUN 时需要客户端的 TUN 服务模式或相应权限先关闭其他 VPN 验证路由,再检查防火墙和服务模式
Windows 图形客户端使用客户端数据目录或界面显示的配置目录只有开启 TUN 才需要;具体放行项以客户端界面为准确认当前运行内核支持 type: tailscale,不要只看 GUI 名称
Linux 裸核如 /var/lib/mihomo/tailscale仅使用 tailscale 出站时通常不需要;Mihomo TUN 需要 TUN 设备、路由和权限专用用户要能读取配置并写入 state-dir;Linux 下的 routing-mark 还需相应网络权限
Docker 仅 tailscale 出站容器内如 /root/.config/mihomo/tailscale不因 tailscale 出站本身自动需要 NET_ADMIN 或 /dev/net/tun只挂载父目录,并确保容器内路径实际持久化
Docker 同时开启 Mihomo TUN容器内如 /root/.config/mihomo/tailscale通常需要 NET_ADMIN 和 /dev/net/tun这是 TUN 的权限,不是 tailscale 出站的必需权限

只使用原生 tailscale 出站时,Docker 可以先采用较小权限的方式运行:

docker run -d \
  --name mihomo \
  --network host \
  -v /opt/mihomo:/root/.config/mihomo \
  mihomo-image:latest \
  -d /root/.config/mihomo

此时配置中的状态目录必须写成容器内路径:

state-dir: /root/.config/mihomo/tailscale

它对应宿主机的 /opt/mihomo/tailscale,因为整个宿主机目录被挂载到了容器内的 /root/.config/mihomo。不要把 /opt/mihomo/tailscale 直接写进容器配置,也不要在已经挂载父目录的情况下重复挂载同一个子目录。

如果还要开启 Mihomo TUN,再单独增加容器权限:

docker run -d \
  --name mihomo-tun \
  --network host \
  --cap-add NET_ADMIN \
  --device /dev/net/tun:/dev/net/tun \
  -v /opt/mihomo:/root/.config/mihomo \
  mihomo-image:latest \
  -d /root/.config/mihomo

镜像名称、启动参数和配置目录要以实际镜像资料为准。Mihomo 官方 TUN 文档列出了 auto-route、strict-route、dns-mode 与 DNS 劫持等设置;Windows、Linux 和 Android 的系统权限行为不同,开启 TUN 后应先确认系统能正常恢复网络,再逐项加入 Tailscale 规则。参考:Mihomo TUN 配置文档。

可复制的排查命令:先定位是哪一层失败

下面命令适合 Linux、macOS 或容器内的 Mihomo 裸核。Windows 可在 PowerShell 中使用对应的可执行文件路径;图形客户端则先找到它实际使用的内核和配置目录。端口常见默认为 7897 或 7890,以设置页为准。

  1. 先校验配置:mihomo -t -d <目录>。例如:
mihomo -t -d /etc/mihomo

如果使用明确的配置文件,也可以:

mihomo -t -f /etc/mihomo/config.yaml

校验失败时先修复 YAML 缩进、重复名称和策略组引用,不要直接启动 TUN。Mihomo 的配置校验流程使用 mihomo -t,可参考官方控制面板项目对该命令的调用说明:MetaCubeX Mihomo Dashboard。

  1. 用 mixed-port 测试明确的 Tailnet IP:将目标 IP 和端口替换成实际设备上的服务。
curl -v -x http://127.0.0.1:7890 http://100.64.12.34:8080/

如果你的 mixed-port 是 7897,将命令中的端口替换为 7897。先测 IP,再测 MagicDNS 或其他域名,可以把路由问题与域名解析问题分开。

  1. 用外部控制 API 查看命中链:配置了 external-controller 后,查看连接对象中的 chains、rule 和 rulePayload。
curl -s http://127.0.0.1:9090/connections

如果设置了 API 密钥:

curl -s -H 'Authorization: Bearer change-this-secret' \
  http://127.0.0.1:9090/connections

官方 API 文档说明,/connections 会返回活动连接、代理链和命中规则信息;因此要确认连接是否真正经过 Tailscale,重点看 chains 和 rulePayload,不要只看网页是否能打开。

  1. 查看实时日志:
curl -s 'http://127.0.0.1:9090/logs?level=debug'

官方 API 文档列出了 /logs 的实时日志接口。若日志中出现 auth-key、state-dir、权限、控制面或出口节点错误,先处理对应错误,再扩大规则范围。API 参考见Mihomo API 文档。

如果问题表现为域名不通、IP 可通,检查 Mihomo DNS 的 enhanced-mode、fake-ip-filter、nameserver-policy 和实际命中的规则。不要把系统 Tailscale 的 100.100.100.100 解析器直接套到 Mihomo 内嵌 tailscale 出站上;由哪个 DNS 解析 *.ts.net,要结合当前 DNS 配置和日志判断。Mihomo DNS 文档说明了 Fake-IP、真实解析、域名策略和代理节点域名解析的配置关系,可参考Mihomo DNS 配置文档。

排障顺序:auth-key、路由、TUN 与 DNS 分开判断

  1. auth-key 失败:检查密钥是否过期、被撤销、一次性密钥是否已经使用,以及设备审批或标签策略是否阻止注册。重新生成密钥后,不要继续使用已经公开的旧密钥。
  2. state-dir 权限失败:确认运行用户能写入目录;Docker 中确认配置写的是容器内路径,并确认宿主机父目录确实挂载。
  3. Tailnet IP 不通:先查看 /connections 是否命中 Tailscale;若没有命中,检查规则顺序、策略组名称和是否被前面的规则截获。
  4. 子网路由不通:确认对端设备发布了目标网段,管理控制台已批准,且本地网段没有重叠;accept-routes: true 只表示接受已发布路由,不会替对端创建路由。
  5. 出口节点不通:确认出口节点在线、已批准且访问策略允许当前节点使用;同时区分“访问出口节点本身”和“借助出口节点访问公网”。
  6. TUN 开启后异常:先关闭原生 Tailscale 客户端或 Mihomo TUN 的其中一个,分别测试,再恢复另一套。Tailscale 官方说明,多 VPN 并行可能受到防火墙、设备限制和地址冲突影响;iOS 与 Android 还通常限制同时运行多个 VPN。
  7. 域名不通但 IP 可通:检查 Fake-IP 和 DNS 规则,先对一个测试域名使用真实解析或明确的 DNS 策略,再查看日志,不要同时修改多个 DNS 选项。

在 Windows 图形客户端中,TUN 服务模式、防火墙放行和配置目录通常由客户端管理;在 Linux 裸核中,重点是运行用户、state-dir、TUN 设备和路由权限;在 Docker 中,重点是容器内外路径对应关系以及是否真的启用了 TUN。Tailscale 与其他 VPN 的共存建议可参考Can I use Tailscale alongside other VPNs?。

启动后的最终检查清单

判断成功的最低标准是:配置通过、节点完成注册、测试连接命中 Tailscale、目标 Tailnet IP 或已发布子网可达。若其中一项失败,先按层定位,再修改下一项设置。

常见问题

Mihomo 配置 Tailscale 需要什么版本?

Mihomo v1.19.25 的发布说明已经加入 Tailscale outbound support。使用前应确认实际内核能够识别 type: tailscale;如果旧版本无法升级,可改用原生 Tailscale 客户端,或使用 Tailscale userspace networking 提供的 SOCKS5,再让 Mihomo 通过已有 SOCKS5 出站连接。

exit-node 应该填 Tailscale IP 还是主机名?

Mihomo 官方 Tailscale 出站文档明确列出节点 IP,并支持 auto:any。优先填写出口节点的 Tailscale IP,例如 100.64.12.34;不要直接假设普通主机名一定被支持。

Mihomo 的 tailscale 出站和原生 Tailscale 客户端有什么区别?

原生客户端负责创建系统级 Tailnet 接口和路由;Mihomo 的 tailscale 出站是一个可被规则或策略组选择的出站。只想按 IP、域名或网段分流时使用 Mihomo 出站;需要全系统 Tailnet 能力时,优先考虑原生客户端。

为什么写了 accept-routes 还是访问不了家里内网?

accept-routes 只表示 Mihomo 接受对端已经发布的子网路由,不会替你发布或批准路由。请确认对端发布了目标网段、管理控制台已批准、地址没有与本地网段重叠,再检查连接是否命中 Tailscale。

Docker 里的 state-dir 为什么不能写宿主机路径?

配置由容器内 Mihomo 读取,因此 state-dir 必须写容器内路径。例如宿主机 /opt/mihomo 挂载到容器 /root/.config/mihomo 后,配置应写 /root/.config/mihomo/tailscale;该目录实际对应宿主机的 /opt/mihomo/tailscale。

TUN 开启后 Tailscale 连不上怎么办?

先关闭原生 Tailscale 客户端或 Mihomo TUN 的其中一个,分别测试 Tailnet IP 和域名。IP 不通时查规则、路由和权限;IP 可通而域名不通时查 DNS、Fake-IP 和域名解析策略。

是否可以把整个 100.64.0.0/10 都交给 Tailscale?

不建议直接整段导入。该范围是 CGNAT 地址段,运营商或其他 VPN 也可能使用它,容易产生冲突。优先按实际设备 IP 写 /32,或只加入确实使用的 Tailnet 子网;需要 IPv6 时再按实际地址处理 fd7a:115c:a1e0::/48。

相关阅读

参考资料

  1. Tailscale - mihomo docs
  2. Release v1.19.25 · MetaCubeX/mihomo
  3. Auth keys · Tailscale Docs(tailscale.com)
  4. Securely handle an auth key · Tailscale Docs(tailscale.com)
  5. Exit nodes · Tailscale Docs(tailscale.com)
  6. Reserved IP addresses · Tailscale Docs(tailscale.com)
  7. Can I use Tailscale alongside other VPNs? · Tailscale Docs(tailscale.com)
  8. Tun - mihomo docs
  9. DNS configuration - mihomo docs
  10. APIs - mihomo docs
  11. MetaCubeX/metacubexd