子网路由器
子网路由器允许您的 tailnet 设备访问本地网络中的其他设备,即使这些设备没有安装 Tailscale。
什么是子网路由器?
子网路由器是一个运行 Tailscale 的设备,它将本地网络子网广播到 tailnet,使其他 tailnet 设备可以访问该子网内的所有设备。
工作原理
Tailnet 设备 ────► 子网路由器 ────► 本地网络设备
│ │ │
│ │ │
100.x.x.x 100.x.x.x 192.168.1.x使用场景
- 访问家庭网络中的设备(NAS、打印机等)
- 访问办公室网络资源
- 访问云服务器的私有子网
- 连接 IoT 设备
设置子网路由器
第一步:选择路由器设备
选择一个设备作为子网路由器:
- 运行 Linux 的服务器
- Raspberry Pi
- 云服务器
- 路由器(如果支持 Tailscale)
第二步:安装 Tailscale
在路由器设备上安装 Tailscale:
bash
curl -fsSL https://tailscale.com/install.sh | sh第三步:广播子网
使用 --advertise-routes 选项:
bash
# 广播单个子网
sudo tailscale up --advertise-routes=192.168.1.0/24
# 广播多个子网
sudo tailscale up --advertise-routes=192.168.1.0/24,10.0.0.0/8第四步:批准路由器
在管理控制台批准子网路由器:
- 登录 Tailscale 管理控制台
- 找到路由器设备
- 点击"..."菜单
- 选择"Approve routes"
第五步:验证连接
在其他设备上测试:
bash
# Ping 子网设备
ping 192.168.1.100
# 连接到子网服务
ssh user@192.168.1.100高级配置
多个子网路由器
可以设置多个子网路由器提供冗余:
bash
# 在设备 A 上
sudo tailscale up --advertise-routes=192.168.1.0/24
# 在设备 B 上
sudo tailscale up --advertise-routes=192.168.1.0/24Tailscale 会自动选择可用的路由器。
高可用性(HA)
设置高可用子网路由器:
bash
# 所有路由器都使用相同的子网广告
tailscale up --advertise-routes=192.168.1.0/24特性:
- 自动故障转移
- 负载均衡
- 无需额外配置
IPv6 子网
广播 IPv6 子网:
bash
sudo tailscale up --advertise-routes=fd00::/8限制子网访问
使用 ACL 限制谁可以访问子网:
json
{
"acls": [
{
"action": "accept",
"src": ["group:admins"],
"dst": ["192.168.1.0/24:*"]
},
{
"action": "accept",
"src": ["group:developers"],
"dst": ["192.168.1.100:80"]
}
]
}客户端配置
自动接收路由
默认情况下,客户端会自动接收已批准的子网路由。
手动接收路由
如果需要手动接收特定路由:
bash
tailscale up --accept-routes查看路由状态
bash
tailscale status输出会显示子网路由:
100.100.100.100 subnet-router alice@example.com linux -
subnet: 192.168.1.0/24查看路由表
bash
tailscale routesLinux 上的高级配置
IP forwarding
启用 IP forwarding:
bash
# 临时启用
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1
# 永久启用
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv6.conf.all.forwarding=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -piptables 配置
如果使用 iptables,可能需要配置 NAT:
bash
# 启用 MASQUERADE
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE防火墙配置
确保防火墙允许转发:
bash
# UFW
sudo ufw allow forwarding
# firewalld
sudo firewall-cmd --add-forward示例场景
家庭网络访问
设置 Raspberry Pi 作为子网路由器:
bash
# 在 Raspberry Pi 上
sudo tailscale up --advertise-routes=192.168.0.0/24访问家庭 NAS:
bash
# 在远程设备上
ssh user@192.168.0.100云服务器私有子网
访问 AWS VPC 私有子网:
bash
# 在 VPC 内的 EC2 实例上
sudo tailscale up --advertise-routes=10.0.1.0/24访问私有数据库:
bash
# 从 tailnet 设备访问
mysql -h 10.0.1.50 -u user -p办公室网络
访问办公室打印机:
bash
# 在办公室服务器上
sudo tailscale up --advertise-routes=172.16.0.0/12使用打印机:
bash
# 配置打印机 IP
lpadmin -p Printer -v 172.16.1.100故障排除
无法访问子网设备
检查步骤:
- 确认子网路由已批准
- 确认客户端接受路由
- 确认 IP forwarding 已启用
- 检查防火墙设置
- Ping 子网路由器设备
路由器不显示子网
可能原因:
- 子网未正确广告
- 路由器未在管理控制台批准
- ACL 限制访问
检查:
bash
tailscale status性能问题
优化建议:
- 使用高性能设备作为路由器
- 确保良好的网络连接
- 考虑多个路由器分担负载
- 检查防火墙规则
冲突路由
如果多个路由器广告相同的子网:
- Tailscale 会自动选择一个
- 可以手动指定使用哪个路由器
- 使用 ACL 控制优先级
最佳实践
1. 选择合适的位置
子网路由器应该:
- 位于子网内部
- 有稳定的连接
- 有足够的性能
2. 设置冗余
多个子网路由器提供:
- 高可用性
- 负载均衡
- 故障恢复
3. 使用 ACL
限制访问提高安全性:
json
{
"acls": [
{
"action": "accept",
"src": ["group:authorized"],
"dst": ["192.168.1.0/24:*"]
}
]
}4. 监控状态
定期检查路由器状态:
bash
tailscale status
tailscale ping subnet-router5. 文档化
记录:
- 子网路由器位置
- 广播的子网范围
- ACL 配置
- IP 地址分配