利用cloudflare Tunnels 实现内网穿透,外网可以访问本机服务器的web站点,免费赠送SSL

2024年4月8日
Share

今天在折腾 utunbu 服务器上架设的 wp 开发环境时,想要加一个HTTPS访问,就是SSL证书,网上搜索了一堆都嫌麻烦,偶然发现cloudflare Tunnels,实在是太强大了,以前真的是不敢想象,一行代码就能实现,太牛逼了,另外不得不给cloudflare 这样的良心企业点个赞,很多免费服务比其他一些公司的收费还好用。大大的赞。废话有点多了,直接开搞。

原先的需求是因为项目需要在开发环境使用HTTPS访问站点,现在即实现了HTTPS的访问,也可以在公网访问到内网的资源,不得不说真的很香。这里你需要准备的是

  • 一个托管在CF上的域名
  • 一个 cloudflare 账号,以及开通 cloudflare zero trust
  • 内网有一台本地服务器,用于运行本地与 cloudflare 通信的 cloudflared 程序

顺带介绍下Tunnel可以做什么?

  • 将本地网络的服务暴露到公网,可以理解为内网穿透。 例如我们在本地服务器 192.168.1.1:3000 搭建了一个 wordpress 个人博客,我们只能在内网环境才能访问这个服务,但通过内网穿透技术,我们可以在任何广域网环境下访问该服务。相比 NPS 之类传统穿透服务,Tunnel 不需要公网云服务器,同时自带域名解析,无需 DDNS 和公网 IP。
  • 将非常规端口服务转发到 80/443 常规端口。 无论是使用公网 IP + DDNS 还是传统内网穿透服务,都免不了使用非常规端口进行访问,如果某些服务使用了复杂的重定向可能会导致 URL 中端口号丢失而引起不可控的问题,同时也不够优雅。
  • 自动为你的域名提供 HTTPS 认证。
  • 为你的服务提供额外保护认证。
  • 最重要的是——免费。

Tunnel 工作原理

Tunnel 通过在本地网络运行的一个 Cloudflare 守护程序,与 Cloudflare 云端通信,将云端请求数据转发到本地网络的 IP + 端口。

开始

1. 打开 Cloudflare Zero Trust 工作台面板

2. 创建 Cloudflare Zero Trust ,选择免费计划。需要提供付款方式,使用境内的双币卡即可

填写team name,随意填写
选择免费计划
添加付款方式
填写信用卡信息(仅验证,不会扣款),完成配置
创建 Tunnel

4. 选择 Cloudflared 部署方式。

Tunnel 需要通过 Cloudflared 来建立云端与本地网络的通道,这里推荐选择 Docker 部署Cloudflared 守护进程以使用 Tunnel 功能。

获取 Cloudflared 启动命令及 Token

点击复制按钮复制指令,在本地网络主机上运行命令。我们还可以加上--name cloudflared -d --restart unless-stop为Docker容器增加名称和后台运行。你可以使用下方我修改好命令来创建 Docker,注意替换你为自己的 Token(就是网页中—-token 之后的长串字符)

docker run --name cloudflared -d --restart unless-stopped cloudflare/cloudflared:latest tunnel --no-autoupdate run --token eyJhIjoiYjcyNWQzMTkyZTQ1NmQ0ZDc5NzNhODAxYjQxYTQwMDUiLCJ0IjoiMTA5ZTdiNzktMmRiYS00MDA1LWI2N2ItZmYyMDhhNjkyY2IxIiwicyI6IlptSTJPVEk0TXpZdE1HRm1PQzAwTURJeUxXRm1GbE1ERTJOR1EwWW

这边如果是第一次部署服务器,也可以使用docker-compose,搭配其他项目一起,顺便贴上ai转换的配置文件,未来得及测试

version: '3.9'

services:
  cloudflared:
    image: "cloudflare/cloudflared:latest"
    container_name: "cloudflared"
    restart: "unless-stopped"
    command: ["tunnel", "--no-autoupdate", "run", "--token", "eyJhIjoiYjcyNWQzMTkyZTQ1NmQ0ZDc5NzNhODAxYjQxYTQwMDUiLCJ0IjoiNmJiY2E0NmMtZGFlMC00ODA3LThkOTYtYjdiMzFiMzRjMDIzIiwicyI6Ik1XVXdOR1JpTnpndE9XSTNaQzAwWVRnM0"]

解释:

  • version 指定 Docker Compose 配置文件的版本。
  • services 定义服务。
  • image 指定要使用的镜像。
  • container_name 指定容器名称。
  • restart 指定容器重启策略。
  • command 指定容器启动时要执行的命令。

5. 配置域名和转发URL

为你的域名配置一个子域名(Subdomain),Path 留空,URL 处填写内网服务的IP加端口号。注意 Type 处建议使用 HTTP,因为 Cloudflare 会自动为你提供 HTTPS,因此此处的转发目标可以是 HTTP 服务端口。

配置内网目标 IP+端口

完成

接着访问刚刚配置的三级域名,例如 https://app.yourdomain.com(是的,你没看错,是 https,cloudflare 已经自动为域名提供了 https 证书)就可以访问到内网的非公端口号服务了。一个 Tunnel 中可以添加多条三级域名来跳转到不同的内网服务,在 Tunnel 页面的 Public Hostname 中新增即可。

为你的服务添加额外验证

如果你觉得这种直接暴露内网服务的方式有较高的安全风险,我们还可以使用 Application 功能为服务添加额外的安全验证。

1. 点击 Application – Get started。

创建 Application

2. 选择 Self-hosted。

选择类型

3. 填写配置,注意 Subdomain 和 Domain 需要使用刚刚创建的 Tunnel 服务相同的 Domain 配置

配置三级域名

4. 选择验证方式。填写 Policy name(任意)。在 Include 区域选择验证方式,示例图片中使用的是 Email 域名的方式,用户在访问该网络时需要使用指定的邮箱域名(如@gmail.com)验证,这种方式比较适合自定义域名的企业邮箱用户。另外你还可以指定特定完整邮箱地址、IP 地址范围等方式。

选择验证方式

5. 完成添加

此时,访问 https://app.yourdomain.com 可以看到网站多了一个验证页面,使用刚刚设置的域名邮箱,接收验证码来访问。

评价

除了上述直接转发 http 服务之外,Tunnel 还支持 RDP、SSH 等协议的转发,玩法丰富,有待各位探索。作为一款免费的服务,简单的配置,低门槛使用条件,适合各位 Self-hosted 玩家尝试。不过要注意的是 Tunnel 在国内访问速度不快,并且有断流的情况,请酌情使用。

以上图文教程摘自少数派的文章