前一篇文章《CloudFlare 入门教程,海外网站接入 CloudFlare CDN 全流程说明》中介绍了 CloudFlare 作为免费网站 CDN 最基本的用法。
这篇文章主要介绍下 CF 的常用功能和配置,包括配置 WAF、防 DDOS 开启 5 秒盾、人机验证、流量分流、防止源 IP 泄露等。
CloudFlare 教程一:《CloudFlare 入门教程,海外网站接入 CloudFlare CDN 全流程说明》
CloudFlare 教程二:《cloudflare 常用功能介绍,包括 WAF 配置,5 秒盾,人机认证,防源 IP 泄露等 》
CloudFlare 教程三:《cloudflare CDN 配置自选/优选 IP 全流程记录》
配置 WAF
WAF 就是 Web Application Firewall 网站防火墙,简称: WAF,主要用来拦截异常/恶意请求。CF 的 WAF 配置很灵活,可以配置匹配到什么样的异常请求后,做出相应的拦截行为。还可以控制请求频率,配置某个页面在某个时间段内只允许请求多少次。都是很实用的功能。
防 DDOS 攻击,开启CF 5 秒盾
目前为止,普遍认为 cf 5 秒盾是最有效防御 DDOS 攻击最有效的方式之一。 套上 cf cdn 后开启 5 秒盾也很简单。Cf 右侧有个 Under Attack 模式,点击开启就行了,大概 30s 左右就会生效。另外,开启 5 秒盾后,用户首次访问有盾,后面继续访问就没有盾了。
cf 人机验证(trunstile)
目前网站的校验是不是真人一般都是采用图片验证码、滑动验证等。Cf 也提供了接入人机验证功能。
好处:
1、可以隐式验证,即不需要用户交互来验证是真人,用户无感知。
2、突破难度比一般图片验证码更难
缺点:
1、需要开发,虽然开发量不大,但总归是需要摸索
2、需要对接 cf 的接口,一个是担心 cf 的稳定性,一个是耦合度有点高。
国内流量走国内 CDN、海外流量走 CF 配置
参考:https://blog.lincloud.pro/archives/26.html
比如域名在阿里云。
在阿里云上解析一条 NS 记录,海外的流量走 cf 的解析,然后 cf 再配置域名 ip 解析
再在阿里云上解析一条 CNAME 记录,国内流量走国内 cdn 给的域名。
防止源 IP 泄露
如果你用 cloudflare 做 DDOS 防御,那么需要注意防止自己网站的源 IP 泄露,否则别人直接攻击你的源 IP,那 CF 就白套了。下面这种方法就算是你的源 IP 泄露了,也可以防止被 DDOS,就是设置源服务器仅允许cf 回源 ip访问。
我是通过 centos7 firewall 来配置服务器仅允许 cf 回源 IP 访问的。
cf 的回源 IP 列表:https://www.cloudflare.com/ips-v4
先简单介绍下 firewall 的防火墙规则。firewall 里面有 9 大区域(zone),包括 public、drop、trusted 等,每个 zone 都是一系列规则的集合。区域分为默认区域和激活区域,个人认为,一个请求进来先走激活区域里面的规则,如果匹配不到就走默认区域里面的规则。通过以下命令查看当前的默认区域和激活区域。
firewall-cmd –get-default-zone
firewall-cmd –get-active-zone
一般情况下,默认规则和激活规则都是 public。
这次的仅开放 cf 回源 ip 配置:
就是把激活区域设为 trusted,并配置 cf 的 ip 及个人自己的 ip,然后把默认区域设为 drop。
firewall-cmd –permanent –zone=trusted –add-source=173.245.48.0/20
firewall-cmd –permanent –zone=trusted –add-source=103.21.244.0/22
firewall-cmd –permanent –zone=trusted –add-source=103.22.200.0/22
firewall-cmd –permanent –zone=trusted –add-source=103.31.4.0/22
firewall-cmd –permanent –zone=trusted –add-source=141.101.64.0/18
firewall-cmd –permanent –zone=trusted –add-source=108.162.192.0/18
firewall-cmd –permanent –zone=trusted –add-source=190.93.240.0/20
firewall-cmd –permanent –zone=trusted –add-source=188.114.96.0/20
firewall-cmd –permanent –zone=trusted –add-source=197.234.240.0/22
firewall-cmd –permanent –zone=trusted –add-source=198.41.128.0/17
firewall-cmd –permanent –zone=trusted –add-source=162.158.0.0/15
firewall-cmd –permanent –zone=trusted –add-source=104.16.0.0/13
firewall-cmd –permanent –zone=trusted –add-source=104.24.0.0/14
firewall-cmd –permanent –zone=trusted –add-source=172.64.0.0/13
firewall-cmd –permanent –zone=trusted –add-source=131.0.72.0/22
//个人 ip
firewall-cmd –permanent –zone=trusted –add-source=xx.xx.xx.xx
//本地 ip
firewall-cmd –permanent –zone=trusted –add-source=xx.xx.xx.xx
firewall-cmd –list-all-zones
可以看到 trusted 成为了激活区域
因为此时已经设置了 trusted 区域,所以还需要切换默认区域从 public 到 drop,以达到拒绝除 cf 回源 ip 和个人 ip 以外的所有接入连接的目的。使用命令如下:
firewall-cmd –set-default-zone=drop
再将默认网卡 eth0 分配给 drop 区域,使用命令如下://好像不执行也可以
firewall-cmd –permanent –zone=drop –change-interface=eth0
使白名单最终生效,使用命令如下(注意:请再次确认你的所有 IP 都加入了 trusted 区域):
firewall-cmd –reload
结论:
经验证,以上 cf ip 和个人 ip 都可以访问源 ip,但是无法用其他 ip 直接 ssh 和访问 ip 的网页。
如果恢复的话,把默认区域和激活区域都设为 public 即可。
firewall-cmd –set-default-zone=public
firewall-cmd –permanent –zone=public –change-interface=eth0
参考:https://cloud.tencent.com/developer/article/1038163
https://blog.51cto.com/u_10690709/2115113
附启用禁用、开机启用禁用 firewalld 的命令
systemctl start firewalld
systemctl stop firewalld
systemctl enable firewalld
systemctl disable firewalld
注:慎用,因为设置源服务器仅允许 cf 回源 ip 和个人 ip 访问后,运维起来很麻烦。而且后面使用优选 ip 后,用该配置会有点问题,好像是没有加入 cf ipv6 的回源 ip 导致的。后来我采用的方案是换源 ip。一般主机商都会支持换 ip 的,换了源 ip 后,别人想找到你的源 ip 是很困难的。
其他问题
1、上 cf 后,还能统计到用户 ip 吗
我自己的网站是可以统计到 ip 的,但是有些 ip 是 v6 的,需要扩充一下 ip 的字段长度。
2、泛播 IP
即多个服务器对应同一个 IP,先不管是怎么实现的,反正就是这样。
CF 有很多回源 ip,每个 IP 又对应多个服务器,所以访问 cf 的 cdn 时,它有能力给你选择距离你最近的服务器返回数据