外观
Tailscale 容器
Tailscale 是基于 WireGuard 的组网工具:给你所有设备分配一个私有网段的固定地址(100.x.x.x),设备之间直接点对点连接,不需要自己维护端口转发、动态 DNS 或 VPN 服务器。免费版够大多数个人使用,团队协作和更细的访问控制在付费方案里。
单独开一台容器跑 Tailscale,比在每个客户机里都装一份更好管理:可以把这台容器配置成子网路由器 (subnet router),让 Tailscale 网络里的其他设备直接访问你整个内网,而不用在每台机器上单独装客户端。
适合谁
| 需求 | 建议 |
|---|---|
| 只想远程访问某一台机器 | 直接在那台机器上装 Tailscale 客户端更简单 |
| 想从外面访问整个内网(NAS、PVE 管理界面等),又不想每台都装 | 合适,用本文的子网路由器方案 |
| 想让出门的设备也走家里的公网 IP 上网 | 可以把这台容器同时配成出口节点 (exit node),见下文 |
| 已经在用其他反向代理/VPN 方案 | 对比取舍见安全地远程访问 |
子网路由器和出口节点会把整段网络暴露给你的 Tailscale 账号
一旦这台容器被批准为子网路由器,你 Tailscale 账号下所有设备(以及你邀请加入这个 tailnet 的任何人)都可能访问到被广播的那段内网。出口节点则会让对应设备的全部互联网流量经过你家的网络出去。
开始之前想清楚:
- 谁会被加入这个 tailnet?只有自己,还是也会分享给别人?
- 内网里有没有本来就不该被远程访问到的设备(比如管理网段)?建议只广播真正需要远程访问的网段,而不是整个内网。
- 回退方式:在 Tailscale 管理后台 撤销这台机器的子网路由/出口节点权限,或者直接停用这台容器,相关访问立刻失效。
资源规划
| 项 | 建议 | 说明 |
|---|---|---|
| 形态 | 非特权 LXC 容器,Debian 模板 | Tailscale 官方明确支持非特权容器,不需要用特权容器换取功能 |
| vCPU | 1 | 转发流量的开销很小 |
| 内存 | 512 MB | 足够 |
| 磁盘 | 4–8 GB | 只放程序和状态文件 |
第一步:给容器接上 /dev/net/tun
Tailscale 不需要内核模块或特权操作,但需要访问 TUN 设备(/dev/net/tun)来建立隧道,而非特权容器默认没有这个设备。以 Tailscale 官方文档:LXC 容器 为准,有三种做法,任选一种:
方式一:Web UI(较新版本 PVE)
容器 → 资源 → 添加 → Device Passthrough,Device Path 填 /dev/net/tun,确认后重启容器。
方式二:pct set 命令
在宿主机 shell执行(<ctid> 换成容器编号):
sh
pct set <ctid> --dev0 /dev/net/tun
pct set <ctid> --features keyctl=1,nesting=1方式三:手动改配置文件(容器需处于关闭状态)
编辑 /etc/pve/lxc/<ctid>.conf,加入:
text
lxc.cgroup2.devices.allow: c 10:200 rwm
lxc.mount.entry: /dev/net/tun dev/net/tun none bind,create=file改完启动容器。
不想给 TUN 权限也能用
Tailscale 支持用户空间联网模式,完全不需要额外权限,但只有 Tailscale 自己的命令能用 100.x.x.x 地址,容器里其他程序(curl、ssh 等)无法直接访问 tailnet 里的地址。日常使用建议还是给 TUN 权限,细节见 Tailscale 官方文档。
第二步:安装并登录 Tailscale
按创建第一个容器建好容器(记得按上一步接好 TUN 设备),在容器内部按 Tailscale 官方 Linux 安装文档安装:
sh
# 在容器内部执行
curl -fsSL https://tailscale.com/install.sh | sh
tailscale uptailscale up 会给出一个登录链接,在浏览器里打开并用你的账号(Google、GitHub、Microsoft 等)授权,这台容器就会出现在你的 tailnet 里。
第三步(可选):配成子网路由器 / 出口节点
只想让这台容器本身可以被远程访问,做完第二步就够了。要让它代表整个内网或代理出口流量,还需要两步。
先在容器内部打开转发:
sh
# 在容器内部执行
cat <<'EOF' > /etc/sysctl.d/99-tailscale.conf
net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1
EOF
sysctl -p /etc/sysctl.d/99-tailscale.conf再用对应参数重新登录(<内网网段> 换成你要开放的网段,例如 192.168.1.0/24;不需要出口节点就去掉 --advertise-exit-node):
sh
# 在容器内部执行
tailscale up --advertise-routes=<内网网段> --advertise-exit-node广播路由默认不会生效,需要手动批准
执行完 tailscale up 后,还要到 Tailscale 管理后台 里找到这台机器,手动批准广播的子网路由(Subnets)和/或出口节点。这是一道有意设计的确认步骤,不要觉得没生效就是配置错了。
检查结果
- Tailscale 管理后台能看到这台容器上线,状态正常。
- 在另一台已经登录同一 tailnet 的设备上,
tailscale ping <这台容器的 100.x.x.x 地址>能通。 - 如果配置了子网路由:在批准路由后,从另一台设备访问广播网段里的一个内网服务(比如 PVE 的 Web UI 或 NAS),确认能连通。
- 如果配置了出口节点:在客户端选择通过这个出口节点上网后,访问一个 IP 查询网站,确认显示的是家里的公网 IP。
- 重启容器(
pct reboot <ctid>),确认tailscale status显示已连接,不需要人工重新登录。
常见问题
tailscale up 报错找不到 TUN 设备 / tailscaled 连不上。 说明第一步的设备映射没生效,检查容器是否重启过、/etc/pve/lxc/<ctid>.conf 里的两行是否都在、以及是不是在容器运行中编辑了配置文件(PVE 的集群文件系统在容器运行时可能不允许保存,需要先关机)。
广播了路由但其他设备访问不到内网。 先确认在管理后台批准了这条路由;再确认容器内 net.ipv4.ip_forward 确实是 1;如果内网设备的默认网关不是这台容器,还需要确认 tailnet 侧的路由表配置正确。
用作出口节点后,某些内网设备访问不了了。 出口节点会把全部流量导出去,如果你只想要访问内网、不想连出口的互联网流量也绕一圈,不要开 --advertise-exit-node,只用 --advertise-routes。
想限制哪些人能访问这个 tailnet。 到 Tailscale 管理后台的访问控制(ACL)里按需限制,不要依赖「反正只有我知道」。