注意:
每次授权成功都会添加一个 API Token 供 Tunnel 调用。
每次授权成功都会添加一个 API Token 供 Tunnel 调用。
Cloudflare Tunnel(之前名为 Cloudflare Argo Tunnel)是 Cloudflare 的一款 新(?) 旧产品了,但是最早的几个版本使用体验极其糟糕,例如创建隧道只能获取一个随机的 UUID
作为隧道名,再加上能够找到的资料并不多而且漏洞百出,完全按照流程做一遍也无法成功配置,因此在折腾数次后果断放弃。
在经过很长时间的迭代后 Cloudflare Tunnel 终于好用起来了,并且看到有教程已成功实现使用 Cloudflare SaaS 域名接入 Cloudflare Tunnel,于是在踩坑后得出了快速配置的正确方法。
Cloudflare Tunnel 是一款隧道软件,可以快速安全地加密应用程序到任何类型基础设施的流量,让您能够隐藏你的 Web 服务器 IP 地址,阻止直接攻击,从而专注于提供出色的应用程序。
——Cloudflare1
简而言之,Cloudflare Tunnel 就是 Cloudflare 的免费内网穿透。目前免费版应该只支持 HTTP。
Cloudflare Tunnel 分为云端管理型和本地管理型,本地管理型是自己写配置文件,因此难度更大,但是也更灵活,如果需求简单可以直接选择云端管理型。无论是哪种 Tunnel 都支持一键安装。
先在面板添加 Tunnel,然后复制安装指令:
等待安装完成即可。
安装指令区分架构,请注意:
1 | # AMD curl -o /usr/bin/cloudflared -L "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64" # ARM curl -o /usr/bin/cloudflared -L "https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-arm64" # 设置可执行权限: chmod +x /usr/bin/cloudflared |
如果之后启动的时候提示有新版本,可以执行:
1 | #更新 cloudflared update |
这里不得不吐槽一下,一开始找到的升级文档,使用的方法是通过 Tunnel Replica 启动一个备用 Tunnel 以实现无缝切换,太复杂了。不过好像是我找错了文档……
如果是云端管理型,在面板中看到 Tunnel 状态为 Active
后点击配置,按照说明添加域名等即可。全过程均在控制面板完成,唯一不方便的就是添加的域名只能在你的账户域名中选取,SaaS 接入的域名无法添加(下文有解决方法)。
下文为本地管理型的配置方法。
先登录:
1 | cloudflared login |
打开登录 URL,选择一个域(随便哪一个,不影响后续接入)即可完成授权。
这点很重要以至于要单独拿出来说,因为免费计划 API Tokens 只能创建 50 个,也就是你只要授权 50 次,就会报错:Quota limit exceeded, you can create no more than 50 tokens.
:
因此虽然 Tunnel 限制数量为 10002,但是按默认流程配置,创建 50 次就超过 API Tokens 的限制数量了。
然而经测试,仅在使用 Cloudflared Cli 操作账户,例如添加、删除 Tunnel 时需要使用到授权,因此添加完隧道、获得了隧道的 <uuid>.json
后就可以在 Cloudflare 控制面板 中删除该 API Token。
根据进一步测试,授权下载的cert.pem
事实上是可以共用的,因此登录一次,保留此次的 API,之后直接粘贴之前获取的cert.pem
就可以了。
然后创建隧道:
1 | cloudflared tunnel create <YOUR_TUNNEL_NAME> |
会获得一个 Tunnel UUID,例如aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee
,和 包含 Tunnel 密钥等信息的文件 /root/.cloudflared/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.json
:
1 | {"AccountTag":"YOUR_ACCOUNT_TAG","TunnelSecret":"TUNNEL_SECRET","TunnelID":"aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"} |
编写 Tunnel 配置文件 /root/.cloudflared/config.yml
:
1 | tunnel: aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee credentials-file: /root/.cloudflared/aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.json ingress: - hostname: website.1.domain.com service: https://127.0.0.1:443 originRequest: noTLSVerify: true - hostname: website.2.domain.com service: http://127.0.0.1:8080 originRequest: noTLSVerify: true - service: http://127.0.0.1:80 originRequest: noTLSVerify: true |
这里以三个ingress
为例,含义分别是:
website.1.domain.com
转发到本地的 443
端口,使用 HTTPS,跳过证书验证;website.2.domain.com
转发到本地的 8080
端口,使用 HTTP,跳过证书验证;80
端口,使用 HTTP,跳过证书验证。其中noTLSVerify
在使用 SaaS 域名时必须为true
,因为验证的是回退源的证书,一定会返回错误。最后一项ingress
必须写。
安装服务:
1 | cloudflared service install |
如果你修改了配置文件,需要执行:
1 | cloudflared service uninstall rm -f /etc/cloudflared/config.yml |
卸载服务,然后再安装服务,配置文件才能生效。
然后,在面板中看到 Tunnel 状态为 Active
:
在 DNS 记录中,把想要接入的域名指向 CNAME:aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee.cfargotunnel.com
,如果是 SaaS 域名,只能把回退源指向这个,此域下的所有 SaaS 域名都会走 Tunnel 回源。
参考:
Cloudflare SaaS 域名回源 Cloudflare Tunnel 的方法
https://www.nodeseek.com/post-98866-1
先F12打开 DevTools,然后随意添加一个域名:
点击提交后,在网络请求里找到以 configurations
结尾的一个 PUT
请求,右键复制为 Curl 命令
,复制出的--data-raw ''
中就是前面的ingress
配置,按照上文说明,对配置文件稍作修改并提交,就可以在面板中看到新增的域名。之后 CNAME 等步骤同本地管理型。
普通请求经过 Cloudflare CDN 的路由如下:
1 | 客户端 -> 离客户端最近的 Cloudflare 节点 -> 服务端 |
如果你不是较高级计划,分配到的可能甚至不是最近的 Cloudflare 节点。例如中国大陆和台湾访问 Cloudflare Free 计划的域名,命中的都是美国节点。
Cloudflare 的 Argo Smart Routing 可以实现以下路由:
1 | 客户端 -> 离客户端最近的 Cloudflare 节点 -> 离服务端最近的 Cloudflare 节点 -> 服务端 |
这样相当于在回源过程中,国际互联部分由 Cloudflare 完成,客户端和服务端都只和最近的(甚至是本地的)Cloudflare 节点通信,对国际互联不好的节点而言有较大提升。
根据此原理,用香港入口转发日本、韩国、新加坡等地的服务器,延迟有略微提升(嗯,其实几乎没什么感觉)。另外,NAT 服务器用 Cloudflare 加速不再需要占用一条 Origin Rule,甚至服务器不开端口或者根本就没有公网 IP,也可以接入 Cloudflare,再也不用担心被 GFW 墙 攻击、扫描了。
配置 Cloudflare Argo Tunnel 并添加 Cloudflare SaaS 域名
评论