V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
NGINX
NGINX Trac
3rd Party Modules
Security Advisories
CHANGES
OpenResty
ngx_lua
Tengine
在线学习资源
NGINX 开发从入门到精通
NGINX Modules
ngx_echo
liuliliuli2017
V2EX  ›  NGINX

Nginx 封锁恶意 IP,并且定时取消的两种脚本

  •  1
     
  •   liuliliuli2017 · 2017-04-14 00:20:05 +08:00 · 8469 次点击
    这是一个创建于 2774 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有时候博客会有莫名其妙的人进来,腾云阁看到这个解决方法待试试

    收录待用,修改转载已取得腾讯云授权


    代码节选:

    使用 nginx 封锁

    ...

    -封锁 IP

    #!/bin/bash
    max=500    #我们设定的最大值,当访问量大于这个值得时候,封锁
    confdir=/usr/local/data/nginx/conf/blockip.conf #nginx 封锁配置文件路径
    logdir=/usr/local/data/nginx/logs/access_huke88.log  #nginx 访问日志文件路径
    #检测文件
    test -e ${confdir} || touch ${confdir}
    drop_ip=""
    #循环遍历日志文件取出访问量大于 500 的 ip
    for drop_ip  in $(cat $logdir | awk '{print $1}' | sort | uniq -c | sort -rn  | awk '{if ($1>500) print $2}')
    do
      grep  -q  "${drop_Ip}" ${confdir} && eg=1 || eg=0;
      if (( ${eg}==0 ));then
         echo "deny ${drop_Ip};">>$confdir  #把“ deny IP ;”语句写入封锁配置文件中
         echo ">>>>> `date '+%Y-%m-%d %H%M%S'` - 发现攻击源地址 ->  ${drop_Ip} " >> /usr/local/data/nginx/logs/nginx_deny.log  #记录 log
      fi
    done
    service nginx reload
    

    -解锁 IP

    #!/bin/bash
    sed -i 's/^/#&/g' /usr/local/nginx/conf/
    blockip.conf  #把 nginx 封锁配置文件中的内容注释掉
    service nginx reload   #重置 nginx 服务,这样就做到了解锁 IP
    

    使用 iptables 封锁

    ...

    -封锁 IP 脚本

    #!/bin/bash
    max=500    #我们设定的最大值,当访问量大于这个值得时候,封锁
    logdir=/usr/local/data/nginx/logs/access_huke88.log  #nginx 访问日志文件路径
    port=80
    drop_ip=""
    #循环遍历日志文件取出访问量大于 500 的 ip
    for drop_ip  in $(cat $logdir | awk '{print $1}' | sort | uniq -c | sort -rn  | awk '{if ($1>500) print $2}')
    do
      grep  -q  "${drop_Ip}" ${confdir} && eg=1 || eg=0;
      if (( ${eg}==0 ));then
         iptables -I INPUT -p tcp --dport ${port} -s ${drop_Ip} -j DROP
         echo ">>>>> `date '+%Y-%m-%d %H%M%S'` - 发现攻击源地址 ->  ${drop_Ip} " >> /usr/local/data/nginx/logs/nginx_deny.log  #记录 log
      fi
    done
    

    ...

    加入计划任务每五分钟执行一次

    chmod +x /home/scripts/deny_ip.sh
    #####nginx 封 ip######
    */5 * * * * /bin/sh /home/scripts/deny_ip.sh >/dev/null 2>&1
    

    原文链接: https://www.qcloud.com/community/article/281027001490538345

    21 条回复    2017-04-15 08:27:25 +08:00
    hcymk2
        1
    hcymk2  
       2017-04-14 00:30:46 +08:00   ❤️ 1
    还是用 ipset 吧
    其实 fail2ban 也可以。
    cxbig
        2
    cxbig  
       2017-04-14 06:56:19 +08:00   ❤️ 1
    不是有 fail2ban ?
    现在比较流行 WAF ,服务器几乎只用处理正常的访问。
    ic3z
        3
    ic3z  
       2017-04-14 08:56:31 +08:00 via Android
    日志文件大的时候,这个取地址会不会炸?
    $(cat $logdir | awk '{print $1}' | sort | uniq -c | sort -rn | awk '{if ($1>500) print $2}')
    AnonymousAccout
        4
    AnonymousAccout  
       2017-04-14 08:58:40 +08:00 via iPhone
    @cxbig fail2ban 不是对 ssh 作限制的吗?
    BOYPT
        5
    BOYPT  
       2017-04-14 09:06:24 +08:00
    IP 数据量大了会导致很多 iptables 规则,会严重影响入站流量;应该考虑使用 ipset 。
    lgpqdwjh
        6
    lgpqdwjh  
       2017-04-14 09:08:18 +08:00
    应该使用 nglua
    usernametoolong
        7
    usernametoolong  
       2017-04-14 09:48:43 +08:00 via iPhone
    这个脚本是几年前从 hostloc 流出来的,纯粹的蒙古大夫。。。。。。。。。
    Havee
        8
    Havee  
       2017-04-14 10:49:43 +08:00
    ipset +1
    tylerdurden
        9
    tylerdurden  
       2017-04-14 10:58:00 +08:00
    这种方法有点笨重。
    app13
        10
    app13  
       2017-04-14 11:08:17 +08:00   ❤️ 1
    @AnonymousAccout #4 fail2ban 可以 ban 挺多东西的,你可以去看下它的配置文件
    jarell
        11
    jarell  
       2017-04-14 11:13:06 +08:00
    @usernametoolong 蒙古大夫这个说法真形象
    msg7086
        12
    msg7086  
       2017-04-14 11:24:35 +08:00
    @AnonymousAccout fail2ban 是对 ssh 做限制的啊,但是人家也没说不能限别的嘛……
    ningcool
        13
    ningcool  
       2017-04-14 13:22:15 +08:00
    @Havee fail2ban 和 ipset 用哪个好?
    lixuda
        14
    lixuda  
       2017-04-14 13:41:24 +08:00
    还有比较简单的方式吗?小白
    j4fun
        15
    j4fun  
       2017-04-14 14:00:35 +08:00
    这种脚趾头想想就能写出来的。。。。还要取得授权╮(╯▽╰)╭
    cabing
        16
    cabing  
       2017-04-14 14:49:29 +08:00
    找找 nginx 的插件
    rrfeng
        17
    rrfeng  
       2017-04-14 15:41:47 +08:00
    fail2ban 也是用 iptables
    holinhot
        18
    holinhot  
       2017-04-14 15:59:24 +08:00
    攻击来了日志一会就几百 MB 了
    cxbig
        19
    cxbig  
       2017-04-14 17:35:44 +08:00
    @AnonymousAccout 看看 fail2ban 的文档,它的功能可不仅仅限于 ssh 登录哦。
    hyperxu
        20
    hyperxu  
       2017-04-14 19:11:36 +08:00
    zzlyzq
        21
    zzlyzq  
       2017-04-15 08:27:25 +08:00 via iPhone
    直接路由黑洞 哈哈
    route add -host xxx gw lo
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2765 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 06:45 · PVG 14:45 · LAX 22:45 · JFK 01:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.