越来越多的人使用VPS主机建站,但是与虚拟主机或者管理型的服务器相比,个人VPS主机基本上是无管理型的,即主机商只负责VPS主机的网络畅通,至于技术上的问题都得靠自己来解决。之前用阿里云的VPS主机经常受到CC和DDOS攻击,基本上每次一被攻击就要进入阿里云的“黑洞”。

阿里云对待CC和DDOS的VPS主机一般不能防御太多流量,一旦攻击流量起来了基本上会清空路由,如果被攻击的次数多了话甚至会长达一天或几天的“黑洞”。现在挖站否搬家到了经典CN2 VPS搬工上,之前有收到过热心朋友的提醒,搬工对待CC和DDOS的次数只有3次,超过3次直接封掉VPS。

这次的攻击事件也让我知道了将网站放在经典VPS主机上依然要保持一种小心谨慎的态度。在最开始挖站否无法打开,接着受到不少朋友发来的信息提醒,我马上登录到主机商后台查看,从监控图表中可以看出VPS的CPU占用超过100%,带宽速度已经超过上百MB,显然VPS是被主机商给断网了。

本篇文章就来分享一下使用VPS主机建站的朋友,应对小型的CC和DDOS攻击的基本步骤,基本是围绕防火墙阻止恶意IP来展开的。

VPS主机防攻击应对CC和DDOS的基本思路-防扫描防火墙阻止策略

更多的关于网站建设的网站安全与经验,还有:

  1. 五条关于使用免费VPS控制面板的安全建议-不让黑客有可趁之机
  2. Linux的php-fpm优化心得-php-fpm进程占用内存大和不释放内存问题
  3. DNS域名解析启用DNSSEC防止DNS劫持-Google Cloud DNS设置DNSSEC

PS:2018年3月6日更新,如果想要阻止特定的IP访问网站,可以采用该方法:网站屏蔽和阻止特定地区和国家的IP访问设置方法-PHP代码/Nginx/WordPress设置

PS:2020年3月19日更新,如果你的网站已经被黑了,可以参考如下方法来解决:网站挂木马和服务器被黑排查分析-VPS主机和服务器强化安全方法

一、应对CC和DDOS要提前做好功课

以下两个命令大家可以快速对当前攻击做出判断:输入下面命令后查看单个IP的连接数。

netstat -nat|grep -i '80'|wc -l

对连接的IP按连接数量进行排序,查看TCP连接状态。

netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n

1.1  勤备份-本地与异地备份相结合

网站备份是应对CC和DDOS攻击的万全之策,无论如何攻击,只要数据没有被破坏,我们就可以将损失降低到最少。对于数据更新频繁的建议一天备份一次,有些主机商还会提供快照备份功能,例如阿里云、腾讯云以及之前介绍的Linode快照等。

除了本地备份,自然还是做好异地备份。异地备份可以结合云存储或者云盘来保存数据,之前分享的Linux VPS挂载Google Drive和Dropbox就可以自动将本VPS上的数据同步上传到网盘中,或者使用DigitalOcean Spaces云存储又拍云七牛云存储百度BOS等专业云存储。

1.2  学会查看Linux VPS系统负载

一旦遭受到了CC和DDOS攻击,一般我们都可以通过VPS主机商的控制面板来查看,我们可以看到自己的监控数据有明显的“异常”。下图是我遭受攻击时VPS主机监控显示的IO、CPU、内存等呈现100%占用的情况。(点击放大)

2.2  巧用Fail2ban阻止攻击IP

fail2ban是由Python语言开发监控软件,通过监控系统日志的登录信息来调用iptables屏蔽相应登录IP,以阻止某个IP恶意访问。fail2ban读对应日志文件,Debian/Ubuntu:/var/log/auth.log、CentOS/Redhat:/var/log/secure。安装fail2ban:

apt-get install fail2ban

#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban

安装完成后主要的配置文件在/etc/fail2ban目录下,里面有两个文件和两个目录:

fail2ban.conf :配置文件里面定义了fail2ban记录的日志等级、日志文件的位置以及socket。

jail.conf 里面定义了对那些服务进行监控,以及使用的一些策略。

jail.conf 里面开头是默认全局配置块[DEFAULT],默认配置说明如下:

[DEFAULT]
#忽略哪些IP,可以是具体IP、CIDR类型的地址,多个IP用空格分开
ignoreip = 127.0.0.1

#设置IP被锁住的时间,单位为秒
bantime  = 600

#检测时间,在此时间内超过规定的次数会激活fail2ban
findtime  = 600

#尝试的次数
maxretry = 3

#日志检测机器,有"gamin", "polling" and "auto"三种模式。
backend = polling

#发送报警邮件的地址
destemail = root@localhost #默认的动作执行行为,在action.d目录下有各种行为策略,默认是iptables-#multiport
banaction = iptables-multiport

#0.8.1版本后fail2ban默认用sendmail MTA
mta = sendmail

#默认使用tcp协议
protocol = tcp

#定义了各种行动的参数
#banaction参数在action.d目录下具体定义,name port protocol 也可以自己定义
#只禁止IP
action_ = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
#即禁止IP又发送email
action_mw = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
              %(mta)s-whois[name=%(__name__)s, dest="%(destemail)s", protocol="%(protocol)s]
#禁止IP、发送email、报告有关日志			  
action_mwl = %(banaction)s[name=%(__name__)s, port="%(port)s", protocol="%(protocol)s]
               %(mta)s-whois-lines[name=%(__name__)s, dest="%(destemail)s", logpath=%(logpath)s]

#如果没有定义行为,则默认的行为为action,可选择action_,action_mw, action_mwl 等		
action = %(action_)s

默认配置文件含有此模块
#定义子模块名
[ssh]
#是否激活
enabled = true
#定义port,可以是数字端口号表示,也可以是字符串表示
port= ssh
#过滤规则,在filter.d目录下定义
filter	= sshd
#检测日志的路径
logpath  = /var/log/auth.log
#尝试的次数,覆盖了全局配置的
maxretry = 6
#banaction 在action.d目录下定义,此参数值会替换action中选用的默认行为中定义的banaction参数
banaction = iptables-allports
#注意 port protocol banaction 可以不用分开定义,直接使用action定义也可以,例如:
#action   = iptables[name=SSH, port=ssh, protocol=tcp]
#在子模块中定义的port protocol banaction 都会在action_ action_mw, action_mwl中替换成具体的设置值。

Fail2ban其它的目录功能说明如下:

filter.d 目录里面定义的是根据日志文件进行过滤的规则,主要是利用正则匹配出现错误的关键字。

action.d目录里面是根据过滤的规则对相应的IP采取什么样的行为 。

Fail2ban防CC攻击示例:

#需要先新建一个nginx日志匹配规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
#填写如下内容
[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

继续修改jail.local追加如下内容:

[nginx-cc]
enabled = true
port = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 60
findtime = 60
bantime = 3600
logpath = /data/wwwlogs/wzfou.com_nginx.log

上面的配置意思是如果在60s内,同一IP达到60次请求,则将其IP ban 1小时,记得修改你的网站日志路径。使用以下命令查看fail2ban状态,显示出被禁止IP地址列表。

/usr/local/python/bin/fail2ban-client status ssh-iptables

保存以上代码后,赋予x(执行)权限。要实现该Shell Script在后台类似daemon,就需要使用nohup这个东西了:

nohup 该shell script的位置 >/dev/null 2>&1 &

>/dev/null 2>&1表示把执行该shell script所输出的信息(shell script中的几个echo,调试是时候用的。)重定向至/dev/null里面。 最后面的&代表后台执行。这样的话,即使注销了登录,该Shell Script也一样会在后台执行。

三、总结

以上两个实时检测网站日志并自动将异常IP加入到iptables中屏蔽的脚本我之前用过,效果很不错,足以应付小型的CC攻击。目前使用Fail2ban用于检测网站日志并屏蔽恶意IP。三个脚本各有各的优势,大家可以根据自己的需要来选择。

但是如果遇到较大的DDOS攻击还是得借用专门的防攻击服务,例如Cloudflare防攻击服务就非常地有效果,基本上搞VPS这一行的都用到它。如果你的网站一直被攻击得无法访问,可以升级Cloudflare到付费版,这样防护效果会更好。