免费的Cloudflared实现外网访问群晖

周一发了一些菜,周二发了连花清瘟胶囊,但是心里还是有点慌的,毕竟小区已经连续三天上榜了。好消息是 4 号全市统一核酸后未再收到采样异常的通知,但是具体的封控措施还没有公告,按规定的话怎么也得到17~18号了吧

团购原则上已经禁止了,因为一旦发生疫情风险,要由组团人承担法律相关责任,如果不是弹尽粮绝,没人愿意在这个时候去承担风险吧。


前言

老苏没有公网 IP,所以想从外网访问群晖,目前已经实践了 3 种方式,而第 4 种则是我们今天准备实践的

  1. 第一种是基于 ZerotierTailscale 等第三方 VPN 软件,优点是不需要有自己的公网服务器,安装简单,但是缺点是需要在访问的机器上安装客户端软件,在打洞失败的时候,需要通过公共服务器中转,会导致速度的下降;

    • 外网访问群晖的新方案Tailscale

  1. 第二种是基于 frpnpsngrok 等内网穿透软件,优点就不说了,缺点是需要有一台具有公网 IP 的服务器来安装 Server 端软件;

    • 轻量级内网穿透代理服务器nps试用

  1. 第三种是混合了第一种和第二种的混搭,比如 AnyLink,因此也同时具备了 12 的缺点
    • 企业级远程办公vpn软件AnyLink

  1. 第四种就是我们现在准备尝试的 Cloudflared,优点是不再需要用到有公网 IPVPS 搭建服务,因为我们可以使用 Cloudflare 平台提供的 Cloudflare Tunnels,不仅如此,还可以不需要反向代理,不需要备案就可以使用 80443 端口,也再不需要自己申请 SSL 证书,而且这一切都是免费的

什么是 Cloudflared ?

CloudflaredCloudflare Tunnel 的客户端(以前的 Argo Tunnel),Cloudflare Tunnel 是您的服务器和 cloudflare 之间的隧道,可以将流量从 Cloudflare 网络代理到您的服务器。

这是一张 Cloudflare Tunnel 的工作原理

而老苏最终搭建的是这样的

准备工作

整个流程是👇这样的:

注册用户

首先你需要一个 Cloudflare 的账号,如果没有可以去注册一个

网站地址:https://www.cloudflare.com/zh-cn/ ,站点支持简体中文,所以还是很简单的;

添加站点

需要准备好一个域名,老苏用的还是 freenom 申请的免费域名

登录 cloudflare 成功后,右上角 添加站点,输入网站的根域名,如果您的网站是 www.example.com,就输入 example.com

老苏选择了免费的计划,之后会识别所有 DNS 记录,点 继续

会显示没有 DNS 记录,不用管,直接点 确认

会提示更换 nameservers ,这个是每次自动分配的,不能更改

按要求回到域名提供商那里修改 NameServer 就可以了,将域名的 NameServer 改为分配的 Cloudflare 的名称服务器

后面的配置建议,可以跳过,建议执行一下

创建隧道

接下来需要在 Zero Trust 上创建隧道。在左侧菜单中找到 Zero Trust

获取隧道 UUID

在新打开的页面中,找到左侧的 Access,展开后点击 Tunnels,给 Team name 取个名字

选择方案

老苏选的免费计划,但还是需要绑一张卡的

Create a tunnel 创建 Tunnel,名字无所谓的,只要便于自己识别就行

当前的状态还是 inactive

复制你的隧道 UUID,保存好备用

获取隧道 token

Configure 中能找到 docker 安装的方法和 token

【注意】:
1、undefined 要改,老苏选了最新的 2022.3.4
2、涂抹的地方即为隧道的 token

1
2
3
4
5
6
7
8
9
10
11
12
# 原始版本
docker run cloudflare/cloudflared:undefined tunnel --no-autoupdate run --token <隧道 token>

# 老苏改造后支持配置文件文件
# 1.先建 cloudflared 目录
# 2.在目录中放 config.yaml 文件,后面会介绍文件的内容
# 3.一键安装
docker run -d \
--name=cloudflared \
-v /volume1/docker/cloudflared:/etc/cloudflared \
cloudflare/cloudflared:2022.3.4 \
tunnel --config /etc/cloudflared/config.yaml --no-autoupdate run --token <隧道 token>

创建文件

docker 文件夹中,创建一个新文件夹,并将其命名为 cloudflared,你可以在本地创建一个 config.yaml 文件,文件的内容如下:

1
2
3
4
5
6
7
8
9
10
11
tunnel: <隧道 UUID>
credentials-file: /root/.cloudflared/<隧道 UUID>.json

ingress:
- hostname: example.com
service: http://192.168.0.199:8180
- hostname: ha.example.com
service: http://192.168.0.199:7123
- hostname: po.example.com
service: http://192.168.0.199:9000
- service: http_status:404

文件保存后,上传到 cloudflared 目录

简单说明

  • hostname:为公网访问的域名
  • service:对应的本地服务

更详细的说明,你可以在官方的 Ingress rules 章节中找到:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/configuration-file/ingress/

域名解析

进入相应的域名,找到 DNS 菜单

因为还没添加,所以 dns 记录还是空的

我们前面在 config.yaml 中添加了 3 个域名,一个根域名,两个二级域名,都需要做 CNAME 解析,将目标指向 <隧道 UUID>.cfargotunnel.com

其中根域名,名称直接用了 @

不建议用根域名,这里只是为了演示。因为按照规则 CNAME 记录不能应用于根域名,会提示 CNAME 拉平。

子域名的名称直接用了前缀

完成了三个域名的解析

到这里,准备工作全部完成了

安装

上面的命令行是最快捷的,也可以在群晖上用 Docker 管理器安装。

在注册表中搜索 cloudflared ,选择第一个 cloudflare/cloudflared,版本选择了最新的 2022.3.4

这个版本只支持 x86 平台,所以如果你需要在其他平台上运行,可以考虑第四个 msnelling/cloudflared ,据说可以支持多架构

高级选项

勾选 启用自动重新启动

文件夹 装载路径 说明
docker/cloudflared /etc/cloudflared 存放设置文件

环境

命令中输入 tunnel --config /etc/cloudflared/config.yaml --no-autoupdate run --token <隧道 token>

运行

Cloudflared 容器成功启动后,日志中看到下面的内容,说明隧道已经开始工作

回到 CloudflareTunnels,你会发现状态已经是 active

点红框中的小箭头,可以展开看到连接的 Cloudflared ,也就是 Cloudflare Tunnel 的客户端

一个隧道可以有多个 Cloudflare Tunnel 的客户端

现在你可以在浏览器中输入 3 个域名进行访问,不出意外的话,应该都是可以正常访问的

根域名绑的是测速应用 LibreSpeed,从测试的结果看不同时段、不同地域网速的差异还是很大的

小结

虽然看起来好像很复杂的样子,但是也就第一次,后续每次添加一个应用,只要做三步操作:

  1. config.yaml 添加相应的 hostnameservice
  2. 然后在 dns 记录中给相应的 hostname 做一个 CNAME 解析
  3. 最后重新启动一下 Cloudflared 容器

所以说相当简单,安全性等其他方面的设置,慢慢再研究了,目前老苏同时支持 frptailscaleCloudflared,这三者可以同时运行而且相互间没有干扰,这点非常好👍

参考文档

cloudflare/cloudflared:Cloudflare Tunnel 客户端(以前的 Argo Tunnel)
地址:https://github.com/cloudflare/cloudflared

Set up your first tunnel · Cloudflare Zero Trust docs
地址:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/install-and-setup/tunnel-guide/

Configuration file · Cloudflare Zero Trust docs
地址:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/configuration-file/

Ingress rules · Cloudflare Zero Trust docs
地址:https://developers.cloudflare.com/cloudflare-one/connections/connect-apps/configuration/configuration-file/ingress/

No more VPN. Introducting Cloudflare Tunnel // Szymon Sakowicz
地址:https://www.sakowi.cz/blog/cloudflared-docker-compose-tutorial