pages.chenos.dev / workstation / Tailscale 远程访问

手把手:用 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 ...

前面说过不要往宿主机里装东西,为什么 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 这台机器,点右边的 ⋯:

  1. Edit route settings → 勾选 192.168.50.0/24 → Save。这一步是批准子网路由
  2. 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 配置也就失效了。推荐在路由器上绑定:

  1. 在路由器的 DHCP 设置里找到 静态地址分配,也可能叫 IP 与 MAC 绑定、DHCP 保留
  2. 选择 agent-01,或者手动填它的 MAC 地址。MAC 地址在 PVE 里看:agent-01 → 硬件 → 网络设备,virtio= 后面那一串就是
  3. 绑定到想要的 IP,比如 192.168.50.111
  4. 在虚拟机里执行 sudo reboot,让它重新获取 IP

规划成有规律的地址,以后比较好记:

机器IP
PVE 宿主机192.168.50.205
proxy 容器192.168.50.101
agent-01192.168.50.111
agent-02192.168.50.112
agent-03192.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

打开 App,登录和 PVE 同一个账号,打开连接开关。手机默认就会接收子网路由,不需要额外设置。

手机同一时间只能开一个 VPN。Tailscale 和 Clash、Shadowrocket 之类的代理 App 都要占用系统的 VPN 通道,不能同时开。用 Tailscale 连家里的时候,要先关掉代理 App。

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说明
iPhoneTermius界面友好,可以保存多台主机,免费版就够用
iPhoneBlink Shell付费,支持 Mosh,网络不稳定时体验更好
安卓Termius同上
安卓JuiceSSH / Termux免费;Termux 是一个完整的命令行环境

在 App 里添加主机:

连上后执行 tmux attach -t work,就能看到 agent 当前的进度了。

手机上的 tmux 小技巧:手机屏幕窄,Termius 等 App 都可以调小字号。要离开 tmux 会话、让 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

注意事项

下一步:手把手:在 agent 虚拟机上用 T3 Code