Cloudflare Tunnel macOS 内网穿透配置

前言

在当今互联的世界中,从互联网访问本地服务的需求越来越普遍。无论是想要向客户展示最新 API 的开发者,运行个人 Web 服务器的爱好者,还是简单地寻求一种远程管理家庭自动化系统的安全方式,挑战通常在于导航复杂的网络配置和潜在的安全风险。传统上,这涉及到在你的路由器上打开端口,这个过程对于初学者来说可能既技术性令人畏惧,也可能向本地网络引入漏洞。幸运的是,Cloudflare 隧道提供了一种简化和安全的替代方案,允许你在不进行端口转发的情况下将本地 Web 服务器或应用程序暴露给互联网。

Cloudflare 隧道(原名 Argo 隧道)为你本地机器和 Cloudflare 的全球网络之间提供安全连接。这种创新方法消除了在路由器上打开任何入站端口的必要性,通过减少攻击面,显著提高了你本地网络的安全性。通过建立仅出站连接,Cloudflare 隧道确保你的服务器免受直接互联网暴露,减轻了 DDoS 攻击和其他常见基于网络的威胁。这种易于设置和增强的安全性使 Cloudflare 隧道成为云技术新手和寻求无烦恼方式使本地服务从任何有互联网连接的地方可访问的理想解决方案。此外,Cloudflare 强大的全球网络确保了你服务的高可用性和性能,通常还附带免费 SSL 证书的好处,为你的公开应用程序增加了另一层安全性和信任。 初学者使用这项技术的常见场景包括与合作伙伴共享本地托管开发环境、远程访问家中托管的项目,或在无需静态公网 IP 地址的情况下实验网络技术。

Cloudflare 隧道的工作原理

要掌握 Cloudflare Tunnel 的优雅之处,想象 Cloudflare 是一个遍布全球的庞大、智能交换机。在你的本地 macOS 机器上, cloudflared 客户端充当一个专用操作员,向这个交换机拨号,建立一条安全、加密的隧道。当互联网上的人试图通过指定的 Cloudflare 域名访问你的本地服务时,他们的请求首先到达最近的 Cloudflare 数据中心。这个全球交换机随后智能地将流量通过你的 cloudflared 客户端建立的隧道,直接路由到你的本地机器。

一个关键方面是,由 cloudflared 发起的连接仅限出站。这意味着你的本地网络不需要接受来自互联网的任何入站连接,这是传统端口转发的主要安全担忧。相反,所有通信都通过从你的网络内部发起的安全隧道进行。 cloudflared 客户端,由 Cloudflare 提供的轻量级命令行工具,是管理此持久连接的关键组件。它充当代理,持续确保本地服务和 Cloudflare 网络之间的安全通道。通过利用 Cloudflare 的广泛基础设施,即使是网络专业知识有限的用户也能从企业级安全功能(如 DDoS 保护和全球内容分发网络(CDN))以及简化 DNS 和 SSL 证书管理中受益。

环境准备: 在 macOS 上安装 cloudflared

在开始隧道本地 API 服务之前,需要在你的 macOS 机器上安装 cloudflared 客户端。为此,最推荐且最直接的方法是使用 Homebrew,这是一个流行的 macOS 包管理器,它可以简化软件安装。

如果尚未安装 Homebrew,请打开终端应用程序(可以在“应用程序”>“实用工具”中找到它)并运行以下命令。此命令将下载并执行一个脚本,该脚本会在系统上安装 Homebrew:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

按照屏幕提示完成 Homebrew 安装。一旦安装了 Homebrew,你可以通过在终端中运行此命令来继续安装 cloudflared

brew install cloudflare/cloudflare/cloudflared

这条命令指示 Homebrew 从 Cloudflare 的官方 Homebrew 源下载并安装 cloudflared 软件包。安装完成后,建议验证 cloudflared 是否已正确安装。你可以通过运行以下命令来完成此操作:

cloudflared --version

如果安装成功,此命令将显示 cloudflared 客户端的版本号。此确认确保你拥有设置 Cloudflare 隧道所需的工具。

将你的机器链接到 Cloudflare: 认证 cloudflared

使用 cloudflared 安装后,下一步是将你的本地计算机链接到 Cloudflare 账户。此身份验证过程允许 cloudflared 代表你创建和管理隧道。要启动身份验证,打开你的终端并运行以下命令:

cloudflared login

执行此命令可能会打开你的默认网页浏览器或提供一个你需要在浏览器中打开的链接。你将被重定向到 Cloudflare 网站,你将需要登录你的 Cloudflare 账户。登录成功后,你将需要授权 cloudflared 管理与你的账户关联的 Cloudflare 隧道。此授权步骤至关重要,因为它授予 cloudflared 创建、配置和运行隧道的必要权限。

此认证过程通常使用安全方法,例如一次性 PIN 或 OAuth 流程,确保你的 Cloudflare 凭据不会直接暴露给 cloudflared 客户端。一旦你已授权 cloudflared ,你的本地机器上就会创建一个凭据文件,通常位于 ~/.cloudflared/ 目录中。此文件存储认证信息,允许 cloudflared 在不要求你每次管理隧道时都登录的情况下与你的 Cloudflare 账户交互。此基于浏览器的认证流程旨在用户友好,特别是对于那些刚开始使用命令行工具的人来说,因为它利用了熟悉的网络界面进行安全的授权过程。

构建安全网关:创建第一个 Cloudflare 隧道

在成功验证 cloudflared 与你的 Cloudflare 账户后,你现在可以创建第一个 Cloudflare 隧道。此隧道将作为你本地 API 服务通过互联网访问的安全通道。要创建新的隧道,请在你的终端中运行以下命令:

cloudflared tunnel create

执行此命令后,Cloudflare 将在你的账户中创建一个新的隧道, cloudflared 将输出该隧道的唯一标识符。此隧道 ID 是一串长数字字母字符,对于配置和运行隧道至关重要。请确保复制并安全存储此隧道 ID,因为在后续步骤中你将需要它。Cloudflare 还可能为你的隧道分配一个默认的随机生成的名称。如果你更喜欢更具描述性的标签,你可以在 Cloudflare 仪表板中查看和修改此名称。此隧道 ID 是你本地 cloudflared 实例与 Cloudflare 全球网络上相应的隧道资源之间的中心链接。

配置你的隧道

你的 Cloudflare 隧道的行为和路由规则定义在名为 config.yml 的配置文件中。此文件告诉 cloudflared 哪些本地服务应该被暴露,以及它们应该在哪些域名或子域名下可访问。默认情况下, cloudflared 在 macOS 上的 ~/.cloudflared/ 目录中查找此配置文件。

config.yml 文件使用 YAML 语法结构。对于初学者来说,最重要的部分是理解 tunnelcredentials-fileingresstunnel 指令指定了上一步骤中获得的隧道 ID。 credentials-file 指令指向在 cloudflared login 过程中创建的认证凭据文件的位置。 ingress 部分是定义路由规则的地方,根据主机名将传入的请求映射到特定的本地服务。

这里是一个如何配置 config.yml 文件将域名 api.example.com 映射到运行在 http://localhost:8000service.mrljdx.com 上的本地 API 服务,以及将 http://localhost:8080 映射到另一个服务的示例:

tunnel: YOUR_TUNNEL_ID
credentials-file: /Users/YOUR_USERNAME/.cloudflared/YOUR_TUNNEL_ID.json

ingress:
  - hostname: api.example.com
    service: http://localhost:8000
  - hostname: service.mrljdx.com
    service: http://localhost:8080
  - service: http_status:404

YOUR_TUNNEL_ID 替换为你收到的实际隧道 ID,将 /Users/YOUR_USERNAME/.cloudflared/YOUR_TUNNEL_ID.json 替换为你的凭据文件的正确路径。 hostname 指令指定了用于访问服务的公共域名或子域名。 service 指令表示你想要公开的服务本地地址和端口。最后的规则 service: http_status:404 充当通配符。如果传入的请求与定义的任何主机名不匹配,Cloudflare 将返回“未找到”错误。这是确保通过隧道仅可访问显式配置的服务的一种最佳实践。

总结上述示例中 ingress 部分的配置:

HostName Local Service Address
api.example.com http://localhost:8080
service.mrljdx.com http://localhost:8080

此配置展示了 Cloudflare Tunnel 的灵活性,允许你通过单个隧道使用不同的子域名公开多个本地服务。

在 Cloudflare 中配置 DNS 记录

使用你的 cloudflared 客户端认证并配置好你的隧道后,下一步关键的操作是告诉 Cloudflare 如何将你选择的域名流量路由到你新创建的隧道。这通过在 Cloudflare 控制台中配置 DNS 记录来完成。

首先,登录你的 Cloudflare 账户并选择你要使用的域名(假设你在 Cloudflare 中控制这些域名,可以是 example.commrljdx.com )。导航到你域设置的“DNS”部分。

配置 api.example.com 的 DNS 记录,请按照以下步骤操作:

  1. 点击“添加记录”按钮。
  2. 选择"CNAME"作为记录类型。
  3. 在“名称”字段中,输入 api
  4. 在“目标”字段中,输入你的隧道 ID 后跟 .cfargotunnel.com 。例如,如果你的隧道 ID 是 abcdef123456abcdef123456abcdef12 ,则输入 abcdef123456abcdef123456abcdef12.cfargotunnel.com
  5. 确保“代理状态”设置为“代理”(由橙色云图标表示)。这强烈推荐,因为它确保你的子域名流量将通过 Cloudflare 网络,从中受益于其安全和性能功能。
  6. 点击“保存”。

重复此过程于 service.mrljdx.com

  1. 点击“添加记录”。
  2. 选择"CNAME"作为记录类型。
  3. 在“名称”字段中,输入 service
  4. 在“目标”字段中,输入相同的隧道 ID 后跟 .cfargotunnel.com
  5. 确保“代理状态”设置为“已代理”。
  6. 点击“保存”。

这些 CNAME 记录指示 Cloudflare 的 DNS 系统将所有发送到 api.example.comservice.mrljdx.com 的请求转发到你创建的特定 Cloudflare 隧道。"代理"状态尤其重要,因为它确保连接能够从 Cloudflare 的安全措施和 CDN 功能中受益。

运行你的 Cloudflare 隧道

使用 cloudflared 客户端安装、认证、配置文件设置以及 DNS 记录就绪后,你现在可以运行 Cloudflare 隧道,并使你的本地 API 服务对全球可用。打开你的终端并执行以下命令,将 YOUR_TUNNEL_ID 替换为你实际的隧道 ID:

cloudflared tunnel run YOUR_TUNNEL_ID

此命令根据你在 config.yml 文件中定义的规则,在你的本地计算机和 Cloudflare 网络之间建立连接。你应该在终端中看到表示隧道正在运行并尝试连接到 Cloudflare 的日志。

为了持续访问你的本地服务,你可能需要在后台运行 Cloudflare 隧道,以便在你关闭终端窗口后它仍然存在。macOS 提供了多种实现方式。两种流行的方法涉及使用 screentmux 终端复用器。

使用 screen

  1. 如果你没有安装 screen ,可以使用 Homebrew 进行安装: brew install screen
  2. 启动一个新的分离屏幕会话,命名为 cloudflare-tunnelscreen -S cloudflare-tunnel
  3. 在此次屏幕会话中,运行隧道命令: cloudflared tunnel run YOUR_TUNNEL_ID
  4. 将屏幕会话断开(使其在后台运行),请按 Ctrl+A 然后按 Ctrl+D
  5. 重新连接到会话、查看日志或停止隧道,请使用以下命令: screen -r cloudflare-tunnel

使用 tmux :

  1. 如果 tmux 未安装,你可以使用 Homebrew 进行安装: brew install tmux
  2. 创建一个新的命名会话 tmuxtmux new -s cloudflare-tunnel
  3. 运行 tmux 会话中的隧道命令: cloudflared tunnel run YOUR_TUNNEL_ID
  4. 要断开 tmux 会话,请按 Ctrl+B 然后按 D
  5. 重新连接到会话,请使用命令: tmux attach -t cloudflare-tunnel

通过使用 screentmux 在分离会话中运行隧道,确保 Cloudflare 隧道在后台保持活跃,使的本地 API 服务可以通过配置的域名持续访问。

保持内容更新:更新隧道配置

随着你的需求演变,你可能希望添加新的 API 端点或修改现有端点通过 Cloudflare 隧道暴露的方式。更新配置是一个简单的流程,涉及修改 config.yml 文件,并可能需要在 Cloudflare 仪表板中更新你的 DNS 记录。

为添加新的 API 端点,例如,如果你在 http://localhost:9000 上运行一个状态页面,并且希望通过子域名 status.example.com 使其可访问,你首先需要打开你的 ~/.cloudflared/config.yml 文件,并在 ingress 部分下添加一个新条目:

tunnel: YOUR_TUNNEL_ID
credentials-file: /Users/YOUR_USERNAME/.cloudflared/YOUR_TUNNEL_ID.json

ingress:
  - hostname: api.example.com
    service: http://localhost:8000
  - hostname: service.mrljdx.com
    service: http://localhost:8080
  - hostname: status.example.com
    service: http://localhost:9000
  - service: http_status:404

保存对你的 config.yml 文件所做的更改后,你还需要在 Cloudflare DNS 控制台中为你的 example.com 域名创建相应的 CNAME 记录。此记录的名称应为 status ,指向你的隧道 ID 后跟 .cfargotunnel.com ,并将“代理状 态”设置为“已代理”。

在很多情况下, cloudflared 被设计为自动检测 config.yml 文件的变化并重新加载配置,而无需手动重启隧道进程。然而,如果你发现你的更改没有反映出来,可能需要手动重启 cloudflared 进程。如果你在 screentmux 会话中运行隧道,你可以重新连接到会话,停止并重新启动 cloudflared tunnel run 命令,或者在某些情况下向进程发送重新加载信号。无需完全重新设置即可更新配置,这为管理和扩展通过 Cloudflare 隧道公开的本地服务提供了一种灵活的方式。

故障排除

即使设置谨慎,初学者在配置和运行 Cloudflare Tunnel 时可能会遇到一些常见问题。以下是一些故障排除技巧:

无法通过 Cloudflare 域名访问服务

  • 请确保你的 Cloudflare DNS 控制台中的 CNAME 记录配置正确,正确的子域名指向你的隧道 ID 后跟 .cfargotunnel.com ,并且代理状态设置为“已代理”。
  • 确认你的 config.yml 文件中的 tunnel 指令与你获得的隧道 ID 匹配。同时,确保 ingress 部分下的 hostnameservice 指令正确地将你希望使用的子域名映射到正确的 localhost 地址和端口。
  • 确保 cloudflared 隧道正在无错误运行。检查你的终端或 screentmux 会话中的日志,以查找任何连接问题或错误信息。
  • 确认你要公开的本地 API 服务实际上正在你的 macOS 机器上运行,并且可以在指定的端口(例如, http://localhost:8000 )上访问。

cloudflared command not found

命令未找到:此错误通常表示安装 cloudflared 的目录未包含在你的系统 PATH 环境变量中。如果你使用 Homebrew 安装,这通常会被自动处理。但是,如果你遇到此问题,请确保 /opt/homebrew/bin/usr/local/bin (根据你的系统架构和 Homebrew 配置)已包含在你的 PATH 中。你可能需要关闭并重新打开终端或更新你的 shell 配置文件。

Authentication issues

认证问题:如果你在认证方面遇到问题,请再次运行 cloudflared login 命令。同时,请确认凭据文件是否存在于正确的位置( ~/.cloudflared/ ),并且其权限设置适当。

Errors in config.yml

错误在 config.ymlconfig.yml 文件使用 YAML 语法,该语法对缩进敏感。请确保你的缩进正确(通常使用空格,而不是制表符),并且关键字 tunnelingresshostnameservice 拼写正确。你可以使用在线 YAML 验证工具来检查配置文件的语法。

Service connection refused

服务连接被拒绝:此错误通常意味着你试图连接的本地服务要么没有运行,要么在你指定的 localhost 文件中的地址和端口上不可访问。请检查你的本地 API 服务是否已启动并监听正确的端口。

通过系统地检查这些常见点,初学者通常可以诊断并解决他们在设置和操作 Cloudflare Tunnel 时遇到的问题。

总结

恭喜!通过遵循这些步骤,你已在你的 macOS 机器上成功配置了 Cloudflare 隧道,以安全地将你的本地 API 服务暴露给互联网。你已经了解了 Cloudflare 隧道的工作原理,如何安装和验证 cloudflared 客户端,如何创建隧道,使用 config.yml 文件配置路由规则,在 Cloudflare 仪表板上设置 DNS 记录,并在后台运行你的隧道。你还获得了更新配置和解决常见问题的见解。

这种方法通过抽象传统端口映射的复杂性,为初学者提供了显著优势,同时提供了一种安全且简单的方法来使本地服务在全球范围内可访问。增强的安全性、简化的配置以及利用 Cloudflare 强大基础设施的能力,使 Cloudflare 隧道成为开发者、爱好者以及任何希望安全地公开其本地应用程序的人不可或缺的工具。

随着你对 Cloudflare Tunnel 越来越熟悉,你可以探索其更高级的功能,例如设置访问策略以控制谁可以访问你的服务或使用 Cloudflare Workers 进行更复杂的流量路由和处理。可能性是无限的,你已经迈出了解锁本地开发和实验环境全部潜力的第一步。