最稳妥的做法是通过 Tailscale 管理后台配置访问控制列表(ACL),限制节点间的通信权限,同时在操作系统层面开启本地防火墙作为第二道防线。
先说结论:默认情况下 Tailscale 网络内节点互通,需手动收缩权限以降低风险。
- 先判断:确认哪些服务需要对外暴露,哪些仅限特定节点访问
- 优先做:在 Admin Console 中编写 ACL 规则,默认拒绝未明确允许的流量
- 再验证:使用受限节点尝试访问目标端口,确认策略生效
为什么需要加固
Tailscale 组建的是一个可信私有网络,默认策略倾向于方便互联,即同一网络内的 authenticated 用户设备通常可以互相访问。如果不加限制,一旦某个节点失陷,攻击者可以利用该节点扫描并攻击网络内的其他设备。通过 ACL 可以实现零信任架构,即使节点在同一网络,也需要明确授权才能通信。
实操步骤
1. 配置访问控制列表(ACL)
登录 Tailscale Admin Console,进入 Access Controls 页面。默认配置通常允许所有用户互访。你需要修改 HuJSON 格式的策略文件。以下是完整的配置模板示例,请根据实际情况修改:
{
"groups": {
"group:dev": ["user1@example.com", "user2@example.com"]
},
"hosts": {
"db-server": "100.100.100.100"
},
"acls": [
{
"action": "accept",
"src": ["group:dev"],
"dst": ["db-server:22", "db-server:5432"]
},
{
"action": "accept",
"src": ["autogroup:members"],
"dst": ["autogroup:members:22"]
}
]
}
注意:ACL 策略保存后会立即下发。修改前务必备份默认配置,并确保保留对自己当前设备的访问权限(尤其是 SSH 端口),避免把自己锁在门外。
2. 开启本地防火墙
不要完全依赖 Tailscale 的 ACL,建议在操作系统层面也做限制。确保防火墙允许 tailscale0 接口的流量,但拒绝其他不必要的入站连接。
Ubuntu (UFW) 配置示例:
# 查看当前防火墙状态
sudo ufw status
# 放行 tailscale0 接口的入站流量
sudo ufw allow in on tailscale0
# 启用防火墙(确保先放行了 SSH 和 tailscale0)
sudo ufw enable
CentOS (Firewalld) 配置示例:
# 将 tailscale0 接口添加到 trusted 区域
sudo firewall-cmd `--zone`=trusted `--add-interface`=tailscale0 `--permanent`
sudo firewall-cmd `--reload`
3. 检查服务监听配置
检查节点上是否有服务监听在 0.0.0.0。如果可能,让服务只监听 localhost 或特定的 Tailscale IP。
# 查看所有监听端口及对应进程
ss -tulpn | grep LISTEN
# 筛选特定端口检查
ss -tulpn | grep 5432
如果发现敏感服务监听在 0.0.0.0,建议修改服务配置绑定到 127.0.0.1 或具体的 Tailscale IP 地址。
怎么验证是否生效
找一台不在允许列表内的设备,尝试 telnet 或 nc 连接目标端口。如果连接被拒绝或超时,说明策略生效。
# 测试端口连通性
nc -zv 100.100.100.100 5432
同时可以在 Admin Console 的 Logs 页面查看是否有被拒绝的连接尝试记录(Deny 日志)。
常见坑
- ACL 语法错误:会导致策略无法应用,修改前建议备份默认配置,使用 JSON 校验工具检查格式。
- 把自己锁在门外:修改 ACL 时确保保留对自己当前设备的访问权限,尤其是 SSH 端口。
- 本地防火墙冲突:某些系统防火墙可能会拦截 tailscale0 接口的流量,需放行该接口,否则内网互通会失败。
参考来源
Tailscale Knowledge Base: Access control lists (ACLs) https://tailscale.com/kb/1018/acls/
Tailscale Knowledge Base: Firewalls https://tailscale.com/kb/1155/firewalls/