WordPress设置CDN被CC攻击设置防火墙封IP防护图文教程

最近搬主题的站点被CC攻击,因为量不大,网站没有受太大影响,但是因为设置了CDN,CC攻击虽然没有造成太大的实际性损害,却因为CDN的设置规则导致流量及请求数飙升,如果设置了动态请求的话,这种被刷请求数也要花钱的。经过搬主题的研究,分享一下WordPress设置CDN被CC攻击设置防火墙封IP防护图文教程。

注意:本教程只适合初学者面对小范围CC攻击或者爬虫攻击,随意乱设置容易导致网站无法访问。

网站被攻击回顾

这里先说一下搬主题站点被攻击的过程。在某天,搬主题发现网站有时候会访问显示502 bad gateway无法访问,以为是并发问题,然后在CDN里面加大了并发,但是偶尔还是出现问题,并且请求数和流量都飙升。虽然流量不算大,请求数也不算太高,但是相比较IP来说,严重不对等,已影响网站运行。这里截取几天的请求数来看。

对于日IP几百的小站来看,每几分钟几千请求,说明有问题。然后再分析一下流量。

每天20-40万的请求,然后流量倒不大,几G而已。流量不影响,因为流量相对来说便宜,重要的是刷请求数,如果设置了CDN的动态加速或者QUIC加速的话,很多都要进行请求数收费。

当然你也可以关闭CDN动态加速或者QUIC加速,这样请求数就不用统计收费了。但是网站速度也会相应的慢下来一截。

鱼和熊掌如何兼得?

这里搬主题就开始寻找防范攻击的办法了。

防御设置分享

针对以上的攻击,实际上对于大型网站,直接可以略过这类攻击,因为这种攻击像是爬虫攻击,每天几十万的请求爬取,又类似CC攻击,正常访问也会受到影响。但是对于搬主题的这类小网站来看,请求数上百万就是几十块,不断被刷去,如何防御和解决呢?

这里搬主题先分享一下当时的网站环境:

  1. WordPress最新版
  2. OpenLiteSpeed最新版
  3. CDN为百度云CDN

首先分析日志,这里以百度云CDN为例,从请求数入手,先分析请求数的日志。

查看这些天的日志,每天几十万的浏览记录,直接看得头都大。以某个小时的日志为例,将近一万行,这咋分析啊?

这里搬主题首先想到一个办法,就是屏蔽这些IP访问。

用WordPress防火墙插件防范IP访问

这个办法是首先想到的,通过WordPress防火墙插件进行IP的防护设置,将这些攻击IP添加进防火墙插件的IP阻止列表里不就行了?

结果是然并卵。添加了后,虽然相应的IP访问不了,但是只是被WordPress防火墙阻挡在一个默认页面,请求数依然被刷。

从CDN里的访问控制设置防护

既然WordPress网站设置行不通,那就从CDN入手,然后找到百度云CDN的访问控制,里面有个防盗链,有个IP黑名单。

但是有个瓶颈,IP数量只有1000个限制,远远不够。

搬主题又想到,能不能直接封锁User-Agent。毕竟IP多,但是User-Agent会不会重复的比较多。

User-Agent 俗称用户代理

用户代理(User Agent,简称 UA),是一个特殊字符串头,使得服务器能够识别客户使用的操作系统及版本、CPU 类型、浏览器及版本、浏览器渲染引擎、浏览器语言、浏览器插件等。

然后搬主题就从日志中收集了几十个User-Agent,填进去后,过了两个小时,确实是有一定效果。流量小了不少,不过请求数还是居高不下。搬主题又下载日志进行分析,结果发现,虽然对应的User-Agent的IP访问搬主题网站时直接显示403屏蔽无法访问,但是仍然会调用一个请求。

然后搬主题又问了百度那边,百度直接回复,像这种情况仍然要收请求数和流量费用。

通过WordPress源站iptables防火墙防护

经过以上的办法都无法奏效,搬主题火大了,直接在WordPress源站iptables防火墙里进行设置,将源站日志中一些多次出现的IP直接放进去封锁,结果,网站直接不能访问了。

啥情况?

搬主题又将刚才封锁的IP又解锁后,网站又能访问了。难道封锁了CDN的IP地址?这时候搬主题又引申出了新的问题,为什么我已经在CDN里设置了真实IP,我源站日志里还是显示CDN的IP呢?

如上,明明已设置了真实IP,为什么源站日志还显示CDN的IP呢。经过捣鼓,发现还是OpenLiteSpeed设置的问题,这里搬主题已经给出相应的教程了如下:

OpenLiteSpeed网站设置CDN后显示真实访客IP图文教程

通过如上教程设置解决了源站日志显示真实IP的问题。

同时,搬主题发现一个关键问题,就是在网站不能访问的这段时间,CDN的请求数也降下来了。搬主题的理解访问路径应该是这样的:

访客>CDN>源站(正常访问)

如果源站把CDN的IP封了后,那么情况应该如下:

访客>CDN>?(无法访问)

这时候我想到的解决办法了,如果我直接在源站的系统iptables防火墙上将攻击IP一一封锁,是不是能解决攻击的问题了?

接下来就是尝试封IP的过程。然后又延伸到一个新的问题,iptables防火墙只能一个一个封IP,无法批量封IP,如果是国内的BT宝塔面板,估计直接在图形化界面里设置很简单,但是对于搬主题这种站点不喜欢安装这类图形化面板的情况下,只能在iptables防火墙上做文章。

按照iptables防火墙的规则及设置原理,如果要封锁上千个IP,那会严重影响主机的性能。这时候我们需要设置ipset来防护。

ipset介绍

iptables是在Linux内核里配置防火墙规则的用户空间工具,它实际上是netfilter框架的一部分。可能因为iptables是netfilter框架里最常见的部分,所以这个框架通常被称为iptables,iptables是Linux从2.4版本引入的防火墙解决方案。ipset是iptables的扩展,它允许你创建匹配整个地址sets(地址集合) 的规则。而不像普通的iptables链是线性的存储和过滤,ip集合存储在带索引的数据结构中,这种结构即使集合比较大也可以进行高效的查找。除了一些常用的情况,比如阻止一些危险主机访问本机,从而减少系统资源占用或网络拥塞,ipset也具备一些新防火墙设计方法,并简化了配置。官网:http://ipset.netfilter.org/

先说一下ipset的安装

1.ipset安装(centos7.x默认已经安装ipset,无需再进行安装)

yum install ipset

2.创建一个ipset

ipset create xxx hash:ip (hash:ip指的是单个ip,xxx是ipset名称)

ipset默认可以存储65536个元素,使用maxelem指定数量

ipset create blacklist hash:ip maxelem 1000000    #黑名单
ipset create whitelist hash:ip maxelem 1000000    #白名单

查看当前服务器已创建的ipset

ipset list

3.加入一个名单ip

ipset add blacklist 10.20.30.12

4.去除名单ip

ipset del blacklist 10.20.30.12

5.创建防火墙规则

iptables -I INPUT -m set --match-set blacklist src -p tcp -j DROP
iptables -I INPUT -m set --match-set whitelist src -p tcp -j DROP
service iptables save

6.将ipset规则保存到文件

ipset save blacklist -f blacklist.txt
ipset save whitelist -f whitelist.txt

7.删除ipset

ipset destroy blacklist
ipset destroy whitelist

8.导入ipset规则

ipset restore -f blacklist.txt
ipset restore -f whitelist.txt

ipset的一个优势是集合可以动态的修改,即使ipset的iptables规则目前已经启动,新加的入ipset的ip也生效。 

ipset优势:使用 ipset 封大量ip不影响主机性能

Linux使用iptables封IP,是常用的应对网络攻击的方法,但要封禁成千上万个IP,如果添加成千上万条规则,对机器性能影响较大,使用ipset能解决这个问题。iptables 包含几个表,每个表由链组成。默认的是 filter 表,最常用的也是 filter 表,另一个比较常用的是nat表,封IP就是在 filter 表的 INPUT 链添加规则。在进行规则匹配时,是从规则列表中从头到尾一条一条进行匹配。这像是在链表中搜索指定节点费力。ipset 提供了把这个 O(n) 的操作变成 O(1) 的方法:就是把要处理的 IP 放进一个集合,对这个集合设置一条 iptables 规则。像 iptable 一样,IP sets 是 Linux 内核中的东西,ipset 这个命令是对它进行操作的一个工具。

ipset工具也安装了,接下来就是登陆主机的SSH工具,在SSH里不断添加类似这样的命令 ipset add blacklist 10.21.30.13

对于将网站日志里的攻击IP提取出来,可以参考:

1、创建一个集合

ipset create vader hash:ip

这条命令创建了名为 vader 的集合,以 hash 方式存储,存储内容是 IP 地址。

2、添加 iptables 规则

iptables -I INPUT -m set --match-set vader src -j DROP

如果源地址(src)属于 vader 这个集合,就进行 DROP 操作。这条命令中,vader 是作为黑名单的,如果要把某个集合作为白名单,添加一个 ‘!’ 符号就可以。

iptables -I INPUT -m set ! --match-set yoda src -j DROP

到现在虽然创建了集合,添加了过滤规则,但是现在集合还是空的,需要往集合里加内容。

3、找出“坏” IP
找出要封禁的 IP,这是封禁过程中重要的步骤,不过不是这里的重点。简要说明一下两种方法思路。

netstat -ntu | tail -n +3 | awk '{print $5}' | sort | uniq -c | sort -nr

直接通过 netstat 的信息,把与本地相关的各种状态的 IP 都计数,排序列出来。

或者从 nginx 或者其他 web server 的日志里找请求数太多的 IP

awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr

后半部分,排序,去重,再按次数进行逆向排序的操作,跟上面命令是一样的。

找出“坏” IP,往之前创建的集合里添加就可以了。

ipset add vader 4.5.6.7

有多少“坏” IP,就添加多少 IP,因为针对这些封禁的 IP 只需要一条 iptables 规则,而这些 IP 是以 hash 方式存储,所以封禁大量的 IP 也不会影响性能,这也是 ipset 存在的最大目的。

有的人会觉得一条一条添加很麻烦,其实可以批量添加的。比如我有100个IP的话,那么就是有100条这样的命令,如下:

ipset add vader 4.5.6.7
ipset add vader 4.5.6.8
ipset add vader 4.5.6.9
ipset add vader 4.5.6.10
ipset add vader 4.5.6.11
ipset add vader 4.5.6.12
...
ipset add vader 4.5.6.106

以上是举例,如果100条这种命令的话,可以直接复制到SSH工具里,直接粘贴就可以运行了,如果有重复的话会提示无法添加的。

至于如何从日志中快速分析出攻击的IP,并快速生成上面的几百乃至数千条命令,这里搬主题就不多说了,只能说多用平时我们日常电脑上的Excel及文本文档,熟悉里面的一些工具即可。

通过搬主题连续封锁几千个IP后,问题解决。请求数总算降下来了。

这里搬主题再次提醒一下,在IP的封锁上,要去掉百度、bing、谷歌等正常的爬虫IP,还有自己想要排除的IP,否则网站无法被爬取,或者出现各种问题就麻烦了。

最后总结

经过本次的一些设置,确实发现掌握CDN和网站防护的一些知识是很有必要的。当然搬主题也希望如果能直接在CDN处做出设置就好了,不然很多时候都比较麻烦。以上教程不一定适用于各人,而且还是手动的模式,当然自动封锁的方式也有,下次搬主题再分享一下自动封锁IP的教程。

千百度
© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容