手把手:用 Tailscale 从外网访问 PVE 和 agent 虚拟机
在 PVE 宿主机上装一次 Tailscale 并开启子网路由,笔记本和手机在任何地方都能用内网 IP 直接访问 PVE、代理面板和每一台 agent 虚拟机,虚拟机里什么都不用装。
要不要装
| 你的情况 | 要不要装 |
|---|---|
| 只在家里用,电脑和工作站连的是同一个路由器 | 不用装,直接用内网 IP 连接就行 |
| 要在公司、咖啡厅或者用手机远程连回来 | 要装 |
整体结构
推荐只在 PVE 宿主机上装 Tailscale,并开启“子网路由”:
外面的笔记本 / 手机(装 Tailscale 客户端)
│ Tailscale 加密通道
▼
PVE 宿主机(装 Tailscale,转发整个家庭网段)
├── 192.168.50.205 PVE 网页管理
├── 192.168.50.101 proxy 容器(mihomo 面板)
├── 192.168.50.111 agent-01
└── 192.168.50.112 agent-02 ...
- 只装一处,整个家庭网段都能访问到,每台虚拟机里都不用装。
- 在外面也可以直接用内网 IP 连接,
~/.ssh/config里的配置不用改。 - 对虚拟机来说,就像有人在家里的局域网里连它一样,它感觉不到 Tailscale 的存在。
前面说过不要往宿主机里装东西,为什么 Tailscale 又建议装在宿主机上?
- Tailscale 只是一个安装包,很干净,不会把系统搞乱
- 装在宿主机上,就算哪个容器或虚拟机挂了,你在外面依然能登录 PVE 网页去修。如果装在容器里,容器一挂,远程访问就跟着断了
第一部分:在 PVE 宿主机上安装
1.1安装 Tailscale
PVE 网页 → 点节点名 → Shell:
# 临时借用 mihomo 代理下载,速度更快
export http_proxy=http://192.168.50.101:7890 https_proxy=http://192.168.50.101:7890
curl -fsSL https://tailscale.com/install.sh | sh
unset http_proxy https_proxy
1.2开启转发
让外面的设备能通过宿主机访问整个家庭网段:
cat > /etc/sysctl.d/99-tailscale.conf <<'EOF' net.ipv4.ip_forward = 1 net.ipv6.conf.all.forwarding = 1 EOF sysctl -p /etc/sysctl.d/99-tailscale.conf
1.3启动并声明子网路由
# 换成你自己的网段
tailscale up --advertise-routes=192.168.50.0/24
执行完会输出一个登录链接。复制到浏览器里打开,登录你的 Tailscale 账号(可以用 Google、GitHub 或微软账号)。
第二部分:在 Tailscale 后台批准设置
打开 login.tailscale.com/admin/machines,找到 pve 这台机器,点右边的 ⋯:
- Edit route settings → 勾选
192.168.50.0/24→ Save。这一步是批准子网路由 - Disable key expiry:关掉登录过期。不关的话,大约半年后要重新登录,服务器就会突然连不上
pve 那一行会出现 Subnets 标记。第三部分:查出并固定虚拟机的 IP
本文的 192.168.50.111 只是举例。虚拟机的 IP 是安装时由路由器自动分配(DHCP)的,要实际查一下。
3.1查 IP(任选一种)
方法 1:在 PVE 网页上看(最方便)
左侧点 agent-01 → 概要,右边的 IP 地址 一栏会显示出来。
如果这里显示 “QEMU Guest Agent 未运行”:
- 确认虚拟机里已经执行过
sudo apt install -y qemu-guest-agent - 确认虚拟机的 选项 → QEMU Guest Agent 是“已启用”
- 然后把虚拟机完全关机,再开机。注意直接重启有时候不生效
方法 2:进虚拟机里查
在 PVE 里点 agent-01 → 控制台,登录后执行:
hostname -I # 输出的第一个地址就是它的 IP
方法 3:在路由器后台查
登录路由器管理页面(一般是 192.168.50.1),找到 DHCP 客户端列表 或 已连接设备,里面名字是 agent-01 的那一项就是。
3.2把 IP 固定下来
DHCP 分配的 IP 可能会变。比如路由器重启后,agent-01 可能就换了地址,SSH 配置也就失效了。推荐在路由器上绑定:
- 在路由器的 DHCP 设置里找到 静态地址分配,也可能叫 IP 与 MAC 绑定、DHCP 保留
- 选择
agent-01,或者手动填它的 MAC 地址。MAC 地址在 PVE 里看:agent-01 → 硬件 → 网络设备,virtio=后面那一串就是 - 绑定到想要的 IP,比如
192.168.50.111 - 在虚拟机里执行
sudo reboot,让它重新获取 IP
规划成有规律的地址,以后比较好记:
| 机器 | IP |
|---|---|
| PVE 宿主机 | 192.168.50.205 |
| proxy 容器 | 192.168.50.101 |
| agent-01 | 192.168.50.111 |
| agent-02 | 192.168.50.112 |
| agent-03 | 192.168.50.113 |
第四部分:电脑连接
4.1安装客户端
到 tailscale.com/download 下载对应系统的客户端,登录和 PVE 同一个账号,状态显示 Connected 就行。
Linux 电脑要多做一步:Linux 默认不接收子网路由,需要执行一次:
sudo tailscale up --accept-routes
Windows、macOS、手机默认就会接收,不用额外设置。
4.2用 SSH 进入虚拟机
ssh dev@192.168.50.111
# 如果 ~/.ssh/config 里已经配好了别名
ssh agent-01
4.3用 VS Code 进入
和在家里一样:按 F1 → Remote-SSH: Connect to Host → 选 agent-01。
4.4进到 agent 正在运行的会话
tmux attach -t work
4.5虚拟机连不上时的备用办法
浏览器打开 https://192.168.50.205:8006 登录 PVE → 选中虚拟机 → 控制台。这相当于直接看虚拟机的屏幕,就算 SSH 坏了,也能从这里进去修。
第五部分:手机连接
5.1安装 Tailscale App
- iPhone:在 App Store 搜索 Tailscale。注意需要非国区的 Apple ID 才能下载
- 安卓:从 Google Play 安装,或者到 tailscale.com/download 下载 APK
打开 App,登录和 PVE 同一个账号,打开连接开关。手机默认就会接收子网路由,不需要额外设置。
5.2用手机能做什么
| 想做什么 | 怎么访问 |
|---|---|
| 管理虚拟机 | 手机浏览器打开 https://192.168.50.205:8006。PVE 有手机版界面,会自动适配屏幕 |
| 切换代理节点 | 浏览器打开 http://192.168.50.101:9090/ui |
| 看 agent 进度、下指令 | 用 SSH App 连到虚拟机,执行 tmux attach |
5.3安装 SSH App
| 系统 | App | 说明 |
|---|---|---|
| iPhone | Termius | 界面友好,可以保存多台主机,免费版就够用 |
| iPhone | Blink Shell | 付费,支持 Mosh,网络不稳定时体验更好 |
| 安卓 | Termius | 同上 |
| 安卓 | JuiceSSH / Termux | 免费;Termux 是一个完整的命令行环境 |
在 App 里添加主机:
- 地址:
192.168.50.111(agent-01 的 IP) - 用户名:
dev - 认证方式:密码,或者在 App 里生成一对密钥,再把公钥加到虚拟机的
~/.ssh/authorized_keys里
连上后执行 tmux attach -t work,就能看到 agent 当前的进度了。
Ctrl+B 再按 D。Termius 的虚拟键盘上方有 Ctrl 键可以用。5.4网络不稳定时用 Mosh(可选)
手机经常在 Wi-Fi 和 4G/5G 之间切换,普通 SSH 一切换就会断开。Mosh 可以在网络切换后自动恢复连接。在虚拟机里装一下:
sudo apt install -y mosh
然后在 Blink Shell 或 Termius 里,把连接方式选成 Mosh。再配合 tmux,就算地铁里信号断断续续,agent 也不受影响,连接恢复后画面也能接上。
连不上时逐项排查
| 检查什么 | 怎么检查 | 不正常时怎么办 |
|---|---|---|
| 设备是否连上 Tailscale | 在电脑上执行 tailscale status,能看到 pve 在线 | 打开 Tailscale 客户端重新连接 |
| 子网路由是否已批准 | Tailscale 后台 pve 那一行有 Subnets 标记 | 进 Edit route settings 勾选网段 |
| PVE 宿主机能不能连上 | ping 192.168.50.205 | 在 PVE 上执行 tailscale status 检查 |
| 虚拟机能不能连上 | ping 192.168.50.111 | 在 PVE 上执行 sysctl net.ipv4.ip_forward,结果应该是 1 |
| Linux 电脑 | ping 不通,但 Tailscale 显示已连接 | 执行 sudo tailscale up --accept-routes |
| 手机 | Tailscale 开着,但打不开页面 | 确认已经关掉 Clash 等代理 App |
注意事项
- 网段冲突:如果你在外面连的网络(比如公司网络)恰好也是
192.168.50.x,就会和家里的地址冲突。192.168.50.x是华硕路由器的默认网段,不算少见;真遇到了,再考虑把家里改成更少见的网段,比如10.10.0.x(详见 规划网段和 IP)。 - 在国内的速度:Tailscale 会优先让两台设备直接连接,速度很快。如果直连不成功,流量就会绕到海外的中继服务器,速度会明显变慢。执行
tailscale status可以看连接方式:显示direct是直连,显示relay是走中继。 - 虚拟机不在 Tailscale 设备列表里:虚拟机没有加入 Tailscale,后台看不到它们,Tailscale 自带的设备名(MagicDNS)也用不了。直接用内网 IP,或者用
~/.ssh/config里的别名就行。如果以后想让某一台虚拟机单独出现在 Tailscale 里(比如要分享给别人访问),可以只在那一台里再装一次。 - 替代方案:ZeroTier,或者国内的蒲公英、节点小宝等组网工具,原理都差不多。Cloudflare Tunnel 适合发布网页,SSH 登录还是 Tailscale 更顺手。