利用 Tailscale Subnet Router 实现内外网无感切换
0. 核心原理
子网路由 (Subnet Router) 允许你将某台位于内网的设备(如开发机)作为”网关”。当你不在内网时,Tailscale 会自动将发往内网段(如 192.168.1.x)的流量通过加密隧道转发至该网关,从而实现像在局域网内一样直接访问 GitLab、数据库或 SSH 设备。
1. 环境准备
- 宣告者 (Advertiser):一台位于目标内网、24 小时不关机的 Linux 设备(以下简称”跳板机”)。
- 接受者 (Acceptor):你的移动办公设备(如 MacBook)。
2. 跳板机配置 (Linux)
第一步:开启内核转发
必须允许 Linux 内核转发来自虚拟网卡的流量。
# 开启 IPv4 转发
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.conf
# 使配置立即生效
sudo sysctl -p第二步:宣告公司内网段
在跳板机上运行以下命令,将目标内网实际使用的网段(用逗号分隔)告知 Tailscale 网络。
# 示例网段:192.168.1.0/24 和 10.0.0.0/16
sudo tailscale up --advertise-routes=192.168.1.0/24,10.0.0.0/16注:该配置会自动持久化,重启设备后无需重新输入。
3. 管理后台授权 (Web)
出于安全考虑,宣告的路由必须经过手动批准才能生效:
- 登录 Tailscale Admin Console。
- 找到对应的跳板机设备。
- 点击 Edit route settings。
- 在 Subnet routes 列表中,手动勾选你刚才宣告的网段并点击确认。
4. 客户端配置 (Mac/Windows/iOS)
为了让你的电脑“接受”这些远程路由,需要开启相关设置:
- macOS / Windows: 点击状态栏 Tailscale 图标 → Settings → Route Settings → 勾选 Use Tailscale Subnets。
- Linux: 运行
sudo tailscale up --accept-routes。
5. 实现无感切换效果
配置完成后,你将获得以下体验:
SSH 配置简化
你的 ~/.ssh/config 不再需要 ProxyJump。无论在内网还是外网,统一使用内网 IP:
Host dev-machine
HostName 192.168.1.x # 直接写内网 IP
User username浏览器/应用透明访问
- GitLab: 直接在浏览器输入
http://192.168.1.x即可访问。 - 其他内网服务: 能够跨地域直接通过内网 IP 进行访问和通信。
6. 注意事项与安全建议
- 网段冲突检测:请确保你本地的路由器网段与远程内网网段不重合。若发生重合,本地路由优先级更高,会导致无法访问远程资源。建议将本地网段修改为较冷门的数值(如
192.168.50.x)。 - 防火墙策略:如果能连接跳板机但无法访问其同网段的其他机器,请检查跳板机的防火墙(如
ufw或iptables)是否允许转发。