去做,去错,去尝试。对于许多拥有家庭实验室(Homelab)的用户而言,将内网的服务安全地暴露到互联网上,一直是一个既实用又颇具挑战的需求。无论是想在外访问家里的媒体服务器,还是远程管理部署的服务,传统的端口转发和动态DNS方案不仅配置复杂,还可能带来安全风险。
Cloudflare Tunnel,作为Cloudflare Zero Trust套件的一部分,提供了一种更优雅、安全的解决方案。它通过在您的内部资源与Cloudflare全球网络之间建立出站连接(隧道),从根本上改变了流量路由方式。您无需在家庭路由器上配置端口转发,也无需担心动态公网IP的问题。
运行原理
Cloudflared隧道代理的工作原理,是将流量从Cloudflare的边缘网络安全地引向您的内网服务。
整个流程大致如下:用户的浏览器向域名 example.com 发起HTTP请求。该请求首先到达Cloudflare全球网络的边缘服务器。边缘服务器检查配置,根据主机名到隧道的映射关系,建立连接。请求随后通过已建立的隧道,被转发到您本地网络中的服务器。在您的服务器上,运行的Cloudflared服务(假设命名为“mytunnel”)接收请求。最终,请求被代理到本地实际运行的服务,例如 localhost:8080。
隧道本身是一个持久对象,用于将流量路由到您的DNS记录。您可以在同一个隧道中运行多个Cloudflared进程(连接器),这些进程会与最近的Cloudflare数据中心建立连接,从而实现高可用和低延迟。
准备工作
在开始配置前,请确保满足以下条件:
- 一台内网服务器:用于托管您希望暴露的服务(如Ubuntu Server)。
- 已安装Docker:虽然Cloudflared可以独立运行,但使用Docker容器化部署更为便捷和一致。
- 拥有一个Cloudflare托管域名:您需要在Cloudflare账户中添加并管理您的域名(本文示例使用
org870b.ga)。
创建Cloudflare隧道
第一步是在Cloudflare Zero Trust面板中创建隧道实例。
- 登录您的Cloudflare仪表盘,在左侧导航栏中找到并点击“Zero Trust”。
- 进入Zero Trust面板后,在左侧菜单中依次选择“Access” -> “Tunnels”,然后点击蓝色的“Create a tunnel”按钮。
- 接下来为隧道命名。建议使用描述性名称,例如“homelab”,表示这是为家庭实验室网络创建的隧道。输入名称后,点击“Save tunnel”。
安装并运行隧道连接器(Connector)
隧道创建完成后,需要在您的内网服务器上安装并运行连接器,以建立到Cloudflare的出站连接。
- 在连接器的安装环境选择页面,您可以看到Windows、Mac、Linux(Debian/Red Hat)和Docker等选项。本例选择Docker方式。
- 页面上会显示一个用于安装和运行连接器的Docker命令。该命令包含了用于认证的令牌(Token)。为了管理方便,我们可以在运行前为命令添加
-d(后台运行)和 --name(指定容器名)参数。修改后的命令如下:
docker run -d --name homelab_tunnel cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoiTjFiYwFjMDYzMDN1OTU3NmU4MmvVkZwVlZTQ0M2ZhYjQiLCJ0IjoiN2I1NjA2NjYtODk3NS00ZDkzLWli3MMQtYzYyYmUwOGYxYjVhIiwicyI6IllpHTXhOamcZTxpjdE56WTB0aTAwTVRRMExXSmhOVEV0WjTOakItSX1OREkxTnpBeCJ9
注意:上述令牌仅为示例格式,实际操作中请使用页面上生成的唯一令牌。
- 在您的服务器终端中执行上述命令。Docker会从Docker Hub拉取
cloudflare/cloudflared:latest 镜像并启动容器。输出会显示拉取进度和最终的容器ID。
- 使用以下命令确认容器正在运行:
docker ps -f 'name=homelab_tunnel'
输出应显示容器状态为“Up”。
- 返回Cloudflare Tunnel管理页面,稍等片刻,您应该能看到连接器状态变为“Connected”,并且显示了连接器ID、状态、所在数据中心(例如HKG, DEL)、原始IP和Cloudflared版本等信息。点击“Next”继续。
通过隧道暴露Web应用(以Cockpit为例)
假设您在内网服务器(IP 192.168.1.20)上运行了Cockpit管理面板,本地访问地址为 https://192.168.1.20:9090。现在我们将通过隧道将其暴露到公网。
- 在配置公共主机名的页面,进行如下设置:
- Subdomain: 输入子域,例如
cockpit。
- Domain: 从下拉列表中选择您在Cloudflare托管的域名,例如
org870b.ga。
- Service Type: 选择
HTTPS。
- URL: 填写您服务的内部地址,例如
192.168.1.20:9090。
- 点击“Additional application settings”展开高级选项。由于Cockpit可能使用自签名证书,需要在此处启用“No TLS Verify”开关,以禁用对来源服务器证书的TLS验证。最后点击“Save tunnel”或“Save hostname”。
配置完成后,您可以在隧道列表页面看到名为“homelab”的隧道,状态为“HEALTHY”,路由地址为 cockpit.org870b.ga。Cloudflare会自动在您的DNS区域中创建一条指向该隧道专用地址(类似UUID.cfargotunnel.com)的CNAME记录,且代理状态为“Proxied”。
现在,您可以通过浏览器访问 https://cockpit.org870b.ga 来远程登录您家庭服务器的Cockpit管理界面,整个过程如同访问任何普通网站一样。
通过隧道暴露SSH服务
Cloudflare Tunnel不仅支持HTTP/HTTPS服务,也支持其他协议如SSH。这意味着您可以在不开放路由器22端口的情况下,安全地进行远程SSH访问。
- 在隧道列表页面,找到您的“homelab”隧道,点击右侧的“Configure”。
- 在隧道配置页面,切换到“Public Hostname”标签页,点击“Add a public hostname”。
- 在新的公共主机名配置中填写:
- Subdomain: 例如
terminal。
- Domain: 同样选择您的域名,如
org870b.ga。
- Service Type: 选择
SSH。
- URL: 填写您服务器的内网SSH地址和端口,例如
192.168.1.20:22。
- 点击“Save hostname”。
至此,您已为SSH服务添加了公共主机名 terminal.org870b.ga。要使用它进行连接,您需要在客户端计算机上安装 cloudflared 二进制文件,并配置SSH客户端。
客户端连接配置(以Windows为例)
- 从Cloudflare开发者页面下载适用于您操作系统的
cloudflared 客户端,例如Windows的可执行文件。
- 将其放在一个固定路径,例如
C:\Tools\cloudflared-windows-amd64.exe。
- 编辑SSH客户端的配置文件(
~/.ssh/config),添加以下内容(请替换为您的主机名和可执行文件路径):
Host terminal.org870b.ga
ProxyCommand C:\Tools\cloudflared-windows-amd64.exe access ssh --hostname %h
- 保存配置文件后,即可在终端中使用以下命令连接:
ssh <你的用户名>@terminal.org870b.ga
系统会通过Cloudflare隧道安全地建立SSH连接。
总结与场景展望
Cloudflare Tunnel为家庭实验室和云原生应用的公网访问提供了一种革命性的方案。它免去了复杂的网络配置,利用Cloudflare强大的边缘网络作为安全屏障,极大地简化了内网服务暴露的流程。
您可以基于此方案,安全地将家庭网络中的多种服务对外开放,例如:
- 个人密码管理器(如Vaultwarden)
- 媒体服务器(如Jellyfin, Plex)
- 代码仓库(如Gitea)
- 物联网控制面板
这意味着无论您身在何处,都能安全、便捷地访问和管理您的私有服务,真正实现了“家庭实验室上云”的体验。对于开发者和运维人员而言,这无疑是一个提升个人生产力和服务可用性的强大工具。
参考资料
[1] Cloudflare隧道:将家庭网络安全地暴露到互联网上, 微信公众号:mp.weixin.qq.com/s/cjXsfvKsb3uHB2lBRT-0iQ
版权声明:本文由 云栈社区 整理发布,版权归原作者所有。