Skip to content

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

Homelab 异常断电修复实录:从半夜关机到 vCenter 重生示意图

从外网安全访问家里的 ESXi 和 vCenter,不需要公网 IP,不需要开放端口,只需要一个域名。

为什么需要这样的方案?

在 Homelab 的实践中,一个很现实的需求是:当你不在家时,如何安全地访问家里的服务器?

传统的做法通常涉及:

  • DDNS + 端口转发:需要在路由器上开放端口,存在一定的安全风险。
  • VPN 服务器:需要配置 WireGuard/OpenVPN,对网络环境有一定要求。
  • 内网穿透服务:通常需要安装客户端,且依赖第三方服务。

而我这次想分享的,是一个更优雅、更安全、也更符合现代 Web 安全理念的方案——Cloudflare Tunnel

这个方案能做什么?

  • 安全访问 ESXihttps://esxi.your-domain.com -> 家里的 ESXi 管理界面
  • 安全访问 vCenterhttps://vcenter.your-domain.com -> 家里的 vCenter 界面
  • 可扩展:未来添加 GitLab、K8s Dashboard 等服务,只需在配置文件中新增一行规则

方案原理简析

Cloudflare Tunnel 会在你家里的服务器和 Cloudflare 边缘节点之间建立一条加密的、持久的隧道。外部用户通过域名访问时,请求会先到达 Cloudflare 边缘节点,再通过这条隧道安全地转发到你的内网服务。

整体架构如下:

  1. 家里的 Homelab 上运行轻量级守护进程(cloudflared),主动连接到 Cloudflare 边缘节点。
  2. 外部用户访问你的域名(如 esxi.your-domain.com)时,DNS 解析指向 Cloudflare。
  3. Cloudflare 边缘节点通过加密隧道,将请求转发到内网的 cloudflared
  4. cloudflared 将请求转发到对应的内网服务(如 ESXi 的 192.168.0.201:443)。
  5. 响应数据沿原路返回,全程加密。

准备工作

在开始之前,确保你已经具备以下条件:

条件说明
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:404

3.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

访问流程说明

  1. 你在外网浏览器中访问 https://esxi.your-domain.com
  2. DNS 解析指向 Cloudflare 边缘节点。
  3. Cloudflare 边缘节点通过已建立的加密隧道,将请求转发到你家里的 cloudflared 守护进程。
  4. cloudflared 将请求转发到内网的 ESXi IP(192.168.0.201)。
  5. 响应数据沿原路返回,整个传输过程都通过 Cloudflare 的全球网络加速。

这个方案的优势

特性说明
无需开放端口不需要在路由器上配置任何端口转发,减少了被扫描攻击的风险
自动 HTTPSCloudflare 自动提供 SSL 证书,支持强制 HTTPS 访问
零信任架构结合 Cloudflare Zero Trust,可以添加访问策略(如邮箱验证码)
可扩展添加新服务只需在 config.ymlingress 中新增一行
稳定可靠即使你的公网 IP 变化,隧道也会自动重建
免费额度Cloudflare Tunnel 对 Homelab 使用者完全免费

一些需要注意的地方

  • TLS 验证noTLSVerify: true 是必要的,因为 ESXi 和 vCenter 使用自签名证书。这不会降低安全性,因为隧道本身已经加密。
  • 延迟:所有流量经过 Cloudflare 边缘节点,会增加几十到一百毫秒的延迟,对管理访问来说可以接受。
  • 免费流量:Cloudflare Tunnel 本身免费,但有合理的流量限制。对于 Homelab 管理访问,几乎不可能触及。

扩展:添加更多服务

假设你后续部署了 GitLab(http://172.16.0.10:80),只需在 config.ymlingress 中添加:

yaml
  - hostname: gitlab.your-domain.com
    service: http://172.16.0.10:80

然后执行 cloudflared tunnel route dns homelab gitlab.your-domain.com,重启隧道即可。

测试与验证

  1. 本地测试:在虚拟机内执行 curl https://esxi.your-domain.com -k,确认能返回响应。
  2. 外网测试:手机开启 5G 网络,关闭 WiFi,访问 https://esxi.your-domain.com,验证能否正常打开 ESXi 登录界面。
  3. 查看日志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
最后更新2026/07/19 16:20
如果你觉得这篇文章有帮助,或者想聊聊技术、工作,欢迎通过下面方式联系我:
contact fishfinal