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前提条件
- 注册 cloudflare 账号。
- 在 cloudflare 已有一个域名或者在其他服务商注册了域名,通过域名迁移把它从其他服务商中迁移到 cloudflare,如下图所示,按步骤走即可。
使用Cloudflare tunnel操作步骤
-
进入 cloudflare 中控制台,左边选择"Zero Trust" - "Networks" - "Tunnels",如下图所示:
-
选择"Create a tunnel" - "Cloudflared Connector", 按提示输入 tunnel 名称创建一个 tunnel。
-
到这里创建好了一个 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,如下图所示:
-
配置你要暴露到公网的服务,比如博客、存储等, 我主机 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
即可。 -
如果想让一台主机 A 安装了cloudflare tunnel 后可以访问局域网内其他主机的端口服务有两个方案:
- 在主机 A 中安装一个 nginx 进行反向代理到其他主机服务,这样就可以在一台主机安装cloudflared 后访问局域网内所有主机上的服务,不用每一台主机都装。nginx 示例:
然后配置 cloudflare tunnel 的 public hostname: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; }
another.mydomain.com
, 本地服务:HTTP://localhost:18900
, 访问another.mydomain.com
即可访问我主机 B 中的 8900 服务了。若无法访问,请注意局域网内防火墙配置。 - 配置 cloudflare-tunnel-Private Network,让其可以访问局域网中其他主机服务。
- 在主机 A 中安装一个 nginx 进行反向代理到其他主机服务,这样就可以在一台主机安装cloudflared 后访问局域网内所有主机上的服务,不用每一台主机都装。nginx 示例:
好了,到这里就实现了免费把自己局域网内的 web 服务暴露到公网上供别人访问,大家可以自己试试~唯一缺点是访问可能有时有点慢,但考虑到完全免费,此缺点我视而不见~