前言
我们在加速自己网站的时候时常用到CDN服务,很多服务器在境外的网站会考虑使用免费的CloudFlare CDN,它不仅可以加速我们的网站,也有着强大的WAF功能可以保护网站。本文将总结一下我自己使用CloudFlare加速和保护网站的使用心得。
CNAME绑定域名
使用Cloudflare的第一步就是需要将自己的域名绑定到CF上,这一点相信大家都会做,这里也不必多说。除了直接绑定外,还有一种通过CNAME绑定的方法,我目前就是使用CNAME绑定。
相信大家也都听说过CouldFlare推出的Cloudflare for SaaS。在任意一个绑定在Cloudflare上的域名(设为hoyue.feedback)的面板,SSL/TLS – 自定义主机名中开启这个功能。在免费版中,需要我们绑定一个支付方式,可以通过Payple绑定。
接下来确定一个回退源(dns.hoyue.feedback),它指向你的目的主机,这需要你去当前域名(hoyue.feedback)的DNS处添加你要绑定的主机地址。
在回退源状态为有效后,添加自定义主机名为你要绑定的域名,并且为它按要求添加TXT记录即可,等待一段时间即可。如图为添加成功的我的博客主域名。
最后,只需要将我的博客域名CNAME到这个回退源(hoyue.feedback)即可完成绑定。
这个过程我写得比较简单,我就简单总结一下过程:
- 找到任意一个绑定在CloudFlare上的域名(设为hoyue.feedback),并开启其自定义主机功能。
- 设定一个回退源(dns.hoyue.feedback),并且在DNS中指向目标主机。
- 添加自定义主机名为要绑定的域名(如hoyue.fun),并且按要求添加对应的解析。
- 为要绑定的域名添加CNAME解析到回退源(dns.hoyue.feedback)上。
这个方法提供了使用CNAME接入CDN的一种方法,可以用于分段式CDN。例如我的博客使用了DNSPOD解析,国内解析到我靠近大陆的CDN上,而国外解析到CloudFlare上,可以为了中国大陆优化的同时也让世界各地快速访问。
但是这个方法也有一个缺点:回退源只有一个,意味着你只能指向一台主机。
你设置缓存了吗
很多站长把网站加入Cloudflare CDN网络以后,就不管了,访问速度还是慢如蜗牛,这个时候应该好好看看设置缓存了没有。
CDN的原理我们可以看看Cloudflare官方给出的workflow:
简单来说就是CDN离用户很近,当你没设置缓存的时候,CDN服务器就连接到你的主机,并且将内容缓存到CDN服务器上,再返还给你,相当于你套了一层中转。
而设置了缓存的CDN服务器在用户访问时不会向你的主机获取信息,而是直接将它缓存的发给用户达到加速的目的。
所以开始CDN的缓存功能非常重要。默认情况下,Cloudflare不会为你缓存,你可以通过控制台查看返回的标头,它默认为dynamic状态。
可以在CloudFlare控制台中的两个地方设置缓存:Cache Rules和页面规则。页面规则只给了3条,而且功能强大不建议只用于缓存设置。故本文主要介绍使用Cache Rules进行缓存设置。
Cache Rules
在免费版Cloudflare中,在Cache – Cache Rules下有10条缓存条件额度,这个完全够一个站点设计缓存了。
首先可以尝试设计不符合缓存的项目,因为这条规则会优先跳过一些不需要缓存的内容(经过测试好像顺序不重要,这个倒是无所谓了)。下面是需要你添加一些缓存条件,这个需要你根据你自己的网站进行设计。
这里以我的WordPress为例,可以这些不缓存条件(以下均为OR):
URL路径 包含 /wp-admin (http.request.uri.path contains "/wp-admin")
:后台管理页面是动态的,不应该被缓存。Cookie 包含 “wordpress_logged_in_” (http.cookie contains "wordpress_logged_in_")
:已经登录的用户可以看到最新的页面。Cookie 包含 “comment_author_” (http.cookie contains "comment_author_")
:已经评论的用户可以立刻看到自己的评论。URI路径 包含以下各项 ".php" ".xml" (http.request.uri.path in {".php" ".xml"})
:含有php, xml等动态生成页面不该缓存。
当然还有很多其他的,你也可以自己拓展。记得选择缓存资格为绕过缓存。
之后你就可以设置符合缓存的项目了,基本就是上面不缓存的反过来即可。例如(以下均为AND):
主机名 等于 yourdomain (http.host eq "yourdomain")
:需要定位你的主机名URL路径 不包含 /wp-admin (not http.request.uri.path contains "/wp-admin")
:后台管理页面是动态的,不应该被缓存。Cookie 包含 “wordpress_logged_in_” (not http.cookie contains "wordpress_logged_in_")
:已经登录的用户可以看到最新的页面。Cookie 包含 “comment_author_” (not http.cookie contains "comment_author_")
:已经评论的用户可以立刻看到自己的评论。URI路径 包含以下各项 ".php" ".xml" (not http.request.uri.path in {".php" ".xml"})
:含有php, xml等动态生成页面不该缓存。
记得选择缓存资格为符合缓存条件。
经过设置这两条基本的Cache Rules,你的网站就已经成功设置了缓存,接下来就可以刷新查看缓存是否生效了。
当你第一次访问的时候,你会发现还是挺慢的,因为此时CDN还没有缓存到你的内容(状态为MISS)。
等你加载完毕后,CDN也成功缓存了这个内容。此时重新刷新,就可以发现速度明显变快了,发现标头也显示为命中(HIT)。
配置
我们还可以再Cloudflare Cache – 配置处自定义缓存设置。
首先是清除缓存,当你修改了某一个页面的时候,因为缓存可能不会这么快被用户发现。此时你需要手动清除缓存。建议选择自定义清除,并且给出那个修改的地址即可清除指定的缓存。
接下来的浏览器缓存 TTL是希望在用户浏览器中缓存的时长,建议设置为几个小时,保证用户在一次访问内的速度。
后面的Crawler Hints和Always Online™开不开都无所谓,然后就是开发模式可以用于找到缓存设置的问题,它会禁用缓存规则而不是清除。
你的网站安全吗
我们知道,现在互联网中存在着各种各样的网络犯罪行为,例如DDOS,非法爬取信息等,有些机器人会将整个IP段,或者域名进行攻击,而Cloudflare CDN隐藏了网站真实主机,为网站提供了安全保护。如图是我的博客每日的防火墙拦截记录。
你会发现很多都是自定义规则,因为Cloudflare给的自动防御还是比较宽松的,需要我们根据不同的情况设计不同的WAF(防火墙规则)。
WAF
在CloudFlare – 安全性 – WAF中,可以看到免费版提供了5条免费的自定义WAF规则,我们可以根据不同的需要来添加拦截条件。
就以我的为例,根据网站的日常记录,我设计了4条策略。
首先是境外白名单,这一条主要是防止拦截到我自己调用的一些服务IP,这里我填写了白名单IP作为跳过的对象。
接下来是登录保护,这条是保护我的WordPress博客不被登录爆破。根据我的观察,可能因为之前WordPress的登录bug,有很多的机器人还是会爆破那个文件,故添加了如下规则:
URI 包含以下几项 “/xmlrpc.php” “/login//xmlrpc.php”
:一直爆破这个文件的任何请求全部阻止。URI 包含 "/wp-login.php" AND 国家/地区 不等于 "China"
:阻止非中国境内登录,这个设置因人而异的,不要盲目抄。
然后是垃圾UA规则,很多机器人会非法采集我们的信息,它们的UA一般会有明显的特征,你可以根据你的日记来添加,下面是我设计的垃圾UA规则。
(http.user_agent contains “Palo Alto Networks”) or (http.user_agent contains “Python”) | |
or (http.user_agent contains “python-requests”) or (http.user_agent contains “-bot”) | |
or (http.user_agent contains “Java”) or (http.user_agent contains “zgrab”) | |
or (http.user_agent contains “PetalBot”) or (http.user_agent contains “Go-http-cilent”) | |
or (http.user_agent contains “TurnitinBot”) or (http.user_agent contains “Baiduspider” | |
and not ip.geoip.country in {“CN” “MO” “HK”}) or (http.user_agent contains “NetcraftSurveyAgent”) | |
or (http.user_agent contains “AhrefsBot”) or (http.user_agent contains “HttpClient”) | |
or (http.user_agent contains “DotBot”) or (not cf.client.bot and cf.threat_score gt 50) | |
or (http.user_agent contains “CensysInspect”) or (http.user_agent contains “AhrefsBot”) |
其中,我还设计了威胁指数>50的非Cloudflare标记的自动程序也进行了阻止。因为威胁指数>50已经挺离谱了。Cloudflare标记了一些自动程序,我们可以在安全性 – 自动程序里面开启保护。
最后是检查威胁主机,这里主要处理一些模糊不清的请求。首先是ASN,机器人的主机IP一般来源于那些常见的主机托管商,例如Amazon,Microsoft,Google,Akamai之类的,我这里对这些ASN,以及威胁指数>5的请求,使用托管质询。
就是你常见的Cloudflare验证:
我质询的ASN有:{16509 14618 7224 9059 19047 21664 38895 40045 14061 62567 16276 35540 8560 396982 8075 63949 45102}
但是又不是完全阻止它们访问,毕竟有些人使用的魔法就是来自于这些托管商的。
设计完这些规则后,网站的异常流量减少了不少,网站的安全也得到了保障。
安全性设置
除了WAF外,你还可以在安全性 – 自动程序处开启自动程序攻击模式保护,它能识别并缓解自动化流量,以保护网站免受恶意机器人的危害。
同时在安全性 – DDOS处可以设计一个简单的DDOS攻击防护策略,这个是默认开启的,你也可以自己修改它。
在安全性 – 设置处可以调整当前防御等级,在被攻击的时候可以加大防御力度。同时可以设置质询的有效期,平衡用户体验和安全性。
浏览器完整性检查建议开启,防止有些标头不完整的机器人访问(例如UA为空)。
暂无评论内容