外观
子网路由
子网路由(Subnet Router)让网络里的设备能访问某个网段里的真实内网地址, 而不是只能访问接入设备本身。典型场景:让出差的人直接访问办公室 192.168.1.x 的打印机、NAS 内网地址、或只能在内网访问的管理后台。
场景示意
[笔记本/手机] ── tailnet ──> [路由器(子网路由)] ──> 192.168.1.0/24
├ 192.168.1.10 NAS
└ 192.168.1.20 打印机第一步:在设备上声明
在作为子网路由的那台设备上(建议用常开的服务器或路由器,不要用笔记本):
sh
sudo tailscale set --advertise-routes=192.168.1.0/24声明多个网段用逗号分隔:--advertise-routes=192.168.1.0/24,10.0.0.0/8。
第二步:到控制台批准
路由永不自动批准。去控制台「路由」页:
- 找到这条待审批的路由(通常半分钟内出现,或用右上角「立即同步」);
- 点「批准」。批准的同时会写一条 ACL 放行规则。
只批准不放行 = 依然连不上
控制台批准路由时会同时建一条 ACL 规则放行它——这是它「点一下就能用」的原因。 但有些历史数据可能只有批准、没有放行(「路由」页会标红提示)。这种情况请 撤销后重新批准,或联系平台管理员。
第三步:让访问方设备接受路由(Linux / 命令行需要)
并不是所有客户端默认就「认」子网路由。Windows / macOS GUI / iOS / Android 默认已开启,但 Linux 和 macOS 命令行(tailscaled)默认是关闭的—— 不开启的话,即使路由已批准,访问方设备也不会安装这些路由,表现就是 「别处都能通、就这台不通,日志没有任何提示」。
在需要访问子网的每台设备上执行一次:
sh
sudo tailscale set --accept-routesTIP
tailscale set --accept-routes 是逐台设备开的:一台 Linux 笔记本开一次就好, 同网络里其它 Linux 机器各自也要开。当 tailscale status 提示 Some peers are advertising routes but --accept-routes is false、 或子网路由没装上时,照上面执行。
第四步:访问
在任意成员设备上直接访问网段里的真实地址:
sh
ping 192.168.1.10
ssh myuser@192.168.1.20 # 用局域网地址,而不是 100.x子网路由设备自身的注意点
- 别把自己也路由了:
--advertise-routes声明的是“其它设备”要访问的网段, 子网路由这台机器访问网段是正常的; - 出口节点 ≠ 子网路由:一个是“把流量从这台设备转发到公网”, 一个是“转发到某个内网网段”,两回事;
- 反向路径过滤(部分 Linux 默认开启):如果子网里的机器回复包被丢弃, 需要在该主机上允许转发(
sysctl net.ipv4.ip_forward=1), 并在防火墙放行转发链; - 改名 / 重装:子网路由声明跟随设备,重装后要重新
set --advertise-routes。
常见问题
Q:批准后还是 ping 不通? 按顺序查:① 访问方设备是否已 tailscale set --accept-routes (Linux 最常见);② 设备是否在线;③ 子网路由所在主机是否真的可以访问目标网段 (在它上面直接 ping 一次);④ 路由页是否已批准(且不是「只批准未放行」); ⑤ 目标设备是否有防火墙放行来源。
Q:要不要为每个网段单独声明? 合并成一个更大的网段可以减少维护,但也会放大“允许访问哪个网段”的范围, 按实际需要取舍。
Q:子网路由的 ACL? 默认「成员互通」覆盖不到子网背后的地址——批准动作已经为你写了放行规则。 如果想限制谁能访问这个网段,编辑「访问控制」里对应的那条规则即可。