nginx限制IP恶意调用接口处理办法

今天一大早运营跑来投诉说:“公司昨晚发了20多万条注册短信息,我们没有这么多注册用户啊!”,我查询日志发现,一直有人在恶意调用我们公司的短信接口,造成一直发送注册信息,而且不断变化IP,初次遇到还是有点懵逼的!

调用注册短信接口日志内容:

121.204.87.168 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 200 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.001
222.91.163.130 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 200 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000
124.72.40.148 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 200 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000
112.14.87.203 - - [09/Mar/2018:17:34:13 +0800] "POST /xxx/短信接口 HTTP/1.1" 403 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 

我发现这些IP几乎都是每隔三四秒就调用一次,像这种接口一般注册时,一天最多也就调用三五次;

针对这些问题我想了几个方案,发现一般都是处理时间长,不太适合当前情况紧急处理,根据日志判断对方是直接调用我接口的,处理起来只能封IP,考虑到如果用iptables封IP的话,以后这个IP如果在防火墙不做处理,就会误伤很多正常使用的用户!

处理方案:
1、处理思路:用nginx的黑名单处理,通过shell脚本和cron,每隔五分钟就去统计一下,调用短信接口超过5次的IP,直接扔进黑名单配置文件;

2、处理步骤:
shell统计脚本blackip.sh:

#!/bin/bash
NGINX_DIR=/nginx
BLOCK_IP_FILE=/nginx/conf/vhost/blockip.conf
BLOCKED_IP=/nginx/logs/blocked-ip.txt
NGINX_CMD=/nginx/sbin/nginx
LOG_PATH=/nginx/logs/api.xxx.com_access.log

/bin/cp $BLOCK_IP_FILE $BLOCKED_IP &&
/usr/bin/tail -n 20000 ${LOG_PATH}|grep "xxx/短信接口" | awk ‘{print $1,$7,$9}‘|awk ‘{print $1}‘|sort|uniq -c|sort -rn | awk ‘{if($1>10)print "deny "$2";"}‘ > $BLOCKED_IP &&
/bin/grep -v -f $BLOCK_IP_FILE $BLOCKED_IP >>  $NGINX_CMD  &&
$($NGINX_CMD -s reload)

ps:脚本写的有点LOW。。。

3、计划任务

*/5 * * * * /bin/sh /scripts/blackip.sh >/dev/null 2>&1

4、在http或者server模块引入

include vhost/blacklist.conf ;

重新加载nginx生效!!

查看加入到黑名单配置文件的IP:

略略。。。
deny 117.136.90.104;
deny 223.104.31.205;
deny 117.150.148.213;
deny 36.60.168.148;
deny 183.40.141.112;
......
略略。。。

此时再去nginx的中查看调用接口的情况,超过限定条件被放入黑名单中的IP,在调用短信接口的呃时候返回403了,不在会实际发送短信:

60.180.30.117 - - [09/Mar/2018:17:57:15 +0800] "POST /xxx/短信接口 HTTP/1.1" 403 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000
60.181.109.10 - - [09/Mar/2018:17:57:15 +0800] "POST /xxx/短信接口 HTTP/1.1" 403 162 "http://xxx.com/xxx/短信接口" "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:27.0) Gecko/20100101 Firefox/27.0" "-"- - 0.000 

目前这只能是做为紧急处理方法,更稳妥的办法还是在业务逻辑和安全上去完善!在实际处理的过程当中还是做了很多无用功的,运维路上处处是坑啊,希望这篇文章能够帮到你!

原文地址:http://blog.51cto.com/11019859/2084654

时间: 2024-08-05 20:16:20

nginx限制IP恶意调用接口处理办法的相关文章

获取IP,调用新浪接口获取所在地点的辅助类

1 using System; 2 using System.IO; 3 using System.Net; 4 using System.Text; 5 using System.Web.Script.Serialization; 6 7 namespace IpUtils 8 { 9 public class IpDetail 10 { 11 public String Ret { get; set; } 12 13 public String Start { get; set; } 14

IP地址查询接口及调用方法

1.查询地址 搜狐IP地址查询接口(IP):http://pv.sohu.com/cityjson 1616 IP地址查询接口(IP+地址):http://w.1616.net/chaxun/iptolocal.php 126(地址): http://ip.ws.126.net/ipquery 2.使用 <script src="http://pv.sohu.com/cityjson?ie=utf-8"></script>//ie指定编码,默认是gbk <

spring boot继承web和mybatis时,调用接口删除记录出现的空指针以及解决办法

前两天在学spring boot的时候,出现了一个很奇怪的错误,因为是第一次使用spring boot,所以没想到会遇到这种莫名其妙的bug,即调用接口删除数据库中一条记录的时候,数据库中记录事实上以及被删除了,但是却返回一个null,这就令我百思不得其解了,理论上,删除的话,会返回受影响的记录的条数. 最后排查了一圈,结果却十分令我大跌眼镜,真的很简单!下面写的代码: controller类,这里由于后来数据库sql改了,为了测试like的搜索功能,所以前面的index方法参数并未进行及时修改

API之IP地址查询---权威的IP地址查询接口集合

原文地址:http://yushine.iteye.com/blog/1717586 推荐实用IP138 http://www.baidu.com/s?wd=IP&rsv_spt=1&issp=1&f=8&rsv_bp=0&ie=utf-8&tn=19045005_9_pg&rsv_enter=1&rsv_sug3=2&rsv_sug4=60&rsv_sug1=1&rsv_sug2=0&inputT=520  

记一次使用utl_http方法调用接口,报字符或值错误

背景:ebs系统和其他系统通过utl_http包调用接口,使用log方法记录日志. 某次调用接口,执行到记录日志行报字符或值错误. 查找原因,发现是p_str的长度超过的32747的限制. 解决办法: PROCEDURE log(p_str VARCHAR2) IS BEGIN fnd_file.put_line(fnd_file.log, p_str); dbms_output.put_line(p_str); END; --解决l_messge_clob长度超过3276导致的溢出问题,字符或

Nginx 禁止IP访问

我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了.下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时 候生效最关键的一点是,在server的设置里面添加这一行: listen 80 default; 后面的default参数表示这个是默认虚拟主机. Nginx 禁止IP访问这个设置非常有用. 比如别人通过ip或者未知域名访问你的网站的时候,你希望禁止显示任何有效内容,可以给他返回50

Nginx 禁止IP访问 只允许域名访问

今天要在Nginx上设置禁止通过IP访问服务器,只能通过域名访问,这样做是为了避免别人把未备案的域名解析到自己的服务器IP而导致服务器被断网,从网络上搜到以下解决方案 我们在使用的时候会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了.下面我们就先看看Nginx的默认虚拟主机在用户通过IP访问,或者通过未设置的域名访问(比如有人把他自己的域名指向了你的ip)的时 候生效最关键的一点是,在server的设置里面添加这一行:listen 80 default; 后面的default

如何通过js调用接口

例如一个接口的返回值如下:var returnCitySN = {"cip": "221.192.178.158", "cid": "130100", "cname": "河北省石家庄市"};我们的js可以这么写 document.write('IP地址:' + returnCitySN["cip"] + ', 城市编码:' + returnCitySN["

Nginx禁止IP访问,只允许域名访问

Nginx禁止IP访问,只允许域名访问 我们在使用nginx的过程中会遇到很多的恶意IP攻击,这个时候就要用到Nginx 禁止IP访问了. 1.直接返回403错误 server { listen 80 default_server; server_name _; return 403; } 或者返回500错误 server { listen 80 default_server; server_name _; return 500; } 2.通过301跳转到主页 如果直接显示500或者403页面,