关键词: Cloudflare Tunnel, Zero Trust, Web SSH, 浏览器渲染 SSH, 内网穿透, OpenWrt, 运维安全, 远程管理, 无客户端运维, SSH 安全防护
在传统的运维场景中,我们习惯了使用 XShell、FinalShell 或 PuTTY 这些本地客户端来连接服务器。但在移动办公日益普及的今天,这种方式的局限性也暴露无遗:换了电脑要重新配置私钥、在网吧或借用他人电脑时不敢登录、iPad 或 Chromebook 这种轻量级设备上缺乏好用的 SSH 工具……
更重要的是安全问题:为了远程管理,你是否还在路由器上做端口映射?是否还在担惊受怕地看着日志里成千上万次针对 22 端口的暴力破解尝试?
今天,我们将彻底改变这一现状。利用 Cloudflare Zero Trust 的 Browser Rendering(浏览器渲染) 技术,我们可以直接在 Chrome/Edge 浏览器中打开一个安全的、加密的 SSH 终端。无需安装任何插件,无需暴露公网 IP,只需一个浏览器,就能安全地管理家里的 OpenWrt 或公司的服务器。
一、 痛点分析:传统 SSH 远程连接的“三座大山”
在深入技术细节之前,我们需要明白为什么我们需要这项技术。传统的远程连接方案(如 DDNS + 端口映射 + 本地客户端)存在三个主要痛点:
安全隐患极大(裸奔的 22 端口) 这是最致命的问题。一旦你在路由器上将内部服务器的 22 端口映射到公网,你的服务器就成了黑客扫描工具的靶子。全球有无数的自动脚本在 24 小时不间断地扫描公网 IP 的 22 端口,并尝试暴力破解密码。虽然可以用 Fail2ban 等工具防御,但“暴露”本身就是风险。
环境依赖严重(离不开的客户端) “运维人员的电脑坏了”往往意味着灾难。因为所有的私钥、主机配置、Session 信息都存储在本地客户端里。如果你临时需要在他人的电脑、公共电脑,甚至是手机/平板上处理紧急故障,没有顺手的 SSH 客户端会让工作寸步难行。
内网穿透复杂(痛苦的 NAT) 家庭宽带往往没有公网 IPv4,或者处于多层 NAT 之下。虽然 IPv6 普及了,但很多公司的网络环境(如办公网)可能尚未支持 IPv6,导致“有家回不去”。传统的穿透方案(FRP、NPS)需要租用 VPS 中转,不仅成本高,带宽也受限。
二、 方案介绍与技术优势
Cloudflare Zero Trust 是 Cloudflare 推出的一套企业级安全访问解决方案。其中的 Cloudflare Tunnel (原 Argo Tunnel) 可以在不需要公网 IP 的情况下,将内网服务暴露给 Cloudflare 的边缘网络。
而 SSH Browser Rendering(浏览器 SSH 渲染) 是其 Access 组件的一项杀手级功能。
1. 核心技术原理
这个过程就像是 Cloudflare 充当了一个“超级翻译官”:
客户端(浏览器):你通过 HTTPS 访问
https://rts.xxx.com。Cloudflare Edge(边缘节点):验证你的身份(邮箱/SSO),通过后将 HTTPS 流量转换为 SSH 协议流量。
Cloudflared(本地守护进程):运行在你的 OpenWrt 或服务器上,建立一条加密隧道连接到 Cloudflare。它接收来自云端的指令,并转发给本地的 SSH 服务(Dropbear/OpenSSH)。
2. 安全与体验优势
端口隐身:你的服务器不需要开放任何入站端口(Inbound Port),防火墙甚至可以设置为“拒绝所有入站”。
身份验证前置:在连接建立之前,Cloudflare 已经通过 Access Policy 拦截了所有非法访问。黑客连 TCP 握手都做不到,更别提暴力破解 root 密码了。
跨平台零依赖:只要有浏览器,就有 SSH。Windows、Mac、Linux、iOS、Android 全平台通用。
审计与监控:Cloudflare 后台可以记录谁、在什么时间登录了系统,满足企业合规需求。
三、 实战教程:从零搭建 Web SSH 终端
本教程将结合 OpenWrt 环境进行演示,目标是实现通过 https://rts.xxx.com 直接在浏览器中管理 OpenWrt 后台。
前置准备
一个 Cloudflare 账号。
一个托管在 Cloudflare 上的域名(例如
xxx.com)。OpenWrt 路由器(已安装 Cloudflared 插件,或通过 Docker 部署)。
第一阶段:配置隧道 (Tunnel) —— 建立数据通路
首先,我们需要打通 Cloudflare 到你本地 VPS/OpenWrt/NAS 的数据隧道。
登录 Cloudflare Zero Trust 控制台,点击 Networks -> Tunnels。
找到你正在使用的隧道(例如
my opWrt),点击 Configure。进入 Public Hostname 标签页,点击 Add a public hostname。
关键配置点(请务必仔细核对):
Subdomain (子域):填写你想使用的前缀,例如
rts。Domain (域名):选择你的主域名
xxx.com。Service (服务):
Type:选择 SSH。
URL:这是最容易出错的地方!
❌ 错误写法 1:
localhost:22或127.0.0.1:22。如果你的 Cloudflared 跑在 Docker 里,localhost 指的是容器自己,而不是 OpenWrt,会导致连接白屏或拒绝。✅ 正确写法:填写 OpenWrt 的局域网真实 IP。例如
192.168.1.1:22(假设你的路由器网关是 192.168.1.1)。这能确保 Cloudflared 无论在什么网络模式下都能准确找到 SSH 服务。
配置完成后,点击 Save hostname 保存。
第二阶段:配置应用程序 (Access Application) —— 设置门禁
隧道打通了,但 Cloudflare 默认不知道这个 SSH 流量需要被“渲染”成网页,我们需要配置一个 Application。
在 Zero Trust 左侧菜单,点击 Access -> Applications。
点击 Add an application,选择 Self-hosted (自托管)。
步骤 2.1:基本信息 (Overview)
Application name:起个名字,比如
OpenWrt Web SSH。Session Duration:保持默认
24 hours。Application domain:这里必须和刚才隧道里填的一模一样。
Subdomain:
rtsDomain:
xxx.com
注意:此时可能会出现“警告:未找到此域的 DNS 记录”,这是因为 DNS 缓存尚未刷新,可以直接忽略,不影响后续操作。
步骤 2.2:访问策略 (Policies)
这一步决定了“谁”有资格看到这个登录界面。
Policy name:例如
Admin Access。Action:必须选 Allow。
Configure rules (配置规则):
Selector:选择 Email。
Value:输入你的邮箱地址(例如
xxx***@163.com)。你也可以选择 "Emails ending in" 来授权整个公司域名,或者使用 GitHub 授权登录。
步骤 2.3:高级设置 (Settings) —— 开启浏览器渲染
这是最核心的一步!千万不能漏!
点击 Next 进入最后一个标签页 Settings。
向下滚动,找到 Browser rendering (浏览器呈现设置) 选项。
点击展开,在下拉菜单中选择 SSH。
说明:如果不选这一项,访问网址时浏览器会下载一个文件或者无响应;选中后,Cloudflare 才会加载 Web 终端界面。
点击 Add application 完成创建。
第三阶段:验证与排错
现在,拿起你的手机或电脑,打开 Chrome 浏览器(不要开代理工具,直接直连测试速度)。
访问
https://rts.xxx.com。身份验证:你会看到 Cloudflare Access 的登录页,输入你的邮箱,获取 6 位数验证码。
连接终端:验证通过后,如果配置正确,你会看到一个黑色的网页终端窗口,提示输入
username和password。输入 OpenWrt 的
root账号和密码。成功! 你现在已经置身于 OpenWrt 的 Shell 中了。
常见故障排查 (Troubleshooting)
在配置过程中,新手极易遇到以下两个错误,请对号入座:
现象一:HTTP ERROR 502 Bad Gateway
原因:隧道通了,但隧道连不上目标端口。通常是因为你在 Tunnel 配置里的 URL 填了错误的 IP(如 Docker 网桥 IP),导致 Cloudflared 找不到 SSH 服务。
解决:将 Tunnel 中的 URL 改为路由器的局域网 IP(如
192.168.1.1:22)。
现象二:登录后显示空白页面,没有任何文字
原因:TCP 连接建立了,但数据传输被阻断。通常是因为 Cloudflared 运行在 Docker 容器内,你填写了
localhost,而容器内部并没有 SSH 服务。解决:同上,不要用 localhost,请使用局域网真实 IP。
现象三:不小心关掉了SSH网页重新打开,在极个别情况下会出现页面全黑,无任何字符
原因:TCP保持连接,仍在登录状态,这是CDN缓存造成的,属于正常现象。
解决:在你访问的ssh域名后面加上 /cdn-cgi/access/logout,这会主动销毁当前的 Access 会话。
四、 进阶玩法与安全建议
虽然我们已经成功了,但为了极致的体验和安全,还有几点建议:
设置会话超时 在 Application 设置中,将
Session Duration设置得短一些(如 1 小时)。这样即使你在网吧忘记退出,Cookies 过期后别人也无法重新进入。利用 WARP 客户端 如果你不喜欢 Web 终端的操作手感,依然想用 FinalShell 怎么办?你可以通过在本地安装 Cloudflare WARP 客户端或 Cloudflared,将这个 Web SSH 再次“映射”回本地端口。但这违背了我们要“摆脱客户端”的初衷,仅作为备选方案。
关闭密码登录(使用 SSH Key) 虽然 Access 已经挡住了绝大多数攻击,但为了防止 Access 策略配置失误,建议在 OpenWrt 的 Dropbear 配置中,禁止 root 密码登录,仅允许密钥登录(Cloudflare Access 支持上传 Short-lived certificates,但这属于高阶玩法,暂不展开)。
五、 结语
通过 Cloudflare Zero Trust,我们不仅免费获得了企业级的安全防护,更获得了一种前所未有的自由运维体验。无论你身在何处,只要有一台能上网的设备,你的服务器就在你的指尖。
技术是为了让生活更简单,而不是更复杂。希望这篇教程能帮你打通任督二脉,开启云原生运维的新篇章。
本文首发于 E路领航 (blog.oool.cc),转载请注明出处