闲来无事,发现邮箱中还有之前在云筏开通CloudFlare Pro的邮件,想着要不再开一年算了反正也不贵,结果发现现在好像都不卖CloudFlare Pro了,看了几个博客说是官方暂停了相关的API。于是就放弃了,没想到在Cloudflare Pro 有没有低价开通的渠道-美国VPS综合讨论-全球主机交流论坛 – Powered by Discuz! (hostloc.com)中发现有人提到了CloudFlare Saas可以实现CNAME接入,这样不就可以实现境外的用户访问CloudFlare CDN,国内直接访问源站了,极大程度上保护了源站IP不被直接发现,还能借助CloudFlare的CDN抗住一点网络攻击,提高境外用户访问速度。于是就准备折腾一下,并记录在此,对于有些疑问的地方我也做了一些说明。
1. 前提
- CloudFlare 账户一个,并且该账户中已经有接入的域名,在后面的文章中皆以 tvzr.com为例。
- 云服务器一个(一般时国内的,国外的就直接套了)
- 已备案的域名一个。
2. 在Cloudflare中解析域名
首先,将已经接入CloudFlare中的域名新增一个A记录的解析,例如我的解析内容:
如图中红框所示,我新增了一条解析,cdn.tvzr.com 指向了我阿里云服务器的IP。并且需要开启代理。
注意:不需要将cdn.tvzr.com绑定到阿里云服务器上。
3. 开启CloudFlare Saas
在SSL\TLS -> 自定义主机名,点击启用CloudFlare Saas。
开启完成后,在回退源处填入第二步解析的域名地址:
点击添加自定义主机名,将你需要代理的域名填写进去,例如本站的dev.net.cn
根据接下来的提示,在主站(dev.net.cn)域名处新增两条TXT的解析,稍等一会儿刷新,确认状态都是有效即可。
注意,还需要设置严格模式,否则会一直提示Too Many Redirects,原因是绝大多数都配置了非http跳转到https。
4. 新增主站域名解析
我的域名托管在阿里云,我就以阿里云为例,新增如下解析。
设置境外来源,CNAME到 cdn.tvzr.com 即可。
略微等一会儿即可生效,为了避免配置出错,我还特地开通了一个美国的VPS用来测试。
root@vultr:~# ping dev.net.cn
PING cdn.tvzr.com (172.67.144.158) 56(84) bytes of data.
64 bytes from 172.67.144.158 (172.67.144.158): icmp_seq=1 ttl=57 time=1.28 ms
64 bytes from 172.67.144.158 (172.67.144.158): icmp_seq=2 ttl=57 time=1.28 ms
64 bytes from 172.67.144.158 (172.67.144.158): icmp_seq=3 ttl=57 time=1.31 ms
此时可以看到,域名指向的IP地址已经变成了CloudFlare的IP。光有这个还不行,通过curl命令查看返回的内容是否正确
curl https://dev.net.cn/303.html
如果打印了网站的源代码,那就说明成功了。
5. 解决Nginx无法获得真实IP的办法
以上操作完,虽然已经可以实现境外用户访问CloudFlare CDN,但还有个小瑕疵,查看Nginx中的访问日志,会发现它记录的IP并不是用户的真实IP,而是CloudFlare的IP。
172.71.150.79 - - [25/Apr/2023:13:02:19 +0800] "GET /303.html HTTP/2.0" 200 14205 "-" "curl/7.74.0"
172.71.150.140 - - [25/Apr/2023:13:03:44 +0800] "GET /303.html HTTP/2.0" 200 14205 "-" "curl/7.74.0"
因为是通过curl访问的,所以没有UA信息。为了记录正确IP,可参考本站的另一篇《使用CloudFlare时Nginx获取真实IP的方法》,配置完成后就可以得到正确的IP地址了。
144.202.94.86 - - [25/Apr/2023:13:10:23 +0800] "GET /303.html HTTP/2.0" 200 14205 "-" "curl/7.74.0