今天,我们的一台服务器出了问题: 被若干IP地址访问某个接口,该接口会发送短信。

所以,我们可以做两件事: 1. nginx的层面封IP 。  2  linux server的层面封IP

先看nginx : 非常简单,  加上  deny xxx.x.x.x; 就可以了。

linux的层面:  iptables -I INPUT -s 110.7.48.47 -j DROP

就可以把某个IP封掉。

目测,后者更方便一些。

在nginx 层面的封禁, req还是会打进来, 让nginx 返回 403,  占用资源。

还可以把以上步骤做成自动化的脚本,

参考: http://www.cnblogs.com/huligong1234/p/7189426.html

下面是如何做成自动化的封禁IP

直接一步到位:

1. 修改crontab :    $ crontab -e

*/ * * * * sh /opt/check_black_ip.sh

2. 增加这个文件:

tail -n10000 /usr/local/nginx/logs/access.log | awk '{print $1,$7}' | grep send_login_token | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if($1>30)print "deny "$2";"}' > /usr/local/nginx/conf/blacklist.append.conf
/usr/local/nginx/sbin/nginx -s reload

3. 确保你的nginx配置如下:

http{
# ....
include blacklist.conf;
}

下面是具体的原理和过程:

1. 确定好nginx的日志文件的位置,  例如:   /usr/local/nginx/logs/access.log  ( 如果你用了logrotate, 那么这个文件可能是每天更新一次 )

2. 使用命令:

$ tail -n50000 /usr/local/nginx/logs/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | | awk '{if($1>100)print "deny "$2";"}'

第一部分:  awk '{print $1}'  只打印出 所有log的ip (第一个被空格截断的内容)

sort 是排序(按照字母顺序)

uniq -c 是对所有内容进行去重,并且计数

sort -rn 是反向排序。 根据计数的结果。

所以,上面的命令,会给出如下结果:

 182.84.132.13
117.82.174.128
182.150.146.215
182.148.58.231
116.7.219.28
182.150.28.110
36.7.122.26

最后一部分的:  awk '{if($1>100) .... }'是一个bash脚本,会找到所有出现过100次的ip, 然后输出一段deny这样的文本:

deny 182.84.132.13;
deny 117.82.174.128;
deny 182.150.146.215;
deny 182.148.58.231;
deny 116.7.219.28;
deny 182.150.28.110;
deny 36.7.122.26;
deny 110.7.48.47;
deny 124.127.182.6;
deny 110.188.153.219;

最后的最后,把上数的结果, 使用 ">" (覆盖文件)  或者 ">>" (追加文件) 操作符到blacklist.conf文件中。 完整命令为:

$ tail -n50000 /usr/local/nginx/logs/access.log | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if($1>100)print "deny "$2";"}' >> /usr/local/nginx/conf/blacklist.conf

nginx中的配置如下:

http{
# ....
include blacklist.conf;
}

进一步的,我们可以只针对某个url的访问进行统计, 代码如下:

$ tail -n10000 /usr/local/nginx/logs/access.log | awk '{print $1,$7}' | grep send_login_token | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if($1>30)print "deny "$2";"}' >> /usr/local/nginx/conf/blacklist.conf

上面代码,会查看过去10000行nginx记录,找到对于访问 "/interface/..../send_login_token " 的request, 进行ip的计数,对于超过30次访问的,直接封ip

根据当前时刻的ip访问, 自动封禁ip 的脚本.

列出当前时刻, 所有的请求数大于10的ip地址: netstat -an | grep ^tcp.*:80 | egrep -v 'LISTEN|127.0.0.1' | awk -F"[ ]+|[:]" '{print $6}' | sort | uniq -c |sort -rn | awk '{ if ($1>10){print $2}}'

解释:

1. netstat -an -a 表示列出所有, -n 表示列出来的都是 数字(例如 3.3.3.4 , 而不是名称) 例如:

# netstat -an
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 127.0.0.1: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 172.18.230.209: 118.112.56.229: TIME_WAIT
tcp 172.18.230.209: 218.5.173.146: ESTABLISHED
tcp 172.18.230.209: 182.84.139.53: ESTABLISHED
tcp 172.18.230.209: 218.5.173.146: ESTABLISHED
tcp 172.18.230.209: 140.205.140.205: CLOSE_WAIT

2. $ netstat -an |grep ^tcp.*:80 是对当前的链接中,找到所有的要访问80端口的请求. 例如:

# netstat -an | grep ^tcp.*:
tcp 0.0.0.0: 0.0.0.0:* LISTEN
tcp 172.18.230.209: 118.112.56.229: TIME_WAIT
tcp 172.18.230.209: 118.112.56.229: ESTABLISHED
tcp 172.18.230.209: 140.205.140.205: CLOSE_WAIT
tcp 172.18.230.209: 182.84.139.53: TIME_WAIT
tcp 172.18.230.209: 180.108.11.25: TIME_WAIT

3. $ netstat -an |grep ^tcp.*:80 | egrep -v 'LISTEN|127.0.0.1' , 这句话是对 "127.0.0.1' 或者 LISTEN 做个排除. 去掉本地的请求, 去掉 正在 LISTEN的接口

4. awk -F"[ ]+|[:]" '{print $6}' 这里是对结果做个处理, 把某一行的结果, 按照 空格或者 ':' 冒号来分割,取得第六个.(起始的是第一个), 例如:

tcp               172.18.230.209:       118.112.56.229:     TIME_WAIT

按照空格或者: 来分割的话,第六个就是 118.112.56.229, 这个就是正在请求的IP

5. sort: 按照字母顺序排序. uniq -c 表示 去重,并且加上 出现的次数. sort -r 表示 翻转排序. -n 表示按照数字的大小排序.

6. awk '{if ($1>$num){print $2}} 处理结果, 找到满足条件的, 然后打印出来.

完整版, 根据每秒ip的访问上线,来自动封禁的脚本 :

#!/bin/bash
num= # 每秒某个ip的访问上限
list=`netstat -an |grep ^tcp.*:|egrep -v 'LISTEN|127.0.0.1'|awk -F"[ ]+|[:]" '{print $6}'|sort|uniq -c|sort -rn|awk '{if ($1>$num){print $2}}'`
for i in $list
do
iptables -I INPUT -s $i --dport -j DROP
done

解封IP的方法

先用这个命令看到所有被封禁的IP $ iptables -L -n -v --line-numbers

iptables -L -n -v --line-numbers
Chain INPUT (policy ACCEPT packets, bytes)
num pkts bytes target prot opt in out source destination
DROP all -- * * 45.77.183.135 0.0.0.0/
DROP all -- * * 120.239.199.152 0.0.0.0/
DROP all -- * * 47.52.132.105 0.0.0.0/

然后用这个命令恢复:  iptables -D INPUT ( 例如:iptables -D INPUT 1 就是删掉上面的第一条 45.77.183.135 )

转自

linux , nginx: 封禁IP的办法 (自动化脚本封ip, 根据瞬时的请求总量,或者根据日志 - 为程序员服务 http://ju.outofmemory.cn/entry/343736

linux , nginx: 封禁IP的办法【转】的更多相关文章

  1. linux 封禁ip

    可以直接服务配置nginx.conf 添加 deny+IP 例如: 封禁单个IP deny 106.5.76.83; #封整个段即从123.0.0.1到123.255.255.254的命令deny 1 ...

  2. openresty开发系列38--通过Lua+Redis 实现动态封禁IP

    openresty开发系列38--通过Lua+Redis 实现动态封禁IP 一)需求背景为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝 ...

  3. Nginx 通过 Lua + Redis 实现动态封禁 IP

    一.背景 为了封禁某些爬虫或者恶意用户对服务器的请求,我们需要建立一个动态的 IP 黑名单.对于黑名单之内的 IP ,拒绝提供服务. 二.架构 实现 IP 黑名单的功能有很多途径: 1.在操作系统层面 ...

  4. 【Nginx】如何封禁IP和IP段?看完这篇我会了!!

    写在前面 Nginx不仅仅只是一款反向代理和负载均衡服务器,它还能提供很多强大的功能,例如:限流.缓存.黑白名单和灰度发布等等.在之前的文章中,我们已经介绍了Nginx提供的这些功能.小伙伴们可以到[ ...

  5. nginx 查看访问 IP 并封禁 IP 详解

    1.查找服务器所有访问者ip方法: awk '{print $1}' nginx_access.log |sort |uniq -c|sort -n nginx.access.log 为nginx访问 ...

  6. Shell—实现DDOS攻击自动封禁IP

    需求:请根据web日志或者或者网络连接数,监控当某个IP并发连接数或者短时内PV达到100,即调用防火墙命令封掉对应的IP. 防火墙命令为:iptables-I INPUT -s IP地址 -j DR ...

  7. linux nginx大量TIME_WAIT的解决办法--转

    netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' TIME_WAIT 8535 CLOSE_WAIT 5 FIN ...

  8. [转载]实现DDOS攻击自动封禁IP

    1 #!/bin/bash 2 ############################################################# 3 # File Name: ddos_ch ...

  9. 使用haproxy的ACL封禁IP

    http://www.360doc.com/content/11/1226/13/834950_175075893.shtml 该方法,用户访问得到的是403页面 或者尝试用http-request拒 ...

随机推荐

  1. Java 之 ArrayList 集合

    一.ArrayList 概述 java.util.ArrayList  是 大小可变的数组 的实现,存储在内的数据称为元素.该类是一个 集合类(容器),可以让我们更便捷的存储和操作对象数据. 该类可以 ...

  2. MES应用案例|新宏泰电器乘上智能制造的东风

    企业背景: 无锡新宏泰电器科技股份有限公司(下文简称:新宏泰电器)创立于1984年,公司主要生产断路器.微型电机.BMC/SMC材料.BMC/SMC模压制品及各类塑料模具的设计制造.已于2016年在沪 ...

  3. jQuery(function(){})和$(function(){ }) 和 $(document).ready(function(){ })关系

    转自:https://www.jianshu.com/p/3b0fe5d07996 $(function(){ })和jQuery(function(){ })都是 $(document).ready ...

  4. 解决pip安装时速度慢的问题

      http://blog.csdn.net/wukai0909/article/details/62427437 国内源: 新版ubuntu要求使用https源,要注意. 清华:https://py ...

  5. day 39

    ORM 对象关系映射 表 ---> 类 字段 ---> 属性 记录 ---> 对象 优点: ​ 使用者无需关心具体的SQL命令如何编写. ​ 直接通过调用方法,来执行相对应的SQL命 ...

  6. ML- 核函数(Kernel) 的 SVM

    Why 核函数 目的是为了解决线性不可分问题. 核心思想是升维. 当样本点在低维空间不能很好地分开的时候, 可以考虑将样本通过某种映射(就是左乘一个矩阵) 到高维空间中, 然后在高维空间就容易求解一个 ...

  7. 分页查询——Hibernate Criteria实现一次查询取得总记录数和分页后结果集

    使用Hibernate criteria进行分页查询时,如何实现一次查询取得总记录数和分页后结果集 - bto310 - ITeye博客 https://bto310.iteye.com/blog/1 ...

  8. Python:基础复习

    一.数据类型 对象的三大特征:值.身份.类型: 1)数字 Number 整型.浮点型 只有 int 和 float 两种类型: type(2/2):float 类型:2/2 == 1.0: type( ...

  9. Linux下关于Qt无法调用fcitx的中文输入

    1 本机环境: deepin 15.11 Qt 5.11.3 fcitx 输入法 2 问题描述 Qt Creator 和使用 QT 编译的程序运行时均不能使用deepin系统自带的fcitx输入法,且 ...

  10. Pat 1003 甲级

    #include <cstdlib> #include <cstring> #include <iostream> #include <cstdio> ...