服务器遭受到攻击,直接显示出运维的能力不行。我对此非常的自责,但是通过这次让我知道了运维的重要性,和重要职责!
服务器遭受攻击导致无法打开网址
服务器遭受攻击导致无法打开网址
2016年9月6日
今天我们公司发生了一个故障,首先是网站的带宽跑满,其次是CPU一直上不去。因为我们公司的服务器架构只有简单的1个nginx负载和2台web。Web上面是2台有几个tomcat项目包
首先我们先查看阿里云监控的流量图,我们可以看到正常流量。然后突然流量大增
这里CPU使用率一直特别高,所以我使用了top命令来查看进程,发现不是这里的问题。
但是,看到web上面的tomcat项目并没有占用多少资源。开始进行日志查看
首先我查看的是系统错误日志
发现好像是洪水攻击,当时就有点不冷静了。因为服务器已经影响到业务。导致无法SSH连接进行管理,当时就设置了tcp的连接数,发现设置完成之后好了。但是几分钟之后还是出现问题。
当时把所有的服务器全停了,然后等了半个小时,在次开启,发现一开起几分钟就会出现这种问题。
后来发现一停掉,负载就下去。最后通过nginx负载均衡发现问题
---
在这期间,我查看了阿里云监控的态势感知
发现公司的服务器一直被攻击,当时项目整个的方案已经写好,还没实施就发生了这个问题。顿时感到心里有阴影!
当时有人让我查看一下web访问日志,终于发现了问题!
[root@vm-69-6cc2 logs]# grep 07/Sep/2016 mallView_access.log |awk '{a[$1]++}END{for(i in a)print i,a[i]}' 114.111.167.89 60 111.205.180.168 60 60.205.125.164 407876
有一个IP跟我们一直建立连接!
温馨提示:有的时候光查看web访问日志是不行的。因为我们公司的人员都访问我们自己的网站,此时Web访问日志会有很多。所以我们还要查看连接数
netstat -an|grep "ESTABLISHED"|awk -F "[ :]+" '{print $6}'|sort|uniq -c|sort -rn -k1
如下图
果断设置防火墙拒绝这个IP地址
从新启动发现负载正常。
因为当时显示带宽用的特别多,出口带宽。我就是用了nethogs工具查看内部带宽情况
提示:如果有使用阿里云服务器的同学,请务必要购买云盾和CDN等相关缓存业务。否则吃亏的是自己!
防范DDOS攻击脚本
#防止SYN攻击 轻量级预防
iptables -N syn-flood iptables -A INPUT -p tcp --syn -j syn-flood iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN iptables -A syn-flood -j REJECT
#防止DOS太多连接进来,可以允许外网网卡每个IP最多15个初始连接,超过的丢弃
iptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
#用Iptables抵御DDOS (参数与上相同)
iptables -A INPUT -p tcp --syn -m limit --limit 12/s --limit-burst 24 -j ACCEPT iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
##########################################################
防范CC攻击
当apache站点受到严重的cc攻击,我们可以用iptables来防止web服务器被CC攻击,实现自动屏蔽IP的功能。
1.系统要求
(1)LINUX 内核版本:2.6.9-42ELsmp或2.6.9-55ELsmp(其它内核版本需要重新编译内核,比较麻烦,但是也是可以实现的)。
(2)iptables版本:1.3.7
2. 安装
安装iptables1.3.7和系统内核版本对应的内核模块kernel-smp-modules-connlimit
3. 配置相应的iptables规则
示例如下:
(1)控制单个IP的最大并发连接数
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j REJECT #允许单个IP的最大连接数为 30
#默认iptables模块不包含connlimit,需要自己单独编译加载,请参考该地址
http://sookk8.blog.51cto.com/455855/280372不编译内核加载connlimit模块
(2)控制单个IP在一定的时间(比如60秒)内允许新建立的连接数
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 30 -j REJECT iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
#单个IP在60秒内只允许最多新建30个连接
4. 验证
(1)工具:flood_connect.c(用来模拟攻击)
(2)查看效果:
使用
watch 'netstat -an | grep:21 | grep<模拟攻击客户机的IP>| wc -l'
实时查看模拟攻击客户机建立起来的连接数,使用watch 'iptables -L -n -v | grep<模拟攻击客户机的IP>'
查看模拟攻击客户机被 DROP 的数据包数。
5.注意
为了增强iptables防止CC攻击的能力,最好调整一下ipt_recent的参数如下:
#cat/etc/modprobe.conf options ipt_recent ip_list_tot=1000 ip_pkt_list_tot=60 #记录1000个IP地址,每个地址记录60个数据包 #modprobe ipt_recent
本段转载:http://sookk8.blog.51cto.com/455855/321242/
我自己写的脚本,本脚本是参考刘沈晨的防DDOS攻击,进行改写,写入定时任务即可!
[root@vm-69-6cc2 ~]# cat /server/scripts/iptables.sh #!/bin/sh IP_filter_command="iptables -I INPUT -j DROP -s" IP_recover_command="iptables -D INPUT -j DROP -s" IP(){ netstat -an|grep "ESTABLISHED"|awk -F "[ |:]+" '{print $6}'|sort |uniq -c|sort -rn -k1 > /server/scripts/ip.txt } a(){ exec < /server/scripts/ip.txt while read line do IP_count=`echo $line|awk '{print $1}'` IP=`echo $line|awk '{print $2}'` IP_fil=`iptables -L -n|grep "b${IP}b"|wc -l` if [ ${IP_count} -gt 50 -a ${IP_fil} -eq 0 ];then ${IP_filter_command} ${IP} echo "${IP}" >> /server/scripts/ip_filtered.txt action "Filter ${IP}" /bin/true fi done } IP a
总结:按照今天的错误发现了很多问题,首先我们公司没有监控。导致只有网站宕机了才会进行报警。其次最重要的一点,出了问题看日志!
2016年9月6日23:51:20
特么的,就在刚刚准备睡觉的时候。突然有人进行攻击!
果断封IP脚本!
最后查看了攻击的IP地址
按照分析可能是爬虫IP. 果断要买阿里云的安骑士,否则基础访问都做不了!
相关文章:
- 服务器安全之iptables
- Shell 变量及函数讲解 [2]
- 老男孩Shell企业面试题30道 [答案]
- Shell 基础介绍 [1]