背景

近日在研究通过Cloudflare SaaS使用优选IP的时候发现CloudFlare Tunnel无法兼容SaaS。Cloudflare Tunnel后台无法绑定其他不在CloudFlare绑定的域名。经过了一些研究,总结出了可以使Cloudflare tunnel兼容Cloudflare SaaS的方法。

解决思路

由于问题的根源是在Cloudflare Tunnel无法使用其他没有在CloudFlare上绑定的域名。我们得想办法绕过这个限制。通过参考Cloudflare Tunnel的官方文档,我们发现本地管理型隧道Locally-managed tunnel · Cloudflare Zero Trust docs可以支持绑定任意域名。于是解决方法为使用本地管理型隧道而不是官方默认推荐使用的云端管理型。

设置本地管理型隧道

首先,我们需要创建并成功运行一个最基本的本地管理型隧道。

隧道需要至少绑定在一个SaaS回源域名上。

推荐参考官方文档Create a locally-managed tunnel (CLI) · Cloudflare Zero Trust docs

当我们成功运行本地管理型隧道后可以进一步修改配置文件使SaaS可以在隧道上工作。

进一步修改配置文件

官方文档有列出具体的修改选项。我们可以参考以下两个链接:

Configuration file · Cloudflare Zero Trust docs

Origin configuration · Cloudflare Zero Trust docs

根据情况,将配置文件进行以下修改

tunnel: <some-tunnel-uuid>
credentials-file: <some-json-file>

ingress:
   - hostname: "你的回源域名 比如aaa.com"
     service: 你的本地服务地址。比如127.0.0.1:443
     originRequest:
        noTLSVerify: true  
   - hostname: "你的使用SaaS的域名比如 bbb.com 123.bbb.com"
     service: 127.0.0.1:443  #同上
     originRequest:
        noTLSVerify: true  #必须为True。因为Cloudflare永远只会验证aaa.com,不开这个选项的话会验证失败。
   - hostname: "使用SaaS的域名也支持通配符。比如 *.ccc.com"
     service: 127.0.0.1:443  #同上
     originRequest:
        noTLSVerify: true

#这里是Catch All规则,当以上域名都没有匹配上时会执行这段。官方默认是返回404状态。这里我们让它继续处理请求。
   - service: 127.0.0.1:443  #同上
     originRequest:
        noTLSVerify: true

设置完毕后,重启Tunnel后SaaS应该就可以使用了。