😀 前言:
如果你正在挑选一个可靠且免费的内网穿透服务,那么 Cloudflare Tunnel 应该就是最完美的选择
1. 简介
Cloudflare Tunnel 是一款由 Cloudflare 提供的内网穿透工具,它允许你将位于内网的服务器或服务安全地暴露到互联网上,而无需在防火墙上打开任何入站端口,这就意味着可以即便你没有公网IP,也可以将自己的服务,网站等绑定到自己的域名上,而且不需要太过担心安全问题,证书问题,备案问题等
2. Cloudflare Tunnel 的优劣
2.1 优势
- 安全性高:
- 隐藏源站 IP: Cloudflare Tunnel 通过在你的服务器和 Cloudflare 边缘网络之间建立加密的出站连接,隐藏了你的服务器的真实 IP 地址,有效防止直接攻击。这一点对于家庭服务器而言是非常重要的,因为如果你使用的是云服务商的服务器,服务商会主动提供一些端口的保护机制,而家庭服务器的使用中,很多人为了方便会将自己的一些例如NAS,Blog等服务通过DDNS+端口转发的方式将服务暴露在公网中,这就很容易被不法分子进行恶意攻击(如果你没遇到只能说你因为还没轮到你),而一般人是不太具备相关的网络安全技能来保障自己的家庭服务器免受攻击的,所以使用内网穿透是非常有必要的,并且我个人强烈介意所有在使用个人服务器的人都将自己的所有对外端口都关闭掉,以绝后患!!
- 集成 Cloudflare 安全功能: 流量通过 Cloudflare 的全球网络,自动享有 DDoS 防护、Web 应用程序防火墙 (WAF) 等企业级安全功能
- 零信任安全模型: 结合 Cloudflare Access,可以实现基于身份的访问控制,只有经过授权的用户才能访问内部资源,提升了整体安全性。
- 无需开放入站端口: 所有连接都是从你的内网服务器向 Cloudflare 出站建立,避免了在防火墙上开放危险的入站端口
- 易用性与便利性:
- 快速设置: 通过简单的 CLI 命令或 Web UI 即可快速部署和配置,无需复杂的网络知识。
- 自动管理证书和 DNS: Cloudflare 自动处理 SSL/TLS 证书的颁发和续订,并与 Cloudflare 的 DNS 服务无缝集成。这对于个人的网站是非常方便的,省去了证书相关的配置
- 无需公网 IP: 即使你的服务器没有公网 IP 地址,也可以通过 Cloudflare Tunnel 进行对外访问,非常适合家庭网络或 CGNAT 环境。或许有些同学是拥有动态公网IP的,但是个人依然不太建议通过开放端口的方式来访问,除非你明确的知道你这么做可能会带来什么而且你都能承受的起!!
- 性能优异:
- 全球网络加速: 流量通过 Cloudflare 的全球边缘网络路由,靠近用户,可以显著提升访问速度和响应时间。
- 免费额度:
- Cloudflare Tunnel 提供慷慨的免费套餐,通常包含无限带宽,对于个人用户或小型项目来说非常划算。
2.2 劣势
个人觉得这两个小劣势在优势面前都可以忽略,而且对于域名的DNS托管或者是域名的迁移,个人认为是利大于弊的,尤其是对于那些域名托管在国内的用户而言,网站需要备案这一条就很烦人了!
- 依赖 Cloudflare 生态系统:
- 供应商锁定: 你必须拥有一个 Cloudflare 账户,并且通常需要将域名托管在 Cloudflare 上。这会使你的应用与 Cloudflare 的生态系统紧密绑定,可能限制未来的灵活性。
- 部分功能付费: 虽然有免费套餐,但高级功能(如更多的隧道数量、UDP 隧道等)可能需要付费订阅
3. Cloudflare Tunnel 配置
3.1 准备
- 一台联网的机器
- 在 cloudflare 有一个域名 / 有一个域名的解析服务托管在cloudflare
3.2 安装cloudflared
选择任意一个内网的机器,安装cloudflared,待会用于获取设备的认证密钥等,具体的安全请参考官方安装文档,其中详细的说明了各种操作系统的安装方法
3.3 获取认证证书
⚠️ Note : 这个证书是一个身份认证密钥,并不会直接作用于cloudflare tunnel的配置,仅仅使用下一步创建 tunnel 时候的身份认证
cloudflared login
根据提示,打开网页进行登录后,然后会在~/.cloudflared/cert.pem 位置生成一个证书
3.4 创建 tunnel
⚠️ Note : 如果你没有进行上个步骤的操作,本步骤是无法创建成功的
cloudflared tunnel create your-tunnel-name
your-tunnel-name是您给 Tunnel 取的名字,可以自定义,例如在家里的服务器的可以叫 home-cft- 执行成功后,它会显示 Tunnel 的
UUID,并在~/.cloudflared/目录下生成一个<TUNNEL_UUID>.json文件。这个 JSON 文件就是我们需要的凭证,请务必备份好它
3.5 配置 cloudflared 服务
为了稳定性以及数据的备份方便,这里通过 docker 来使用 cloudflared 服务
-
新建文件夹 :
mkdir -p ~/docker/cloudflared -
拷贝
<TUNNEL_UUID>.jsoncp ~/.cloudflared/ <TUNNEL_UUID>.json ~/docker/cloudflared chmod 644 ~/docker/cloudflared/ <TUNNEL_UUID>.json -
配置config.yml文件:修改相关的
TUNNEL_UUID,hostname,service# ~/docker/cloudflared/config.yml tunnel: <TUNNEL_UUID> # 这里是容器内的路径,不要修改,只更改 TUNNEL_UUID 即可 credentials-file: /etc/cloudflared/ <TUNNEL_UUID>.json loglevel: info protocol: http2 # 注意为了统一管理,我们将域名的映射等全部放在云端配置,所以不配置 ingress # ingress: # # 规则一:代理 server1 # - hostname: server1.your.hostname # service: http://192.168.1.100:8080 # 假设映射到了局域网内 192.168.1.100 主机的 8080 端口 -
配置
docker-compose.yml# ~/docker/cloudflared/docker-compose.yml version: '3.8' services: cloudflared: image: cloudflare/cloudflared:latest container_name: home-cft # 换个名字以示区分 restart: unless-stopped command: tunnel --config /etc/cloudflared/config.yml run volumes: # 将当前目录下的所有文件挂载进去 - ./:/etc/cloudflared/ # 添加 extra_hosts 使得 host.docker.internal 生效 # 这是让容器内能解析 host.docker.internal 到宿主机的关键 extra_hosts: - "host.docker.internal:host-gateway" # 使用 http2 访问速度会快很多 environment: - TUNNEL_TRANSPORT=http2 -
启动 :
docker compose up -d -
配置DNS解析记录:cloudflare默认是不会自动配置DNS解析的
- 登录个人账户,选择要使用的域名,这个域名就是你上述配置文件中所使用的那个域名
- 选择DNS,添加DNS记录
- 类型:CNAME
- 名称:上述配置文件中所使用的,例如server1,server2
- 内容:<TUNNEL_UUID>.cfargotunnel.com
- 代理状态:已代理(橙色🟠云朵)
-
访问:此时应该就可以通过域名访问对应的服务了
3.6 在线配置代理地址
可以在配置上述的配置文件的时候就完成对域名以及本机地址端口等配置,但是更加推荐使用云端的配置,并且云端与本地是互斥的,所以只推荐在云端做配置
-
使用Cloudflare的Zero Trust,访问https://one.dash.cloudflare.com/
-
左侧边栏 网络 → Tunnels , 即可看到自己创建的 cloudflare tunnle
- 点击连接器ID,可以看到一些日志信息,并且如果你所配置的服务是之前通过本地的配置文件创建的,其会提醒是否要转成在线的配置
- 点击尾部的
三个点,可以看到配置,其中的公共主机名中可以进行相关的域名配置,具体可见下图

💡 有关本问的问题,欢迎您在底部评论区留言,一起交流~