最近搬主题的站点被CC攻击,因为量不大,网站没有受太大影响,但是因为设置了CDN,CC攻击虽然没有造成太大的实际性损害,却因为CDN的设置规则导致流量及请求数飙升,如果设置了动态请求的话,这种被刷请求数也要花钱的。经过搬主题的研究,分享一下WordPress设置CDN被CC攻击设置防火墙封IP防护图文教程。
注意:本教程只适合初学者面对小范围CC攻击或者爬虫攻击,随意乱设置容易导致网站无法访问。
网站被攻击回顾
这里先说一下搬主题站点被攻击的过程。在某天,搬主题发现网站有时候会访问显示502 bad gateway无法访问,以为是并发问题,然后在CDN里面加大了并发,但是偶尔还是出现问题,并且请求数和流量都飙升。虽然流量不算大,请求数也不算太高,但是相比较IP来说,严重不对等,已影响网站运行。这里截取几天的请求数来看。
对于日IP几百的小站来看,每几分钟几千请求,说明有问题。然后再分析一下流量。
每天20-40万的请求,然后流量倒不大,几G而已。流量不影响,因为流量相对来说便宜,重要的是刷请求数,如果设置了CDN的动态加速或者QUIC加速的话,很多都要进行请求数收费。
当然你也可以关闭CDN动态加速或者QUIC加速,这样请求数就不用统计收费了。但是网站速度也会相应的慢下来一截。
鱼和熊掌如何兼得?
这里搬主题就开始寻找防范攻击的办法了。
防御设置分享
针对以上的攻击,实际上对于大型网站,直接可以略过这类攻击,因为这种攻击像是爬虫攻击,每天几十万的请求爬取,又类似CC攻击,正常访问也会受到影响。但是对于搬主题的这类小网站来看,请求数上百万就是几十块,不断被刷去,如何防御和解决呢?
这里搬主题先分享一下当时的网站环境:
- WordPress最新版
- OpenLiteSpeed最新版
- 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的教程。
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容