Appearance
最优雅的 Homelab 远程访问方案:Cloudflare Tunnel 零信任实践

从外网安全访问家里的 ESXi 和 vCenter,不需要公网 IP,不需要开放端口,只需要一个域名。
为什么需要这样的方案?
在 Homelab 的实践中,一个很现实的需求是:当你不在家时,如何安全地访问家里的服务器?
传统的做法通常涉及:
- DDNS + 端口转发:需要在路由器上开放端口,存在一定的安全风险。
- VPN 服务器:需要配置 WireGuard/OpenVPN,对网络环境有一定要求。
- 内网穿透服务:通常需要安装客户端,且依赖第三方服务。
而我这次想分享的,是一个更优雅、更安全、也更符合现代 Web 安全理念的方案——Cloudflare Tunnel。
这个方案能做什么?
- 安全访问 ESXi:
https://esxi.your-domain.com-> 家里的 ESXi 管理界面 - 安全访问 vCenter:
https://vcenter.your-domain.com-> 家里的 vCenter 界面 - 可扩展:未来添加 GitLab、K8s Dashboard 等服务,只需在配置文件中新增一行规则
方案原理简析
Cloudflare Tunnel 会在你家里的服务器和 Cloudflare 边缘节点之间建立一条加密的、持久的隧道。外部用户通过域名访问时,请求会先到达 Cloudflare 边缘节点,再通过这条隧道安全地转发到你的内网服务。
整体架构如下:
- 家里的 Homelab 上运行轻量级守护进程(
cloudflared),主动连接到 Cloudflare 边缘节点。 - 外部用户访问你的域名(如
esxi.your-domain.com)时,DNS 解析指向 Cloudflare。 - Cloudflare 边缘节点通过加密隧道,将请求转发到内网的
cloudflared。 cloudflared将请求转发到对应的内网服务(如 ESXi 的192.168.0.201:443)。- 响应数据沿原路返回,全程加密。
准备工作
在开始之前,确保你已经具备以下条件:
| 条件 | 说明 |
|---|---|
| Cloudflare 账号 | 你拥有的域名已在 Cloudflare 上托管 |
| 一台 Linux 虚拟机 | 用于运行 cloudflared 守护进程(如 Ubuntu 22.04 LTS) |
| 内网服务信息 | ESXi、vCenter 等服务的 IP 地址和端口 |
部署步骤
第一步:在 Linux 虚拟机上安装 cloudflared
登录到你的 Linux 虚拟机(例如 k8s-infra-224),执行以下命令:
bash
# 下载并安装 cloudflared
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
# 验证安装
cloudflared --version第二步:认证并绑定域名
bash
cloudflared tunnel login命令执行后会返回一个授权链接。在浏览器中打开该链接,选择你的 Cloudflare 域名,完成授权。
提示:授权成功后,
cloudflared会在你的虚拟机中生成一个cert.pem证书文件,用于后续的身份验证。
第三步:创建隧道并配置访问规则
3.1 创建隧道
bash
# 创建一个名为 homelab 的隧道
cloudflared tunnel create homelab执行后会生成一个 Tunnel UUID 和一个 credentials 文件(如 <Tunnel UUID>.json),请妥善保管。
3.2 配置隧道路由规则
在虚拟机中创建配置文件 ~/.cloudflared/config.yml:
yaml
tunnel: <你的 Tunnel UUID> # 替换为刚才生成的 UUID
credentials-file: /root/.cloudflared/<Tunnel UUID>.json
ingress:
# 将 esxi.your-domain.com 指向 ESXi 管理界面
- hostname: esxi.your-domain.com
service: https://192.168.0.201:443
originRequest:
noTLSVerify: true # ESXi 使用自签名证书,需跳过校验
# 将 vcenter.your-domain.com 指向 vCenter 管理界面
- hostname: vcenter.your-domain.com
service: https://192.168.0.202:443
originRequest:
noTLSVerify: true
# 默认规则:其他请求返回 404
- service: http_status:4043.3 配置 DNS 记录
执行以下命令,将域名指向你的隧道:
bash
cloudflared tunnel route dns homelab esxi.your-domain.com
cloudflared tunnel route dns homelab vcenter.your-domain.com这一步会自动在 Cloudflare DNS 中添加 CNAME 记录,指向你的隧道。配置完成后,需等待 1-2 分钟 DNS 生效。
3.4 运行隧道
bash
cloudflared tunnel run homelab如果一切正常,你可以在浏览器中访问 https://esxi.your-domain.com,看到 ESXi 的登录界面。
3.5 配置为系统服务(持久运行)
如果你希望隧道在后台持久运行,可以将 cloudflared 安装为系统服务:
bash
sudo cloudflared service install访问流程说明
- 你在外网浏览器中访问
https://esxi.your-domain.com。 - DNS 解析指向 Cloudflare 边缘节点。
- Cloudflare 边缘节点通过已建立的加密隧道,将请求转发到你家里的
cloudflared守护进程。 cloudflared将请求转发到内网的 ESXi IP(192.168.0.201)。- 响应数据沿原路返回,整个传输过程都通过 Cloudflare 的全球网络加速。
这个方案的优势
| 特性 | 说明 |
|---|---|
| 无需开放端口 | 不需要在路由器上配置任何端口转发,减少了被扫描攻击的风险 |
| 自动 HTTPS | Cloudflare 自动提供 SSL 证书,支持强制 HTTPS 访问 |
| 零信任架构 | 结合 Cloudflare Zero Trust,可以添加访问策略(如邮箱验证码) |
| 可扩展 | 添加新服务只需在 config.yml 的 ingress 中新增一行 |
| 稳定可靠 | 即使你的公网 IP 变化,隧道也会自动重建 |
| 免费额度 | Cloudflare Tunnel 对 Homelab 使用者完全免费 |
一些需要注意的地方
- TLS 验证:
noTLSVerify: true是必要的,因为 ESXi 和 vCenter 使用自签名证书。这不会降低安全性,因为隧道本身已经加密。 - 延迟:所有流量经过 Cloudflare 边缘节点,会增加几十到一百毫秒的延迟,对管理访问来说可以接受。
- 免费流量:Cloudflare Tunnel 本身免费,但有合理的流量限制。对于 Homelab 管理访问,几乎不可能触及。
扩展:添加更多服务
假设你后续部署了 GitLab(http://172.16.0.10:80),只需在 config.yml 的 ingress 中添加:
yaml
- hostname: gitlab.your-domain.com
service: http://172.16.0.10:80然后执行 cloudflared tunnel route dns homelab gitlab.your-domain.com,重启隧道即可。
测试与验证
- 本地测试:在虚拟机内执行
curl https://esxi.your-domain.com -k,确认能返回响应。 - 外网测试:手机开启 5G 网络,关闭 WiFi,访问
https://esxi.your-domain.com,验证能否正常打开 ESXi 登录界面。 - 查看日志:
cloudflared tunnel run homelab会实时输出请求日志,便于排查问题。
结语
现在,你的域名已经成为通往 Homelab 的私人专用通道。无论你身处何地,只要网络可达,就能安全地访问家中的 ESXi、vCenter 以及任何你想暴露的服务。
这套方案的核心价值在于:它把如何安全暴露内网服务这个问题,从开放端口、配置防火墙的运维思维,转变为基于身份和域名的零信任访问的现代安全思维。 希望这份实践记录能为你提供一些参考。
附录:相关 IP 地址参考
- ESXi 管理地址:
https://192.168.0.201 - vCenter 管理地址:
https://192.168.0.202 - Linux 虚拟机(运行 cloudflared):
172.16.0.224
