跳转至

Tailscale 子网路由与出口节点

一、这页讲什么

Tailscale 默认只连装了客户端的设备。实验室里还有一批连不了客户端的设备:打印机、交换机管理口、树莓派老系统、云上的其他主机。子网路由把整个网段接进 tailnet,让这些设备也能被访问。

出口节点解决另一个问题:让某台设备的全部出网流量从指定节点走。

读完能做到:把一台机器配成子网路由并让其他设备用上;把一台机器配成出口节点并验证出口已切换。

二、开始之前

项 内容
版本与日期 Tailscale 1.9x;2026-10-21 核实
预计耗时 25 分钟
前置 路由设备已加入 tailnet,有管理员权限批准路由;见组网与直连
风险级别 中:路由配置错误会导致内网访问中断

三、动手做

1. 在路由设备上宣告网段

$ sudo tailscale set --advertise-routes=<内网网段>/24
$ tailscale status
# 输出里该设备后面会带 route 标记

路由设备必须同时能访问目标网段与本机网络,通常是那台兼作网关的机器。

看到这个就算成:tailscale status 里该设备显示已宣告的路由。

2. 在控制台批准路由

宣告只是提议,必须由管理员在控制台确认:Machines → 设备 → Route settings → 勾选网段 → Approve。

看到这个就算成:路由状态从 advertised 变为 approved。

3. 在客户端接受路由

$ sudo tailscale set --accept-routes
(成功时没有输出)
$ ip route | grep tailscale
<内网网段> dev tailscale0

客户端默认不接受子网路由,必须显式打开。

看到这个就算成:本机路由表里出现指向该网段的 tailscale 条目,ping 网段内的设备能通。

4. 决定是否关闭 SNAT

默认情况下,子网路由会把来源地址改成自己的地址(SNAT),这样网段里的老设备不用知道 tailnet 的存在。关闭后需要目标设备能回程路由到 tailnet 网段:

$ sudo tailscale set --snat-subnet-routes=false
(成功时没有输出)

这条只在 Linux 路由节点上有效。目标设备需要静态路由指向 tailnet 才行。

看到这个就算成:关闭 SNAT 后,网段内的目标设备仍能回包;不通就说明缺回程路由。

5. 配置出口节点

路由设备宣告出口能力:

$ sudo tailscale set --advertise-exit-node
(成功时没有输出)

控制台同样要批准:Machines → Route settings → Exit node → Approve。

客户端使用出口节点:

$ sudo tailscale set --exit-node=lab-gateway
$ curl -s https://ifconfig.me
203.0.113.9

出口节点的地址就是这里显示的地址。要让局域网直连流量不受影响,加 --exit-node-allow-lan-access。

看到这个就算成:curl 返回的 IP 属于出口节点所在网络,tailscale status 顶部显示正在使用出口节点。

6. 收尾:按需关闭

$ sudo tailscale set --exit-node=
(成功时没有输出)
$ sudo tailscale set --advertise-exit-node=false
(成功时没有输出)

出口节点会让全部流量绕行,临时用完就关,避免无意中一直走别处的网络。

看到这个就算成:tailscale status 不再显示出口节点,curl ifconfig.me 恢复本机公网出口。

四、做完怎么确认

  1. 子网内的设备能用 tailnet 地址访问。
  2. 客户端路由表里有对应条目。
  3. 出口节点切换后公网 IP 变成节点所在网络的 IP。
  4. 知道关闭 SNAT 后需要目标设备配合。

五、卡住了怎么排查

症状 多半是 先验证 处理
网段 ping 不通 路由未批准,或客户端未 accept 控制台路由状态、$ ip route 批准路由;--accept-routes
只有路由节点自己能访问 客户端没接受路由 客户端 $ ip route 打开 accept-routes
关闭 SNAT 后全断 目标设备没有回程路由 目标设备 $ ip route 补静态路由,或恢复 SNAT
出口节点延迟高 流量绕远,或走中继 $ tailscale ping <出口节点>、netcheck 换更近的节点;先修直连
用了出口节点但 DNS 异常 DNS 仍指向本地解析器 $ cat /etc/resolv.conf 保持 accept-dns,或单独指定 DNS
网段里某些设备不通 目标设备自带防火墙 从路由节点直接 $ ping 目标侧放行;必要时换端口验证
出口节点批准后总断 节点本身没转发能力 节点 $ sysctl net.ipv4.ip_forward 打开转发;检查节点 ACL

六、为什么这样能成

子网路由是一台愿意代转的机器。 tailnet 里的请求先到路由节点,再按网段转发到目标设备,目标设备不需要装任何客户端。

SNAT 让老设备不用改配置。 默认把来源改成路由节点地址,回包自然回到路由节点。关掉 SNAT 才能看到真实来源,代价是目标设备要认识 tailnet 网段。

出口节点是默认路由的替代。 客户端把默认路由指向出口节点,所有出网流量经隧道到节点再发出,外部看到的是节点所在网络的地址。

七、边界与替代

  • 不替代正式 VPN 网关:需要多租户、审计与复杂分流时,专用网关更合适。
  • 别把出口节点当长期代理:全流量绕行会放大延迟与带宽成本,按需开关。
  • 子网路由不解决 DNS:网段内的域名解析要单独配 DNS 服务器或在控制台设置全局 DNS。
  • 同一网段别有两个宣告者:冲突时流量走哪台不可控。

八、官方资料

核实日期:2026-10-21。