免费内网穿透神器:Cloudflare Tunnel 终极配置指南 (超详细)
在数字化浪潮席卷全球的今天,无论是开发者进行本地调试、团队协作共享内部资源,还是个人爱好者搭建家庭媒体服务器、智能家居控制中心,我们常常会遇到一个棘手的问题:如何将仅在本地网络(内网)可访问的服务安全、稳定地暴露到公共互联网上,让外部用户或设备能够访问?
传统的解决方案,如端口映射(Port Forwarding)、动态 DNS(DDNS)或购买具有公网 IP 的服务器,往往伴随着复杂的路由器配置、不稳定的网络环境、潜在的安全风险以及额外的成本。幸运的是,Cloudflare 提供了一个强大、免费且极其易用的解决方案——Cloudflare Tunnel。
本文将作为一份详尽的指南,带你一步步了解 Cloudflare Tunnel 的原理、优势,并手把手教你如何配置和使用这个免费的内网穿透神器,让你轻松、安全地将内网服务发布到互联网。
一、 什么是内网穿透?为什么需要它?
首先,我们需要理解“内网穿透”这个概念。我们家里的或办公室的网络通常位于路由器或防火墙之后,设备分配到的 IP 地址(如 192.168.x.x
、10.x.x.x
)是私有 IP 地址,这些地址在公共互联网上是不可路由的。这就像你家的门牌号只在你的小区内有效,出了小区就没人认识了。
当你希望互联网上的某个人(或者你自己在外时)能够访问你内网的某个服务(比如一个运行在 localhost:8080
的 Web 应用、家里的 NAS 存储、SSH 服务等)时,就需要一种机制能够“穿透”这层网络屏障,将外部的访问请求准确地引导到你内网的目标设备和端口上。这就是内网穿透技术的作用。
常见的内网穿透需求场景:
- 本地开发调试: 将本地开发的 Web 应用临时暴露给外部进行测试或演示。
- 远程访问家庭/办公资源: 访问家中的 NAS、远程桌面、监控摄像头等。
- 微信公众号/小程序开发: 需要公网可访问的回调地址。
- 搭建个人博客/网站: 使用家用服务器托管,无需购买昂贵的 VPS。
- 物联网设备管理: 远程控制和管理内网的智能家居设备。
二、 为什么选择 Cloudflare Tunnel?
市面上有不少内网穿透工具(如 ngrok、frp 等),但 Cloudflare Tunnel 凭借其独特的优势脱颖而出,尤其对于追求免费、安全、稳定的用户来说,它几乎是最佳选择:
- 完全免费: Cloudflare Tunnel 的核心功能是免费提供的,没有流量限制,没有连接数限制(对于大多数个人和小型团队场景完全足够)。
- 极致安全:
- 无需开放端口: 它通过从你的内网主动向 Cloudflare 边缘节点建立加密的、持久的出站连接(基于 QUIC 或 HTTP/2),避免了在路由器上开放任何入站端口,大大降低了网络暴露面和被攻击的风险。
- Cloudflare 安全防护: 所有通过 Tunnel 的流量都会经过 Cloudflare 的全球网络,天然享受 Cloudflare 提供的 DDoS 防护、WAF(Web 应用程序防火墙,部分功能需付费)等安全服务。
- 零信任集成: 可以与 Cloudflare Access(零信任平台)无缝集成,为你的内部服务添加强大的身份验证和访问控制,确保只有授权用户才能访问。
- 无需公网 IP 和 DDNS: 无论你的宽带是否有公网 IP,IP 地址是否动态变化,Cloudflare Tunnel 都能稳定工作,因为它不依赖于你的公网 IP。
- 易于配置和管理: 通过简单的命令行工具
cloudflared
即可完成大部分配置,并且可以通过 Cloudflare Dashboard 进行可视化管理。 - 性能优越: 借助 Cloudflare 遍布全球的 Anycast 网络,用户访问你的服务时会被路由到最近的 Cloudflare 节点,然后通过优化的内部网络到达你的源服务器,通常能提供较低的延迟和较好的访问速度。
- 自定义域名: 可以将你的服务绑定到你自己的域名(该域名需要托管在 Cloudflare 上),提供更专业、更易记的访问地址。
三、 准备工作
在开始配置 Cloudflare Tunnel 之前,请确保你已准备好以下事项:
- 一个 Cloudflare 账户: 如果没有,可以前往 Cloudflare 官网 免费注册。
- 一个域名: 你需要拥有一个域名,并将其 DNS 解析服务托管到 Cloudflare。将域名添加到 Cloudflare 是免费的,只需按照 Cloudflare 的指引修改你域名注册商处的 NS(Name Server)记录即可。本教程假设你已经完成了这一步。
- 一个在内网运行的服务: 确保你想要穿透的服务已经在你的本地机器或内网其他设备上正常运行,并知道其访问地址(如
http://localhost:8000
或http://192.168.1.100:80
)。 - 安装
cloudflared
的设备: 你需要在内网中找一台能够访问目标服务的设备(可以是运行服务的同一台设备,也可以是内网中的其他设备,如树莓派、虚拟机等)来安装和运行cloudflared
守护进程。这台设备需要能够连接互联网。
四、 安装 cloudflared
守护进程
cloudflared
是 Cloudflare Tunnel 的核心命令行工具,负责建立和管理 Tunnel 连接。你需要根据运行它的设备的操作系统进行安装。
1. Linux (Debian/Ubuntu):
“`bash
添加 Cloudflare 包存储库 GPG 密钥
sudo mkdir -p –mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null
添加 Cloudflare APT 仓库
echo ‘deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared $(lsb_release -cs) main’ | sudo tee /etc/apt/sources.list.d/cloudflared.list
更新包列表并安装 cloudflared
sudo apt-get update
sudo apt-get install cloudflared
“`
2. Linux (CentOS/RHEL/Fedora):
“`bash
添加 Cloudflare RPM 仓库
sudo rpm -ivh https://pkg.cloudflare.com/cloudflared-release-latest.rpm
安装 cloudflared
sudo yum install cloudflared
或者使用 dnf (较新版本)
sudo dnf install cloudflared
“`
3. macOS (使用 Homebrew):
bash
brew install cloudflare/cloudflare/cloudflared
4. Windows (64-bit):
- 前往 Cloudflare Tunnel 的 官方发布页面。
- 下载适用于 Windows (amd64) 的
.msi
安装包。 - 双击
.msi
文件,按照安装向导完成安装。默认会安装到C:\Program Files\Cloudflared
并将其添加到系统 PATH 环境变量中。
验证安装:
安装完成后,打开终端(Linux/macOS)或命令提示符/PowerShell(Windows),运行以下命令检查 cloudflared
是否成功安装并查看版本:
bash
cloudflared --version
如果能看到版本号输出,说明安装成功。
五、 登录 Cloudflare 账户
安装好 cloudflared
后,你需要授权它访问你的 Cloudflare 账户。
在终端或命令提示符中运行:
bash
cloudflared login
这条命令会输出一个 URL。将这个 URL 复制到你的浏览器中打开。浏览器会跳转到 Cloudflare 的登录页面,输入你的账号密码登录。登录成功后,Cloudflare 会让你选择一个你想要授权 cloudflared
管理的域名(如果你账户下有多个域名)。选择你准备用来配置 Tunnel 的域名,然后点击“授权”(Authorize)按钮。
授权成功后,浏览器会显示成功信息,同时 cloudflared
会在你的用户主目录下的一个隐藏文件夹(通常是 ~/.cloudflared/
或 C:\Users\<YourUsername>\.cloudflared\
)中下载并保存一个名为 cert.pem
的证书文件。这个证书就是 cloudflared
之后与 Cloudflare API 通信的凭证,请妥善保管,不要泄露。
终端也会显示类似 “You have successfully logged in” 的信息。
六、 创建 Tunnel
现在,我们可以创建一个 Tunnel 了。Tunnel 本质上是 Cloudflare 网络中的一个命名管道,用于连接你的内网服务和 Cloudflare 边缘。
在终端中运行以下命令,将 <your-tunnel-name>
替换为你想要给 Tunnel 起的名字(例如 my-home-server
):
bash
cloudflared tunnel create <your-tunnel-name>
示例:
bash
cloudflared tunnel create my-home-server
执行成功后,命令会输出类似以下信息:
“`
Tunnel credentials written to C:\Users\Admin.cloudflared\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json. cloudflared chose this file based on where your configuration directory is. Keep this file secret.
Created tunnel my-home-server with id xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
“`
请注意以下几点:
- Tunnel ID: 命令会输出一个唯一的 Tunnel ID (UUID 格式,如
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
)。这个 ID 非常重要,后续配置会用到。 - 凭证文件: 命令还会创建一个 JSON 格式的凭证文件(例如
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
),保存在.cloudflared
目录下。这个文件包含了访问该 Tunnel 的密钥,同样需要严格保密。
七、 配置 Tunnel
创建 Tunnel 后,我们需要告诉 cloudflared
如何将外部访问请求路由到你内网的哪个服务。这通过一个 YAML 格式的配置文件来完成。
1. 找到或创建配置文件:
cloudflared
默认会读取 .cloudflared
目录下的 config.yml
文件。如果该文件不存在,你需要手动创建它。
- Linux/macOS:
~/.cloudflared/config.yml
- Windows:
C:\Users\<YourUsername>\.cloudflared\config.yml
(或者你安装时指定的配置目录)
2. 编辑配置文件:
使用你喜欢的文本编辑器打开 config.yml
文件,并根据你的需求进行配置。
基本配置示例 (穿透一个本地 Web 服务):
假设你创建的 Tunnel ID 是 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
,凭证文件是 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json
,你想将子域名 service.yourdomain.com
指向运行在本地 8080
端口的 HTTP 服务。
“`yaml
Tunnel 的 UUID,从 cloudflared tunnel create
命令的输出中获取
tunnel: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Tunnel 凭证文件的路径,相对于 config.yml 文件或使用绝对路径
通常和 config.yml 在同一目录下,直接写文件名即可
credentials-file: /root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json # Linux/macOS 示例路径
credentials-file: C:\Users\Admin.cloudflared\xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json # Windows 示例路径
入口规则 (Ingress Rules) – 定义如何处理进入 Tunnel 的流量
ingress:
# 第一条规则:将 service.yourdomain.com 的请求转发到本地 8080 端口
– hostname: service.yourdomain.com
service: http://localhost:8080
# 第二条规则(可选):可以添加更多规则,指向不同的服务或域名
# – hostname: another.yourdomain.com
# service: http://192.168.1.100:80 # 指向内网其他机器的服务
# 第三条规则(可选):穿透 SSH 服务 (需要额外配置)
# – hostname: ssh.yourdomain.com
# service: ssh://localhost:22
# 第四条规则(可选):穿透 RDP 服务 (需要额外配置)
# – hostname: rdp.yourdomain.com
# service: rdp://localhost:3389
# 必须有一个“兜底”规则,处理所有未匹配到 hostname 的请求
# 通常将其指向一个返回 404 的服务,或者你内网的某个默认页面
– service: http_status:404
“`
配置文件解释:
tunnel
: 你的 Tunnel UUID。credentials-file
: 指向你的 Tunnel 凭证 JSON 文件的路径。请确保路径正确。ingress
: 这是配置的核心部分,定义了入口规则列表。hostname
: 你希望用户通过哪个域名访问你的服务。这个域名必须是你添加到 Cloudflare 并授权过的域名下的子域名(或根域名)。service
: 定义了hostname
对应的内网目标服务地址。http://localhost:8080
: 将 HTTP 请求转发到本地的 8080 端口。https://192.168.1.100:443
: 将 HTTPS 请求转发到内网192.168.1.100
的 443 端口。注意: 如果你的内网服务本身是 HTTPS,并且证书不是公开信任的,你可能需要在service
同级添加originRequest: { noTLSVerify: true }
来跳过证书验证。ssh://localhost:22
: 转发 SSH 连接。rdp://localhost:3389
: 转发 RDP 连接。tcp://192.168.1.50:6379
: 转发任意 TCP 流量(如 Redis)。http_status:404
: 一个特殊的 Service 类型,直接返回 HTTP 404 错误。这是必须的兜底规则,放在ingress
列表的最后,用于处理没有匹配到任何hostname
的请求。
重要提示: 确保 YAML 文件的缩进正确(通常使用两个空格)。
八、 配置 DNS 记录
配置好 config.yml
后,你需要告诉 Cloudflare DNS,将你指定的 hostname
指向你创建的 Tunnel。这样,当用户访问 service.yourdomain.com
时,Cloudflare 才知道要把请求通过 Tunnel 发送到你的 cloudflared
进程。
在终端中运行以下命令,将 <your-tunnel-name or UUID>
替换为你的 Tunnel 名称或 ID,将 <hostname>
替换为你在 config.yml
中配置的 hostname
:
bash
cloudflared tunnel route dns <your-tunnel-name or UUID> <hostname>
示例:
“`bash
使用 Tunnel 名称
cloudflared tunnel route dns my-home-server service.yourdomain.com
或者使用 Tunnel ID
cloudflared tunnel route dns xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx service.yourdomain.com
“`
这条命令会自动在你的 Cloudflare DNS 设置中为 service.yourdomain.com
创建一个 CNAME 记录,指向一个特殊的 Tunnel 地址(类似 xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.cfargotunnel.com
)。你无需手动创建或管理这个 CNAME 记录。
如果你在 config.yml
中配置了多个 hostname
,你需要为每一个 hostname
都执行一次 cloudflared tunnel route dns
命令。
你也可以登录 Cloudflare Dashboard,检查你的域名的 DNS 记录,确认 CNAME 是否已成功创建。
九、 运行 Tunnel
现在一切准备就绪,可以启动 Tunnel 了!
1. 测试运行 (前台运行):
首先,可以尝试在前台运行 Tunnel,以便观察日志输出,排查问题:
bash
cloudflared tunnel run <your-tunnel-name or UUID>
示例:
“`bash
使用 Tunnel 名称
cloudflared tunnel run my-home-server
或者使用 Tunnel ID
cloudflared tunnel run xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
“`
如果配置正确,你会看到 cloudflared
启动并输出连接到 Cloudflare 边缘节点的日志信息,类似:
INFO[0000] Starting tunnel tunnelID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
INFO[0000] Version 2023.x.x
INFO[0000] GOOS: linux, GOARCH: amd64, Go Version: go1.xx
INFO[0000] Settings: map[cred-file:/root/.cloudflared/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx.json tunnel:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx ...]
INFO[0000] Generated Connector ID: yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy
INFO[0000] Initial protocol quic
INFO[0000] ICMP proxy will use 192.168.x.x as source for ICMP replies
INFO[0001] Tunnel server connected at edge location: NRT (Tokyo)
INFO[0001] Tunnel server connected at edge location: LAX (Los Angeles)
...
看到类似 “Tunnel server connected” 的信息表示 Tunnel 已成功连接到 Cloudflare 网络。此时,尝试在浏览器中访问你配置的 hostname
(例如 https://service.yourdomain.com
)。Cloudflare 会自动为你处理 HTTPS 证书,所以请使用 https://
访问。
如果一切正常,你应该能看到你内网服务的内容了!
注意: 在前台运行时,关闭终端窗口会终止 Tunnel 连接。
2. 作为服务运行 (后台持久运行 – 推荐):
为了让 Tunnel 能够长期稳定地在后台运行,并且在系统重启后自动启动,强烈建议将其安装为系统服务。
Linux (使用 systemd):
“`bash
将 cloudflared 安装为系统服务
sudo cloudflared service install
启动服务
sudo systemctl start cloudflared
设置开机自启
sudo systemctl enable cloudflared
查看服务状态
sudo systemctl status cloudflared
查看服务日志
sudo journalctl -u cloudflared -f
“`
macOS (使用 launchd):
“`bash
将 cloudflared 安装为 launch daemon
sudo cloudflared service install
加载并启动服务 (通常安装后会自动加载)
sudo launchctl load -w /Library/LaunchDaemons/com.cloudflare.cloudflared.plist
查看服务日志 (大致位置)
tail -f /var/log/system.log | grep cloudflared
或者检查 /Library/Logs/com.cloudflare.cloudflared…
“`
Windows (作为 Windows 服务):
以管理员权限打开命令提示符或 PowerShell:
“`bash
将 cloudflared 安装为 Windows 服务
cloudflared service install
启动服务 (通常安装后会自动启动)
net start cloudflared
查看服务状态 (在 “服务” 管理单元中查找 cloudflared)
Get-Service cloudflared
“`
安装为服务后,cloudflared
会在后台自动读取 config.yml
文件并运行 Tunnel。即使你关闭了终端或重启了设备,Tunnel 也会保持运行。
十、 测试与验证
运行 Tunnel 后,进行最终测试:
- 清除浏览器缓存或使用隐私模式 访问你配置的
hostname
(例如https://service.yourdomain.com
)。 - 确认你能正常访问到你的内网服务。
- 检查浏览器地址栏的锁图标,确认 HTTPS 连接是安全的(由 Cloudflare 提供的证书)。
- 尝试从不同的网络环境(例如手机 4G/5G 网络)访问,验证公网可达性。
十一、 进阶功能与安全加固
Cloudflare Tunnel 还提供了许多强大的进阶功能:
- Cloudflare Access 集成: 这是强烈推荐的安全加固措施。你可以为你的 Tunnel 配置 Access 策略,要求用户通过邮箱一次性密码、GitHub/Google/Okta 等身份提供商登录后才能访问你的服务,实现零信任访问控制。在 Cloudflare Dashboard 的 “Access” -> “Tunnels” 部分可以进行配置。
- 负载均衡: 如果你在内网有多个实例提供相同的服务,可以在
config.yml
中配置负载均衡,将流量分发到不同的service
地址。 - 更多协议支持: 除了 HTTP/S、SSH、RDP,还支持任意 TCP 流量、WebSocket、gRPC 等。
- Argo Smart Routing (付费): 启用后,Cloudflare 会利用其私有骨干网络优化流量路径,进一步降低延迟,提升访问速度。
安全注意事项:
- 最小权限原则: 只暴露你确实需要对外提供访问的服务。
- 使用 Cloudflare Access: 对于任何涉及敏感数据或控制权限的服务(如管理后台、数据库、SSH),务必启用 Access 进行身份验证。
- 保持
cloudflared
更新: 定期运行sudo apt-get update && sudo apt-get upgrade cloudflared
(Linux) 或brew upgrade cloudflared
(macOS) 或重新下载安装包 (Windows) 来获取最新的安全补丁和功能。 - 监控日志: 定期检查
cloudflared
的服务日志,关注异常连接或错误信息。 - 保护好凭证文件: 确保证书文件 (
cert.pem
) 和 Tunnel 凭证文件 (.json
) 的安全,不要上传到公共代码库或共享给他人。
十二、 常见问题与故障排除
- 无法访问
hostname
:- 检查 Tunnel 是否正在运行 (
systemctl status cloudflared
或cloudflared tunnel list
)。 - 检查
config.yml
文件语法是否正确,路径是否正确。 - 检查 DNS CNAME 记录是否已在 Cloudflare Dashboard 中正确创建并生效(DNS 传播可能需要一点时间)。
- 检查运行
cloudflared
的设备防火墙是否允许出站连接到 Cloudflare。 - 检查内网目标服务是否正常运行,并且
cloudflared
所在的设备能够访问该服务地址(例如,在cloudflared
设备上curl http://localhost:8080
看是否通)。
- 检查 Tunnel 是否正在运行 (
- 看到 Cloudflare 错误页面 (如 502 Bad Gateway):
- 通常表示
cloudflared
无法连接到你的内网服务。检查服务是否运行,地址和端口是否在config.yml
中配置正确,cloudflared
设备与服务之间的网络是否通畅。 - 检查
cloudflared
服务日志获取更详细的错误信息。
- 通常表示
- HTTPS 证书问题:
- 访问
hostname
时,HTTPS 证书是由 Cloudflare 自动提供的,通常不会有问题。 - 如果你穿透的是内网的 HTTPS 服务 (
service: https://...
),并且该服务使用的是自签名证书或非公共 CA 颁发的证书,你可能需要在config.yml
的对应ingress
规则下添加originRequest: { noTLSVerify: true }
来让cloudflared
忽略对源服务器证书的验证。但请注意,这会降低安全性,只在确认源服务器可信的情况下使用。
- 访问
十三、 总结
Cloudflare Tunnel 无疑是一款革命性的内网穿透工具。它将复杂的网络配置过程简化为几条命令和一个配置文件,同时提供了企业级的安全性、稳定性和性能——而且这一切核心功能都是免费的。
通过本教程,你应该已经掌握了如何利用 Cloudflare Tunnel 将你的内网服务安全地发布到互联网。无论是临时调试、长期托管个人项目,还是构建安全的远程访问通道,Cloudflare Tunnel 都能成为你手中强大的利器。
立即行动起来,体验 Cloudflare Tunnel 带来的便捷与安全吧!随着你对它的深入使用,你会发现更多高级功能和可能性,让你的网络连接与管理更加得心应手。