本文介绍免费注册开通
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。
全链路架构

整条链路分三段:
- 客户端 → 转发器:裸 SSH(TCP)。FinalShell 这类 GUI 客户端不会说隧道协议,所以需要一个
cloudflared转发器或Tailscaale把 SSH 流量接进来 —— 它可以跑在你本机,也可以跑在一台公网 VPS 上 - 转发器 → Cloudflare 边缘:WebSocket 加密连接,目标就是你在 dashboard 里配的公共主机名(如
ssh.kwke.net) - 边缘 → 服务器: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,公钥认证照旧。
免费版 3 用户 / 100 设备,个人用绰绰有余。进阶玩法:管理后台关闭这台服务器的密钥过期(Key Expiry)、用 ACL 精细控制访问、开启 Tailscale SSH 用 Tailscale 身份直接替代 SSH 密钥。
⚠️ 国内网络注意:Tailscale 的加密直连依赖 NAT 打洞,打洞失败时流量走官方 DERP 中继(节点在境外),延迟偏高但依然可用。对延迟敏感可以自建 DERP 中继,或者继续用 Cloudflare 方案。
方案二: cloudflared 转发器方案
第一步:开通 Zero Trust 并创建隧道
打开 Cloudflare Zero Trust 控制台,首次进入会引导你选择团队名(team name),随便起,免费的 50 用户额度足够个人使用
左侧菜单进入 Networks → Tunnels → Create a tunnel,连接器类型选 Cloudflared
给隧道起个名字(比如
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 帮你测试):
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(管理员):
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"

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

方案四:公网 VPS 中转(团队共享 / 多台客户端)
如果你有一台公网 VPS,把转发器架在它上面,所有客户端(包括手机)都直连 VPS 的 2222 端口,客户端设备零安装:
FinalShell → VPS公网IP:2222 → Cloudflare 隧道 → QwenPaw 容器
VPS 上(Debian/Ubuntu):
# 安装 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

两个必做项:
- 云厂商安全组放行 TCP 2222(腾讯云/阿里云的控制台里配,光 ufw 不够),来源 IP 能收敛就收敛
- VPS 的 2222 端口等于把 SSH 入口暴露公网,务必确认服务器端只有公钥认证
FinalShell 填 VPS 公网 IP + 2222 端口 + 公钥即可。SSH 协议本身端到端加密,中转 VPS 看到的也是密文,安全性不受影响。
方案五:WARP 客户端(官方 Zero Trust 姿势)
不想折腾转发器?装官方的 WARP 客户端,让整台设备加入 Zero Trust 网络:
- Zero Trust 控制台:Settings → WARP Client → Device enrollment,添加允许规则(比如你的邮箱)
- Networks → Tunnels → 你的隧道 → 路由 → 私有 CIDR,添加容器网段(容器里跑
hostname -I查到的 IP,如172.17.0.2/32) - 客户端设备安装 WARP,登录团队名,开关打开
- FinalShell 直连容器内网 IP:22,不需要任何转发器
适合长期高频使用、还想顺便访问容器里其他端口服务的场景。
方案六:浏览器渲染 SSH(零安装,应急神器)
Cloudflare Access 可以把 SSH 终端直接渲染在浏览器里,任何能开网页的设备都能连:
- Zero Trust → Access → Applications → Add an application → Self-hosted,应用类型选 SSH,主机名填
ssh.kwke.net,开启浏览器渲染(使用短期证书) - 服务器上生成短期证书 CA 并接入 sshd:
cloudflared ssh generate --hostname ssh.kwke.net # 按提示完成浏览器授权
# 生成的 CA 公钥保存为 /etc/ssh/ca.pub,然后 sshd_config 加入:
# PubkeyAuthentication yes
# TrustedUserCAKeys /etc/ssh/ca.pub
# 重启 sshd
- 浏览器打开
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) | 应急、借来的设备 |
安全加固建议
- 叠加 Access 策略:Zero Trust → Access → Applications 给
ssh.kuwi.net建应用,策略限定你的邮箱 —— 之后连 TCP 握手都要先过 Cloudflare 身份验证(走 VPS 中转方案时需在中转机配 service token,纯本机转发则首次连接弹浏览器登录一次) - 收敛中转端口:方案四的 VPS 安全组只放行你的常用 IP 段
- 定期轮换密钥:
authorized_keys里不认识的公钥条目立刻删除 - 盯日志:
/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 一样触手可及。
本文所有服务器端截图均来自真实部署环境。
