关于 tailscale-subnet-router-debug
tailscale-subnet-router-debug 是用于排查 Tailscale 子网路由器连接故障的技能,通过七项有序检查,追踪路由从通告、批准到转发和返回路径的完整过程。
主要功能
- 01七项有序连通性检查
- 02检查路由通告与批准
- 03检查客户端路由接受设置
- 04检查策略路由表 52
- 05验证转发与返回路径
适用场景
- 01排查客户端无法访问子网设备
- 02调查已批准路由未出现在路由表
- 03排查 Docker 子网路由通告
- 04查找响应流量未返回的原因
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ rshade/ agent-skills --skill tailscale-subnet-router-debug安装后在 Claude Code 中输入/tailscale-subnet-router-debug确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
evals/evals.jsonreferences/common-failures.mdpolicy-routing.mdroute-lifecycle.md详细介绍
Tailscale 子网路由器故障排查
诊断并修复 Tailscale 子网路由器连接故障。依次运行七项检查,覆盖从路由通告到返回路径验证的完整路由生命周期。
此技能的功能
- 验证子网路由器是否通告了该路由。
- 确认路由已获批准(通过管理控制台或 autoApprovers)。
- 检查客户端是否接受子网路由(
--accept-routes)。 - 检查策略路由表 52 中是否已安装路由。
- 验证子网路由器是否已启用 IP 转发。
- 测试子网路由器能否直接访问目标。
- 验证响应流量的返回路径。
常见触发情况
- 客户端可以 ping 通子网路由器,但无法访问通告子网上的设备
- 管理控制台显示路由已获批准,但
ip route输出为空 - Docker 容器无法通过
TS_ROUTES通告路由 - 流量可以到达目标,但响应始终无法返回
- “从路由器本身访问正常,但其他客户端不行”
诊断工作流
按顺序运行每一步。遇到首个失败时,先应用修复再继续——后续步骤依赖前面的步骤。
第 1 步 — 验证路由是否已通告
tailscale status --json | jq '.Self.AllowedIPs'
通过: AllowedIPs 中显示子网 CIDR(例如 10.100.0.0/24)。
失败: 仅显示 Tailscale IP。路由未通告。
修复: tailscale set --advertise-routes=<CIDR>。在 Docker 中,检查
TS_ROUTES 环境变量——如果首次启动时身份验证失败,它可能不会生效。
此时可在运行时改用 tailscale set。
第 2 步 — 验证路由是否已获批准
检查管理控制台,或在对等节点上运行:
tailscale status --json | jq '.Peer[] | select(.HostName=="<router>") | .AllowedIPs'
通过: 对等节点所见的路由器 AllowedIPs 中显示子网 CIDR。
失败: 从对等节点的视角仅显示 Tailscale IP。路由正等待批准。
修复: 在管理控制台中批准,或将 autoApprovers 添加到 ACL:
"autoApprovers": {
"routes": { "10.100.0.0/24": ["tag:subnet"] }
}
第 3 步 — 验证客户端是否接受路由
tailscale debug prefs | grep -i route
失败: --accept-routes 为 false(默认值)。即使子网路由已获批准,客户端也会忽略通告的子网路由。
修复: tailscale set --accept-routes=true。在 Docker 中,将
--accept-routes 添加到 TS_EXTRA_ARGS。不要在 Docker 中使用
tailscale down——这会终止 containerboot。请改用 tailscale set。
第 4 步 — 验证策略路由表中的路由
ip route show table 52
通过: 显示指向子网 CIDR、经由 dev tailscale0 的路由。
失败: 表 52 为空,或缺少子网路由。
重要: ip route(不带表参数)只显示主路由表。Tailscale
使用策略路由表 52——路由不会出现在默认输出中。这是最常见的误报。
另请检查:
ip rule show
有关表 52 和 Tailscale 策略路由工作方式的详情,请参阅 references/policy-routing.md。
第 5 步 — 验证子网路由器上的 IP 转发
cat /proc/sys/net/ipv4/ip_forward
通过: 返回 1。
失败: 返回 0。内核会静默丢弃转发的数据包。
修复: sysctl -w net.ipv4.ip_forward=1。在 Docker Compose 中,设置
sysctls: [net.ipv4.ip_forward=1]。如需在 Linux 主机上持久生效,
请将其添加到 /etc/sysctl.d/。
第 6 步 — 验证从子网路由器到目标的网络路径
在子网路由器上运行:
ping <target-ip>
ip addr show
通过: 路由器可以访问目标,并且在通告的子网上有一个接口。
失败: 路由器无法访问目标。这是本地网络问题(防火墙、VLAN、路由), 不是 Tailscale 问题。
第 7 步 — 验证返回路径
目标必须将响应路由回子网路由器。如果目标的默认网关不是子网路由器,返回流量会走不同的路径并被丢弃。
修复: 在目标(或其网关)上添加一条静态路由,将
100.64.0.0/10 指向子网路由器的内部 IP。或者启用伪装:
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Tailscale 1.64+ 默认启用 --snat-subnet-routes,会自动处理此问题。
错误处理
不要默默跳过检查失败。报告具体的失败及修复方法,然后再继续。如果修复需要重启 Tailscale 或重新创建容器,请指导用户执行这些操作,并从第 1 步重新开始。
参考资料
references/route-lifecycle.md— 路由从通告到返回路径的完整 7 阶段生命周期references/policy-routing.md— 表 52、ip rule、VRF 类比,以及ip route为什么无法显示 Tailscale 路由references/common-failures.md— 按症状查找的表格,包含根本原因和修复方法