Cloudflare - 又名当代网络活菩萨 我必须写一篇记录,称赞一下 Cloudflare 这个活菩萨。

常见的开发者使用的服务场景

我们来考虑一些常见的开发者场景,假设我有两台主机在同一个局域网中:

  • 主机 A:http://192.168.1.10
    • 运行了一个博客服务,比如 halo、typcho 等等,搭建好之后,你可以通过内网 ip:http://ipA 来访问你的博客。
    • 运行了一个数据库服务做测试,比如 mysql、psql、mongodb 等,搭建好之后,你可以通过内网 ip:http://ipA:3356 来连接数据库。
  • 主机 B:http://192.168.1.11
    • 运行了一个网络存储服务,比如 alist、基于 alist 封装的第三方工具如 xiaoya 等,搭建好之后,你可以通过内网 ip:http://ipB:1234 来访问你的个人存储服务。

至此,我常用的服务都可以正常在内网访问、使用、测试。

问题来了,如果我想让这些服务暴露在公网上,让其他人也可以访问怎么做呢?通常有以下方案:

  • 购买一台云主机+一个域名,通过 frp 服务,将局域网内的服务映射到这台云主机进行访问。
  • 购买第三方服务商提供的 ngrok 或者 frp 服务,在局域网安装相应客户端,将不同的服务端口映射到 服务商的主机上进行访问。通常也可以绑定自己的域名。

以上两种方案其实本质相同,只不过一种是通过自建云主机,一种是购买服务商服务。 特点:带宽取决于购买的云主机或者服务商配置,有钱可以上高配,线路稳定。 不便之处: 国内主机或者节点需要备案+实名认证。

服务商服务,通常会提供一些免费的节点,缺点是免费的网络不稳定,速度慢,这也可以理解,毕竟免费的。但是同时它还有内容限制(你懂的)并且节点可能一段时间后就到期停掉,必须重新换节点,甚至服务商跑路,要换服务商,这就很麻烦。

有没有一种方法,免费不跑路没有内容、端口限制且不需要备案+实名认证的方案呢?

当然,就是 Cloudflare Zero Trust - Cloudflare tunnel。下面简单介绍一下搭建过程。

使用Cloudflare tunnel前提条件

  1. 注册 cloudflare 账号。
  2. 在 cloudflare 已有一个域名或者在其他服务商注册了域名,通过域名迁移把它从其他服务商中迁移到 cloudflare,如下图所示,按步骤走即可。 域名迁移至 cloudflare

使用Cloudflare tunnel操作步骤

  1. 进入 cloudflare 中控制台,左边选择"Zero Trust" - "Networks" - "Tunnels",如下图所示: cloudflare-tunnel

  2. 选择"Create a tunnel" - "Cloudflared Connector", 按提示输入 tunnel 名称创建一个 tunnel。

  3. 到这里创建好了一个 tunnel,下面进行客户端配置,让主机能够连上 cloudflared connector。我这里安装到上面提到的主机 A,根据主机操作系统选择不同的客户端安装命令,我是 arm64 的 debian 主机,直接复制左边的命令进行安装启动 cloudflared 服务:

    注意这里,安装后,启动cloudflared服务时有可能会遇到错误: cloudflare tunnel edge discovery: error looking up Cloudflare edge IPs: the DNS query failed error="lookup v2-origintunneld.tcp.argotunnel.com on 100.100.100.100:53: no such host" 这个错误显示dns找不到v2-origintunneld.tcp.argotunnel.com地址,解决方案是设置你的主机(或者路由器)dns 为 1.1.1.1、8.8.8.8 ,然后重新运行 cloudflared 的启动命令:systemctl start cloudflared.service

    客户端cloudflared服务成功启动后,你会在 cloudflare 控制台的 tunnel 中看到刚刚你创建的 tunnel已经连接上了 connector,并有了 connector ID,如下图所示:

  4. 配置你要暴露到公网的服务,比如博客、存储等, 我主机 A默认的 80 端口就是博客,如果我要让公网可以访问我的博客,那么我只需要在 cloudflare tunnel 的 configure中选择"Public Hostname" - "Add a public hostname", 在此页面中输入二级域名(若需要),选择已托管在 cloudflare 中的域名和路径(若需要),下面的服务选择你本地主机的服务,比如 http://localhost, 默认就是 80 端口,保存即可。

    上面截图的例子mydomain.com 只是一个示例,你选择你自己托管在 cloudflare 中的域名即可,按此配置,最终的效果就是,访问 blog.mydomain.com 就可以访问到我本地主机 A 中运行的博客了。如果你有其他端口的其他服务,只要更换二级域名 blog 为其他,下面的服务更换端口如 localhost:3456 即可。

  5. 如果想让一台主机 A 安装了cloudflare tunnel 后可以访问局域网内其他主机的端口服务有两个方案:

    • 在主机 A 中安装一个 nginx 进行反向代理到其他主机服务,这样就可以在一台主机安装cloudflared 后访问局域网内所有主机上的服务,不用每一台主机都装。nginx 示例:
      pstream another { server 192.168.1.11:8900; }
      erver {
      listen  18900;
      listen  [::]:18900;
      server_name  another.mydomain.com;
      charset utf-8;
      client_max_body_size 10G;
      
      location / {
      	proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      	proxy_set_header Host $http_host;
      	proxy_set_header X-Real-IP $remote_addr;
      	proxy_set_header Range $http_range;
      	proxy_set_header If-Range $http_if_range;
      	proxy_redirect off;
      	proxy_pass http://another;
      }
      
      
      然后配置 cloudflare tunnel 的 public hostname: another.mydomain.com, 本地服务:HTTP://localhost:18900, 访问 another.mydomain.com 即可访问我主机 B 中的 8900 服务了。若无法访问,请注意局域网内防火墙配置。
    • 配置 cloudflare-tunnel-Private Network,让其可以访问局域网中其他主机服务。

好了,到这里就实现了免费把自己局域网内的 web 服务暴露到公网上供别人访问,大家可以自己试试~唯一缺点是访问可能有时有点慢,但考虑到完全免费,此缺点我视而不见~

标签: Cloudflare, 内网穿透, Cloudflare Tunnel

添加新评论

0%