告别公网IP和端口映射:利用Cloudflare Tunnel搭建浏览器里的SSH应用
作为一名开发者和技术爱好者,你是否有过这样的困扰:在家里的服务器上跑着重要的服务,或者管理着一台没有公网IP的远程Linux机器。每当需要SSH连接进去操作时,要么需要复杂的端口映射,要么得求助于内网穿透工具,不仅配置麻烦,更重要的是,直接将SSH端口暴露在公网上充满了安全隐患。
现在,有了Cloudflare Tunnel,这一切都变得简单、安全且优雅。今天,我们就来一步步动手,利用Cloudflare Tunnel将你的SSH服务安全地“发布”到互联网上,并且可以直接在浏览器里使用,无需在本地安装任何SSH客户端!
什么是Cloudflare Tunnel?
简单来说,Cloudflare Tunnel 是一个安全连接工具。它允许你在自己的服务器(或任何能联网的设备)上运行一个轻量级守护程序(cloudflared),这个程序会向Cloudflare的全球网络创建仅出站的连接。
这意味着:
- 无需公网IP:你的服务器不需要公网地址,也不需要开放任何入站端口(如22端口)。
- 极度安全:攻击者无法直接扫描或攻击你的SSH端口,因为你的服务器上根本没有开放任何入站端口。所有流量都经过Cloudflare的智能过滤。
- 协议支持广泛:它不仅能代理HTTP/HTTPS网站,还能安全地转发SSH、RDP(远程桌面)等TCP流量。
正如官方文档所说:“Cloudflare Tunnel可以安全地将HTTP Web服务器、SSH服务器、远程桌面和其他协议连接到Cloudflare。这样一来,你的源站就可以通过Cloudflare提供流量,而不会受到绕过Cloudflare的攻击。”
而我们要做的,正是将“SSH服务器”这个部分,变成一个可以通过浏览器访问的应用。
准备工作
在开始之前,你需要准备以下几样东西:
- 一个域名:并将其托管在Cloudflare上(即使用Cloudflare的Nameserver)。
- 一台服务器/设备:这是你要连接的“目标机器”,可以是家里的树莓派、办公室的Linux工作站或者云上的一台VPS。它需要能访问互联网。
- 一个Cloudflare账号:免费版账号就完全够用。
第一步:在你的服务器上安装并运行 cloudflared
我们需要在你想要远程连接的那台机器上安装Cloudflare的连接器。
SSH登录到你的目标服务器,然后根据你的操作系统,在Cloudflare官方文档中找到对应的安装方法。以常见的Linux系统为例,通常是一行命令:
# 下载并安装 cloudflared 软件源
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb安装完成后,我们需要进行认证,将这台服务器和你的Cloudflare账号关联起来:
cloudflared tunnel login运行该命令后,会输出一个URL。在浏览器中打开它,选择你的域名并授权。授权成功后,服务器上就会生成一个证书文件,证明其身份。
第二步:创建并配置一个 Tunnel
接下来,我们创建一个新的隧道。
创建隧道: 在服务器上运行以下命令,将
my-ssh-tunnel替换成你喜欢的名字。bashcloudflared tunnel create my-ssh-tunnel这条命令会在
~/.cloudflared/目录下生成一个<隧道-UUID>.json的凭证文件,这是隧道的唯一身份标识。配置文件: 我们需要告诉
cloudflared这个隧道要转发什么流量。在~/.cloudflared/目录下创建一个config.yml文件:yamltunnel: my-ssh-tunnel credentials-file: /home/你的用户名/.cloudflared/<隧道-UUID>.json ingress: - hostname: ssh.你的域名.com service: ssh://localhost:22 # 最后必须有一个服务来处理未匹配的请求,通常返回404 - service: http_status:404请务必修改:将
你的用户名、<隧道-UUID>(文件名)和ssh.你的域名.com替换为你自己的信息。这里我们设定,当访问ssh.你的域名.com时,所有流量都会被转发到本地的22端口(即SSH服务)。
第三步:配置 Cloudflare DNS 记录
隧道虽然创建好了,但Cloudflare还不知道如何将你的域名指向这个隧道。我们需要将DNS记录与此隧道绑定。
在服务器上执行以下命令:
cloudflared tunnel route dns my-ssh-tunnel ssh.你的域名.com这条命令会自动在Cloudflare的DNS设置中为你创建一个ssh.你的域名.com的CNAME记录,并将其指向你的隧道。你可以在Cloudflare仪表盘的DNS记录中看到它。
第四步:运行隧道并尝试连接
现在,万事俱备,只欠启动。
在你的服务器上,运行:
cloudflared tunnel run my-ssh-tunnel如果一切顺利,你会看到一系列日志输出,显示连接成功。现在,你的SSH服务已经通过Cloudflare Tunnel安全地发布出去了。
如何连接? 你现在可以打开一个新的终端窗口,尝试用传统的SSH命令连接:
ssh 你的用户名@ssh.你的域名.com只要你的服务器上运行着SSH服务端,并且你的用户名密码或密钥正确,你就能成功连接!
第五步:实现终极目标——浏览器内的SSH客户端
这才是本文的重头戏。Cloudflare提供了“浏览器渲染”技术,让我们可以在没有本地SSH客户端的情况下,仅通过浏览器就能完成SSH连接。
在Cloudflare Zero Trust仪表盘中配置: 登录Cloudflare仪表盘,进入 Zero Trust 部分。在左侧菜单找到 Access -> Applications。
添加一个自托管应用: 点击“Add an application”,选择“Self-hosted”。
配置应用:
- Application name:填写一个名称,比如
Web SSH。 - Session Duration:根据需要设置会话时长。
- Application domain:在域名下拉框中选择你的主域名,并在前面的输入框中填入
ssh(这样就会变成ssh.你的域名.com)。 - 点击“Next”。
- Application name:填写一个名称,比如
添加访问策略: 这里你可以设置谁可以访问这个应用。为了安全,建议设置为只有特定的邮箱地址或特定的邮箱后缀才能访问。例如,设置规则为
Emails ending in@你的域名.com。启用浏览器渲染: 这是最关键的一步!在接下来的设置页面中,找到高级设置,开启 “Browser Rendering” 选项。
保存并完成。 保存应用配置。现在,
cloudflared不仅转发TCP流量,还告诉Cloudflare需要为这个应用启用浏览器内的渲染功能。
见证奇迹的时刻
现在,打开一个任何设备上的现代浏览器(Chrome、Firefox、Edge均可),访问 https://ssh.你的域名.com。
你会被重定向到Cloudflare Access的登录页面,根据你设置的策略进行验证(比如通过发送到邮箱的一次性验证码)。验证通过后,浏览器里会直接出现一个全功能的、基于Web的终端模拟器,并自动连接到你服务器的SSH服务!
你可以像在任何本地终端一样,输入命令、运行程序。整个过程,你的服务器上没有开放任何入站端口,所有连接都经过了Cloudflare的安全检查和身份验证。
总结
通过Cloudflare Tunnel,我们不仅绕过了复杂的网络配置,实现了安全的SSH连接,更借助其Browser Rendering功能,将SSH客户端完全迁移到了浏览器中。
这个方案的优势显而易见:
- 零暴露面:无需开放任何入站端口。
- 身份安全:强制使用Cloudflare Access进行身份验证,可以与Google、GitHub等OAuth提供商集成,彻底告别密码登录。
- 随处访问:只要有浏览器和网络,任何设备(包括手机、iPad、公司电脑)都可以安全地管理你的服务器。
- 免费且稳定:对于个人和小团队用户,Cloudflare Tunnel的免费额度非常慷慨。
快去试试吧!结合Cloudflare官方的文档,你会发现它还能做更多有趣的事情,比如搭建安全的Web服务、RDP远程桌面等。你的技术工具箱里,从此又多了一个称手的神器。