sycnnj
发布于 2026-01-22 / 18 阅读

告别客户端:利用 Cloudflare Zero Trust 打造随时随地的 Web SSH 运维终端

关键词: 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 + 端口映射 + 本地客户端)存在三个主要痛点:

  1. 安全隐患极大(裸奔的 22 端口) 这是最致命的问题。一旦你在路由器上将内部服务器的 22 端口映射到公网,你的服务器就成了黑客扫描工具的靶子。全球有无数的自动脚本在 24 小时不间断地扫描公网 IP 的 22 端口,并尝试暴力破解密码。虽然可以用 Fail2ban 等工具防御,但“暴露”本身就是风险。

  2. 环境依赖严重(离不开的客户端) “运维人员的电脑坏了”往往意味着灾难。因为所有的私钥、主机配置、Session 信息都存储在本地客户端里。如果你临时需要在他人的电脑、公共电脑,甚至是手机/平板上处理紧急故障,没有顺手的 SSH 客户端会让工作寸步难行。

  3. 内网穿透复杂(痛苦的 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 后台。

前置准备

  1. 一个 Cloudflare 账号。

  2. 一个托管在 Cloudflare 上的域名(例如 xxx.com)。

  3. OpenWrt 路由器(已安装 Cloudflared 插件,或通过 Docker 部署)。


第一阶段:配置隧道 (Tunnel) —— 建立数据通路

首先,我们需要打通 Cloudflare 到你本地 VPS/OpenWrt/NAS 的数据隧道。

  1. 登录 Cloudflare Zero Trust 控制台,点击 Networks -> Tunnels

  2. 找到你正在使用的隧道(例如my opWrt),点击 Configure

  3. 进入 Public Hostname 标签页,点击 Add a public hostname

关键配置点(请务必仔细核对):

  • Subdomain (子域):填写你想使用的前缀,例如 rts

  • Domain (域名):选择你的主域名 xxx.com

  • Service (服务)

    • Type:选择 SSH

    • URL这是最容易出错的地方!

      • 错误写法 1localhost:22127.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。

  1. 在 Zero Trust 左侧菜单,点击 Access -> Applications

  2. 点击 Add an application,选择 Self-hosted (自托管)

步骤 2.1:基本信息 (Overview)

  • Application name:起个名字,比如 OpenWrt Web SSH

  • Session Duration:保持默认 24 hours

  • Application domain:这里必须和刚才隧道里填的一模一样。

    • Subdomain: rts

    • Domain: 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 浏览器(不要开代理工具,直接直连测试速度)。

  1. 访问 https://rts.xxx.com

  2. 身份验证:你会看到 Cloudflare Access 的登录页,输入你的邮箱,获取 6 位数验证码。

  3. 连接终端:验证通过后,如果配置正确,你会看到一个黑色的网页终端窗口,提示输入 usernamepassword

  4. 输入 OpenWrt 的 root 账号和密码。

  5. 成功! 你现在已经置身于 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 会话。


四、 进阶玩法与安全建议

虽然我们已经成功了,但为了极致的体验和安全,还有几点建议:

  1. 设置会话超时 在 Application 设置中,将 Session Duration 设置得短一些(如 1 小时)。这样即使你在网吧忘记退出,Cookies 过期后别人也无法重新进入。

  2. 利用 WARP 客户端 如果你不喜欢 Web 终端的操作手感,依然想用 FinalShell 怎么办?你可以通过在本地安装 Cloudflare WARP 客户端或 Cloudflared,将这个 Web SSH 再次“映射”回本地端口。但这违背了我们要“摆脱客户端”的初衷,仅作为备选方案。

  3. 关闭密码登录(使用 SSH Key) 虽然 Access 已经挡住了绝大多数攻击,但为了防止 Access 策略配置失误,建议在 OpenWrt 的 Dropbear 配置中,禁止 root 密码登录,仅允许密钥登录(Cloudflare Access 支持上传 Short-lived certificates,但这属于高阶玩法,暂不展开)。

五、 结语

通过 Cloudflare Zero Trust,我们不仅免费获得了企业级的安全防护,更获得了一种前所未有的自由运维体验。无论你身在何处,只要有一台能上网的设备,你的服务器就在你的指尖。

技术是为了让生活更简单,而不是更复杂。希望这篇教程能帮你打通任督二脉,开启云原生运维的新篇章。


本文首发于 E路领航 (blog.oool.cc),转载请注明出处