本文介绍免费注册开通 QwenPaw,并以跑在容器里的 QwenPaw 实例为例,手把手教你通过 Tailscale、Cloudflare Zero Trust Tunnel 暴露 SSH 服务,并给出 6 种客户端连接方案(Tailscale 组网 / FinalShell / 原生 ssh / VPS 中转 / WARP / 浏览器渲染),总有一种适合你的网络环境。

太长不看:个人使用首推 Tailscale 组网(方案一),最简最安全;多设备免安装选 VPS 中转(方案四);应急用浏览器渲染(方案六)。

文中示例域名 ssh.kuwi.net、隧道名 QwenPaw,实操时替换为你自己的即可。

为什么需要这套方案

QwenPaw 容器(以及大多数云容器 / 内网机器)的共同痛点:

  • 没有公网 IP,藏在 NAT 后面,外面根本够不着
  • 不想(或不能)在防火墙上开入站端口
  • 直接暴露 22 端口到公网,等着被全网扫描器爆破

Cloudflare Tunnel 的思路反其道而行:服务器主动出站连接 Cloudflare 边缘节点(只走 443,任何能上网的环境都行),入站一个端口都不用开。客户端的流量经 Cloudflare 边缘回源进隧道,直达内网的 sshd。

全链路架构

全链路架构

整条链路分三段:

  1. 客户端 → 转发器:裸 SSH(TCP)。FinalShell 这类 GUI 客户端不会说隧道协议,所以需要一个 cloudflared 转发器或 Tailscaale 把 SSH 流量接进来 —— 它可以跑在你本机,也可以跑在一台公网 VPS 上
  2. 转发器 → Cloudflare 边缘:WebSocket 加密连接,目标就是你在 dashboard 里配的公共主机名(如 ssh.kwke.net)
  3. 边缘 → 服务器:QUIC 加密隧道,由服务器上的 cloudflared connector 主动建立并保活

安全基线:服务器端 sshd 仅允许公钥认证、root 密码锁定,即使隧道主机名泄露,攻击者面对的也是一道没有密码可猜的门。想要更强的,还可以叠加 Zero Trust Access 身份验证(见文末加固章节)。

准备工作

条件 说明
Tailscale 账号 免费版即可
Cloudflare 账号 免费版即可
一个托管在 Cloudflare 的域名 DNS 需由 Cloudflare 解析(本文用 kuwi.net 演示)
QwenPaw 容器的 shell 权限 需要 root(容器默认就是 root)
客户端设备 Windows / macOS / Linux 均可

注册并一建部署 QwenPaw

注册网址:https://platform.agentscope.io/
注册成功并绑定 Github 后就可以一键部署。

部署
部署完成后打开 QWENPAW。

运行
免费的模型好像不能用,个人中心-模型调用中找到赠送的 API Key 复制,在左上角点模型找到 AgentScope Platform 点配置,API 密钥中粘贴这个 API Key 保存。

图片说明
选择模型,选择几个启用,这里使用 Kimi-k3

图片说明
聊天界面选择 Kimi-k3


方案一:Tailscale 组网方案(推荐 ⭐)

Tailscale 是基于 WireGuard 的组网工具:每台设备装上并登录同一账号后,各自分到一个固定的 100.x 内网 IP,设备间点对点加密直连,就像在同一个局域网。和 Cloudflare 隧道相比,它连公共主机名都不需要 —— 服务器在公网彻底"隐身",扫描器连门都摸不到,也不需要有域名。

服务器侧(容器内):

直接在聊天界面输入

帮我安装一下 Tailscale

会给你一条 https://login.tailscale.com/a/xxxx 授权链接,浏览器打开、登录(Google/GitHub 账号均可)即完成组网

生成公钥
直接在聊天界面输入

在本容器里生成公钥并配置好 `ssh-ed25519.pub`,将生成的 `ssh-ed25519` 给我下载保存,以便连接 SSH 使用。

图片说明
客户端(Windows):安装 Tailscale 客户端,登录同一个账号。

连接:FinalShell 主机填容器分到的 100.x IP(服务器上 tailscale ip -4 查看),或直接填 MagicDNS 主机名 qwenpaw,端口 22,公钥认证照旧。

tailscale status 显示设备在线 / Windows 客户端已连接

免费版 3 用户 / 100 设备,个人用绰绰有余。进阶玩法:管理后台关闭这台服务器的密钥过期(Key Expiry)、用 ACL 精细控制访问、开启 Tailscale SSH 用 Tailscale 身份直接替代 SSH 密钥。

⚠️ 国内网络注意:Tailscale 的加密直连依赖 NAT 打洞,打洞失败时流量走官方 DERP 中继(节点在境外),延迟偏高但依然可用。对延迟敏感可以自建 DERP 中继,或者继续用 Cloudflare 方案。


方案二: cloudflared 转发器方案

第一步:开通 Zero Trust 并创建隧道

  1. 打开 Cloudflare Zero Trust 控制台,首次进入会引导你选择团队名(team name),随便起,免费的 50 用户额度足够个人使用

  2. 左侧菜单进入 Networks → Tunnels → Create a tunnel,连接器类型选 Cloudflared

  3. 给隧道起个名字(比如 QwenPaw),下一步页面会给出各平台的安装命令 —— 关键是复制那串 eyJ... 开头的 Token,它包含账户 ID、隧道 UUID 和凭证

⚠️ Token 就是隧道的钥匙,泄露等于把隧道拱手让人。别提交进 Git,别发群聊。

第二步:安装 cloudflared

直接在聊天界面输入:

帮我把 SSH 跑以 Cloudflare Zero Trust 走隧道,设置开机启动;同时在本容器里生成公钥并配置好 `ssh-ed25519.pub`,将生成的 `ssh-ed25519` 给我下载保存,以便连接 SSH 使用。

可能有多次权限请求,直接批准就行。过程中会要你的提供那串 eyJ... 开头的 Token,给他就行。

图片说明

第三步:配置公共主机名(Public Hostname)

回到 Zero Trust 控制台,选中隧道 → 路由 → 添加路由 → 已发布的应用程序:

选择路由类型

填写:

  • 子域名:ssh;域:选你的域名 → 完整主机名 ssh.kuwi.net
  • Service URL:ssh://localhost:22
  • 路径:留空(仅 HTTP 类应用使用)
  • 下方 HTTP / TLS / 连接 / Access 高级设置保持默认

添加已发布应用程序

点「添加路由」,Cloudflare 会自动创建 DNS 记录(CNAME 指向隧道),无需手动操作。

第四步:端到端验证

在服务器上做一次「自己连自己穿隧道」的回环测试(如果你安装了 cloudflared 的话,你也可以让 QwenPaw 帮你测试):

bash
cloudflared access tcp --hostname ssh.kuwi.net --url 127.0.0.1:3333 &
ssh -p 3333 -o BatchMode=yes root@127.0.0.1 hostname

端到端验证

看到 Permission denied (publickey,password) 反而是成功 —— 说明流量完整穿过了 Cloudflare 边缘和隧道,sshd 已正常应答,只是测试端没装私钥。


方案三:原生 ssh + ProxyCommand(macOS / Linux 推荐)

客户端装 cloudflared,然后编辑 ~/.ssh/config:

Host qwenpaw-vps
    HostName ssh.kuwi.net
    User root
    ProxyCommand cloudflared access ssh --hostname %h

之后 ssh qwenpaw-vps 一条命令直连,scp / sftp / VSCode Remote 全部兼容。这是最优雅的方案,但 FinalShell 等 GUI 客户端不支持 ProxyCommand,往下看。


方案三:Windows 本机转发器 + FinalShell

思路:cloudflared 在本机监听 127.0.0.1:2222,FinalShell 连这个本地端口。转发器用计划任务做成开机自启,之后无感。

PowerShell(管理员):

powershell
winget install cloudflare.cloudflared
ssh-keygen -t ed25519    # 生成密钥对,一路回车

# 开机自启(隐藏窗口),路径以 (Get-Command cloudflared).Source 为准
schtasks /create /tn "ssh-tunnel" /tr "\"C:\Program Files (x86)\cloudflared\cloudflared.exe\" access tcp --hostname ssh.kuwi.net --url 127.0.0.1:2222" /sc onlogon /rl highest /f
schtasks /run /tn "ssh-tunnel"

Windows 配置

FinalShell 新建连接:

  • 主机 127.0.0.1,端口 2222,用户 root
  • 认证方式选公钥,私钥选 C:\Users\<你>\.ssh\id_ed25519 或你下载的 id_ed25519

FinalShell 新建连接对话框


方案四:公网 VPS 中转(团队共享 / 多台客户端)

如果你有一台公网 VPS,把转发器架在它上面,所有客户端(包括手机)都直连 VPS 的 2222 端口,客户端设备零安装:

FinalShell → VPS公网IP:2222 → Cloudflare 隧道 → QwenPaw 容器

VPS 上(Debian/Ubuntu):

bash
# 安装 cloudflared —— 注意 Debian 13 (trixie) 需把仓库代号写死 bookworm
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared bookworm main" | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update && sudo apt install -y cloudflared

# systemd 常驻
sudo tee /etc/systemd/system/ssh-relay.service <<'EOF'
[Unit]
Description=Cloudflare tunnel SSH relay
After=network-online.target

[Service]
ExecStart=/usr/bin/cloudflared access tcp --hostname ssh.kuwi.net --url 0.0.0.0:2222
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload && sudo systemctl enable --now ssh-relay
systemctl status ssh-relay --no-pager
ss -tln | grep 2222

VPS 中转部署

两个必做项:

  • 云厂商安全组放行 TCP 2222(腾讯云/阿里云的控制台里配,光 ufw 不够),来源 IP 能收敛就收敛
  • VPS 的 2222 端口等于把 SSH 入口暴露公网,务必确认服务器端只有公钥认证

FinalShell 填 VPS 公网 IP + 2222 端口 + 公钥即可。SSH 协议本身端到端加密,中转 VPS 看到的也是密文,安全性不受影响。


方案五:WARP 客户端(官方 Zero Trust 姿势)

不想折腾转发器?装官方的 WARP 客户端,让整台设备加入 Zero Trust 网络:

  1. Zero Trust 控制台:Settings → WARP Client → Device enrollment,添加允许规则(比如你的邮箱)
  2. Networks → Tunnels → 你的隧道 → 路由 → 私有 CIDR,添加容器网段(容器里跑 hostname -I 查到的 IP,如 172.17.0.2/32)
  3. 客户端设备安装 WARP,登录团队名,开关打开
  4. FinalShell 直连容器内网 IP:22,不需要任何转发器

适合长期高频使用、还想顺便访问容器里其他端口服务的场景。


方案六:浏览器渲染 SSH(零安装,应急神器)

Cloudflare Access 可以把 SSH 终端直接渲染在浏览器里,任何能开网页的设备都能连:

  1. Zero Trust → Access → Applications → Add an application → Self-hosted,应用类型选 SSH,主机名填 ssh.kwke.net,开启浏览器渲染(使用短期证书)
  2. 服务器上生成短期证书 CA 并接入 sshd:
bash
cloudflared ssh generate --hostname ssh.kwke.net   # 按提示完成浏览器授权
# 生成的 CA 公钥保存为 /etc/ssh/ca.pub,然后 sshd_config 加入:
#   PubkeyAuthentication yes
#   TrustedUserCAKeys /etc/ssh/ca.pub
# 重启 sshd
  1. 浏览器打开 https://ssh.kuwi.net,完成 Access 登录,网页里就是一个完整终端

⚠️ 本节参数以 Cloudflare 官方文档 当前版本为准(短期证书流程更新较快)。浏览器渲染没有 FinalShell 的 SFTP 文件管理,适合应急。

各方案对比

方案 客户端安装 GUI 客户端兼容 公网暴露面 适合场景
① Tailscale 组网 ⭐ Tailscale ✅ 零(连主机名都不存在) 个人长期使用,首推
② 本机转发器 cloudflared ✅ FinalShell 等全部 主机名(可叠 Access) Windows 主力机
③ 原生 ProxyCommand cloudflared 仅命令行 主机名(可叠 Access) macOS/Linux 主力机
④ VPS 中转 什么都不装 ✅ 中转机 2222 端口 多设备 / 团队共享
⑤ WARP WARP 客户端 ✅ 零(私有路由) 深度使用、多端服务
⑥ 浏览器渲染 什么都不装 浏览器终端 主机名(强制 Access) 应急、借来的设备

安全加固建议

  1. 叠加 Access 策略:Zero Trust → Access → Applications 给 ssh.kuwi.net 建应用,策略限定你的邮箱 —— 之后连 TCP 握手都要先过 Cloudflare 身份验证(走 VPS 中转方案时需在中转机配 service token,纯本机转发则首次连接弹浏览器登录一次)
  2. 收敛中转端口:方案四的 VPS 安全组只放行你的常用 IP 段
  3. 定期轮换密钥:authorized_keys 里不认识的公钥条目立刻删除
  4. 盯日志:/var/log/ssh-tunnel.err.log 和 sshd 认证日志,异常连接早发现

常见问题 FAQ

Q: apt 装 cloudflared 报 404 / "does not have a Release file"?
A: Cloudflare 仓库还没收录你的发行版代号(如 Debian 13 trixie)。把 /etc/apt/sources.list.d/cloudflared.list 里的代号改成 bookworm 再 apt update 即可,cloudflared 是静态编译的 Go 二进制,不挑版本。

Q: systemd 服务 inactive (dead)?
A: 九成是 cloudflared 没装上(见上一条),systemctl status 里 Loaded: loaded ... disabled 说明 service 文件建了但从没启动成功。装好 cloudflared 后 systemctl daemon-reload && systemctl enable --now ssh-relay。

Q: FinalShell 连接被拒 / 超时?
A: 按链路由近及远排查:转发器进程在不在(ss -tln | grep 2222)→ 云安全组放没放行 → 隧道健康状态(服务器上 curl -s localhost:34567/ready 应有 "readyConnections":4)→ sshd 日志。

Q: 能不能不让客户端装任何东西、Worker 直接当代理?
A: 不能。Cloudflare Workers 只能接 HTTP/WebSocket 入站,接不住 FinalShell 的裸 TCP。「裸 TCP ↔ 隧道协议」的翻译必须发生在某台真实机器上 —— 要么你的电脑(方案二),要么中转 VPS(方案四),要么干脆换思路:Tailscale 组网(方案一)/ WARP(方案五)/ 浏览器(方案六)。

Q: 容器重建后配置还在吗?
A: 取决于平台。本文 supervisord 配置写在容器文件系统里;若平台重建镜像,把 /etc/cloudflared/token、supervisord 配置和 authorized_keys 备份到持久卷,恢复脚本跑一遍即可。

结语

至此,你的 QwenPaw 容器拥有了一条零入站端口、全链路加密、仅公钥认证的 SSH 通道。Cloudflare 免费额度对个人完全够用,整套配置一次投入、长期受益。容器里那套环境,现在跟你家里 NAS 一样触手可及。


本文所有服务器端截图均来自真实部署环境。