Tailscale 日常使用与子网路由排障
本文用于 Tailscale 日常状态检查、节点连通性验证和 Linux 子网路由排障。当前已记录的实际网络拓扑见 个人局域网环境 > Tailscale 私有网络。
核心概念
| 功能 | 含义 | Linux 关键选项 |
|---|---|---|
| Tailscale 节点 | 通过 100.x.y.z 地址直接访问另一台已入网设备 | 无需子网路由 |
| 子网路由器 | 代理访问未安装 Tailscale 的局域网设备 | --advertise-routes |
| 子网路由客户端 | 接受并使用其他节点发布的子网路由 | --accept-routes |
| Exit Node | 将默认互联网流量交给指定 Tailscale 节点 | --advertise-exit-node、--exit-node |
发布路由不等于客户端已经使用路由
子网路由需要同时经过“路由器发布 → Tailnet 批准 → 客户端接受”三个阶段。其中任何一步缺失,访问端的数据包都不会进入子网路由器。
当前环境
| 节点 | Tailscale IP | 角色 |
|---|---|---|
213 / ext-213 | 100.100.71.213 | 子网路由器,发布 192.168.71.0/24 |
18 / racknerd-feaf32b | 100.100.71.18 | 普通 Tailscale 节点,当前不接受子网路由 |
flowchart LR Client[Linux 客户端] -->|accept-routes=true| Tailnet[Tailscale] Tailnet --> Router[213<br>advertise 192.168.71.0/24] Router --> Gateway[192.168.71.1] Router --> Hosts[212 / 214 / 215]
日常检查命令
查看节点状态
tailscale status
tailscale ip -4tailscale status 用于查看本机是否已连接 Tailnet、其他节点是否在线以及当前连接类型。
验证 Tailscale 节点连通性
tailscale ping 100.100.71.213
tailscale ping 100.100.71.18tailscale ping 只验证 Tailnet 节点间连通性。它成功不代表客户端已接受 192.168.71.0/24 子网路由。
查看客户端是否接受路由
tailscale debug prefs | grep -E 'RouteAll|WantRunning'
ip route show table 52
ip route get 192.168.71.1判断要点:
RouteAll: true表示客户端允许接受发布的路由。- Tailscale 在 Linux 上通过策略路由工作,相关路由通常位于路由表
52。 - 如果
192.168.71.0/24不在表52中,数据包通常不会走tailscale0。
配置子网路由
路由器端
Linux 子网路由器首先需要开启 IP 转发,然后发布目标网段:
sysctl net.ipv4.ip_forward
sudo tailscale set --advertise-routes=192.168.71.0/24发布后还需要在 Tailscale 管理控制台批准该路由,或使用 tailnet policy 的 autoApprovers 自动批准。
Linux 客户端
Linux 默认不使用已发布的子网路由。需要访问远程局域网时执行:
sudo tailscale set --accept-routes=true如果不希望该 Linux 节点使用任何子网路由:
sudo tailscale set --accept-routes=falseNote
--accept-routes=true只会让本机使用其他节点提供的路由,不会使本机成为子网路由器。只有配置--advertise-routes的节点才承担子网路由角色。
案例:18 无法 Ping 192.168.71.1
现象
18 可以通过 tailscale ping 100.100.71.213 访问 213,但无法 Ping 局域网网关 192.168.71.1。
检查结果
RouteAll: false
192.168.71.1 via 172.245.71.1 dev eth0
Tailscale table 52 中无 192.168.71.0/24原因
213 已经发布子网路由,但 18 没有接受该路由。因此数据包从 18 的公网网关 172.245.71.1 发出,根本没有到达 213。
当客户端接受路由后,预期路径为:
18 → tailscale0 → 213 → 192.168.71.1当前 18 保持 accept-routes=false,因此不使用 213 发布的局域网路由。如果后续需要从 18 访问局域网,再显式开启 accept-routes。
子网路由排障顺序
- 用
tailscale status确认两端都已连接 Tailnet。 - 用
tailscale ping <路由器 Tailscale IP>确认客户端能到达路由器。 - 在路由器上确认 IP 转发已开启,并且
AdvertiseRoutes包含目标网段。 - 在 Tailscale 管理控制台确认该子网路由已批准。
- 在 Linux 客户端确认
accept-routes=true。 - 用
ip route show table 52确认目标网段已注入。 - 如果路由已注入但仍无法访问,检查路由器防火墙、SNAT 与局域网回程路由。
- 检查访问端本地是否也使用了相同网段;重叠子网可能改变路由优先级。