利用Nignx巧妙解决我所遇到的DDOS攻击

1. 问题

自家的APP上线已经有一段时间了,突然有一天发现线上产品居然不能发送验证码。

登录第三方短信验证码服务后台,发现问题很严重。


3 youbiquan 15797 2015-12-25
4 youbiquan 57 2015-12-23
5 youbiquan 49 2015-12-22
6 youbiquan 54 2015-12-21
7 youbiquan 64 2015-12-20

发现几天前,短信服务居然发出去15000多条短信出去,直接把服务费刷光了。

要找原因就只能找 Nignx 的日志了。

日志中,发现大量的对短信接口的访问,并且在我查看时候,日志依然在疯狂的追加,是典型的ddos攻击了。当然最核心的内容还是对短信接口的疯狂访问量

221.178.182.21 - - [05/Jan/2016:16:19:25 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.3; XM50h Build/19.1.1.C.1.2)" "-"
171.82.225.66 - - [05/Jan/2016:16:19:32 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.4; 2014812 MIUI/V6.6.3.0.KHJCNCF)" "-"
171.82.225.66 - - [05/Jan/2016:16:19:32 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.4.4; 2014812 MIUI/V6.6.3.0.KHJCNCF)" "-"
110.89.16.13 - - [05/Jan/2016:16:19:49 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-"
110.89.16.13 - - [05/Jan/2016:16:19:49 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-"
118.114.160.200 - - [05/Jan/2016:16:21:26 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-"
118.114.160.200 - - [05/Jan/2016:16:21:39 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-"
119.122.0.136 - - [05/Jan/2016:16:21:41 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-"
118.114.160.200 - - [05/Jan/2016:16:21:51 +0800] "POST /myinterface?showType=smsAuthcode HTTP/1.1" 200 161 "-" "Mozilla/5.0" "-"


甚至在很多访问量过大时候,都会觉得服务器不能正常提供服务,处于崩溃的边缘。


2. 临时方案

在搞清楚问题之前,首先想到的是,先把短信服务停掉,让攻击者不能访问服务,但是又不能将服务器关掉,毕竟线上用户还在使用。

所以先用nginx把这个接口rewrite了。

if ( $request_uri ~* "showType=smsAuthcode" )
{  
    rewrite ^/ http://www.baidu.com/;
}

当然配置方法可能有好多,这里只是提供一个解决问题的思路,具体配置还可以参考更专业的nginx配置的资料。

首先给百度抱歉,把攻击请求转发给百度了。其实随便return一个值就好了,例如200. 


3. 基于log分析的方案

当然问题这样,并不能算解决,线上用户也不能注册新用户了。

我首先想到的方案还是对IP访问限制,分析了一下log,有的ip攻击次数到达几千次,当然也有的ip只有几次访问。对于访问几次的ip,其实没有办法确定是真用户还是攻击机器的IP。 在网上找了一个可以让某个接口,在一定时间内,限制ip访问次数的方案。

iptables -A INPUT -p tcp --dport 80 -d xx.xx.xx.xx -m string --string "/myinterface?showType=smsAuthcode" --algo kmp -m recent --name httpuser --set
iptables -A INPUT -m recent --update --name httpuser --seconds 86400 --hitcount 4 -j LOG --log-level 5 --log-prefix 'HTTP attack: '
iptables -A INPUT -m string --string "/myinterface?showType=smsAuthcode" --algo kmp -m recent --update --name httpuser --seconds 86400 --hitcount 10 -j REJECT                

基本的含义,就是对访问的请求进行字符串匹配,如果发现有对短信接口的访问,就使用recent模块记录下来访问,如果在一天中访问超过4次,就不让再访问短信接口。 

其实也是有一定效果的方案


序号 账号 数量(条) 日期
       
2 youbiquan 540 2016-01-08
3 youbiquan 2857 2016-01-04
4 youbiquan 388 2016-01-05
5 youbiquan 2469 2016-01-06

虽然采用基于ip地址的防范,有点效果,但是依然没有根本防住的,我们平时一天也就发50条左右,IP防火墙设置后,依然每天有几千条。分析后发现,这个攻击使用的IP地址是在太多了,所以感觉用IP地址防根本没有希望。


某一天,一筹莫展的时候,我又打开nginx访问日志,突然发现攻击的行为的 user-agent都好短,和其他访问的user-agent有明显差别。

似乎攻击者的user-agen都是“Mozila/5.0“,然后就没有了,而其他的访问,会有更多信息,包括系统版本,浏览器等。

按照这样的猜想,我去用程序分析user-agent,果然只有访问短信接口的UA中存在很短的 “Mozila/5.0“, 其他访问不存在这个UA,但是还有一些不短的UA

Dalvik/1.6.0 (Linux; U; Android 4.2.2; R827T Build/JDQ39)" "-"
于是就搜了一下,发现Dalvik是一个Android虚拟机,瞬间觉得明朗了,感觉完全可以基于UA防范,把Mozila/5.0和虚拟机全拦截住,问题不就解决了么。


于是在nginx的配置里,加了下面几段代码

if ($http_user_agent = "Mozilla/5.0") {
       return 503;
}

if ($http_user_agent ~* "Dalvik/1.6.0") {
       return 503;
}

第一段就是严格匹配 Mozila/5.0 第二段的意思以 Dalvik开头的UA,就是虚拟机的UA。


果然在采用这个方式防范以后,瞬间有了明显效果。

2 youbiquan 57 2016-01-09

按照新方法,从新防范后,短信发送的条数,直接回到之前的正常水平,自己用了几个手机测试了一下,也是OK的。


不过也不能高兴的太早,似乎攻击者也很容易伪造UA,想要完全解决DDOS,还要更多学习科学文化知识才行~

原文链接 http://sunrising.me/?p=67


nginx可以通过以下方式来防范DDoS攻击: 1. 使用nginx的http_limit_conn模块来限制单个IP的连接数。这个模块可以设置每个IP允许的最大连接数,超过限制的连接将被拒绝。这样可以有效地防止CC攻击。配置方法如下[^1]: ```nginx http { limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m; server { location / { limit_conn conn_limit_per_ip 10; # 其他配置项 } } } ``` 2. 使用nginx的http_limit_req模块来限制单个IP每秒的请求数。这个模块可以设置每个IP允许的最大请求数,超过限制的请求将被拒绝。这样可以有效地防止请求过载攻击。配置方法如下: ```nginx http { limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s; server { location / { limit_req zone=req_limit_per_ip burst=20 nodelay; # 其他配置项 } } } ``` 3. 使用fail2ban来分析nginx的日志,并根据规则判断是否使用iptables拦截攻击者的IP。fail2ban可以根据日志中的异常行为(如频繁访问、错误请求等)来判断是否有DDoS攻击,并自动屏蔽攻击者的IP。配置方法如下: - 安装fail2ban:`sudo apt-get install fail2ban` - 配置fail2ban:编辑`/etc/fail2ban/jail.local`文件,添加以下内容: ```shell [nginx-ddos] enabled = true filter = nginx-ddos action = iptables[name=nginx-ddos, port=http, protocol=tcp] logpath = /var/log/nginx/access.log maxretry = 100 findtime = 60 bantime = 600 ``` - 创建fail2ban的过滤规则:创建`/etc/fail2ban/filter.d/nginx-ddos.conf`文件,添加以下内容: ```shell [Definition] failregex = ^<HOST> .* "GET /.*" ignoreregex = ``` - 重启fail2ban服务:`sudo service fail2ban restart` 4. 使用DDoS Deflate来通过netstat判断IP连接数,并使用iptables屏蔽攻击者的IP。DDoS Deflate是一个脚本工具,可以根据连接数来判断是否有DDoS攻击,并自动屏蔽攻击者的IP。配置方法如下: - 下载DDoS Deflate脚本:`wget https://github.com/jgmdev/ddos-deflate/archive/master.zip` - 解压脚本:`unzip master.zip` - 进入解压后的目录:`cd ddos-deflate-master` - 安装脚本:`./install.sh` - 启动脚本:`./ddos-deflate.sh` 这些方法可以帮助nginx有效地防范DDoS攻击
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值