余晖落尽暮晚霞,黄昏迟暮远山寻
本站
当前位置:网站首页 > 编程知识 > 正文

linux服务器自动封闭IP及脚本

xiyangw 2023-05-14 11:16 14 浏览 0 评论

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

直接一步到位:

linux服务器自动封闭IP及脚本

1. 修改crontab : $ crontab -e

*/2 * * * * 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 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3020 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3021 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3022 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3023 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:35888 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3000 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3001 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3002 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 
tcp 0 0 0.0.0.0:3003 0.0.0.0:* LISTEN 
tcp 0 0 172.18.230.209:80 118.112.56.229:6785 TIME_WAIT 
tcp 0 0 172.18.230.209:37220 218.5.173.146:1521 ESTABLISHED
tcp 0 0 172.18.230.209:80 182.84.139.53:1817 ESTABLISHED
tcp 0 0 172.18.230.209:37212 218.5.173.146:1521 ESTABLISHED
tcp 401 0 172.18.230.209:38086 140.205.140.205:80 CLOSE_WAIT 

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

# netstat -an | grep ^tcp.*:80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 
tcp 0 0 172.18.230.209:80 118.112.56.229:7873 TIME_WAIT 
tcp 0 0 172.18.230.209:80 118.112.56.229:7426 ESTABLISHED
tcp 401 0 172.18.230.209:38086 140.205.140.205:80 CLOSE_WAIT 
tcp 0 0 172.18.230.209:80 182.84.139.53:49165 TIME_WAIT 
tcp 0 0 172.18.230.209:80 180.108.11.25:15104 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 0 0 172.18.230.209:80 118.112.56.229:7873 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=100 # 每秒某个ip的访问上限
list=`netstat -an |grep ^tcp.*:80|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 80 -j DROP
done

解封IP的方法

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

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

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

相关推荐

辞旧迎新,新手使用Containerd时的几点须知

相信大家在2020年岁末都被Kubernetes即将抛弃Docker的消息刷屏了。事实上作为接替Docker运行时的Containerd在早在Kubernetes1.7时就能直接与Kubelet集成使...

分布式日志系统ELK+skywalking分布式链路完整搭建流程

开头在分布式系统中,日志跟踪是一件很令程序员头疼的问题,在遇到生产问题时,如果是多节点需要打开多节点服务器去跟踪问题,如果下游也是多节点且调用多个服务,那就更麻烦,再者,如果没有分布式链路,在生产日志...

Linux用户和用户组管理

1、用户账户概述-AAA介绍AAA指的是Authentication、Authorization、Accounting,即认证、授权和审计。?认证:验证用户是否可以获得权限,是3A的第一步,即验证身份...

linux查看最后N条日志

其实很简单,只需要用到tail这个命令tail-100catalina.out输入以上命令,就能列出catalina.out的最后100行。...

解决linux系统日志时间错误的问题

今天发现一台虚拟机下的系统日志:/var/log/messages,文件时间戳不对,跟正常时间差了12个小时。按网上说的执行了servicersyslogrestart重启syslog服务,还是不...

全程软件测试(六十二):软件测试工作如何运用Linux—读书笔记

从事过软件测试的小伙们就会明白会使用Linux是多么重要的一件事,工作时需要用到,面试时会被问到,简历中需要写到。对于软件测试人员来说,不需要你多么熟练使用Linux所有命令,也不需要你对Linux...

Linux运维之为Nginx添加错误日志(error_log)配置

Nginx错误日志信息介绍配置记录Nginx的错误信息是调试Nginx服务的重要手段,属于核心功能模块(nginx_core_module)的参数,该参数名字为error_log,可以放在不同的虚机主...

Linux使用swatchdog实时监控日志文件的变化

1.前言本教程主要讲解在Linux系统中如何使用swatchdog实时监控日志文件的变化。swatchdog(SimpleWATCHDOG)是一个简单的Perl脚本,用于监视类Unix系统(比如...

syslog服务详解

背景:需求来自于一个客户想将服务器的日志转发到自己的日志服务器上,所以希望我们能提供这个转发的功能,同时还要满足syslog协议。1什么是syslog服务1.1syslog标准协议如下图这里的fa...

linux日志文件的管理、备份及日志服务器的搭建

日志文件存放目录:/var/log[root@xinglog]#cd/var/log[root@xinglog]#lsmessages:系统日志secure:登录日志———————————...

运维之日志管理简介

日志简介在运维过程中,日志是必不可少的东西,通过日志可以快速发现问题所在。日志分类日志分类,对不同的日志进行不同维度的分析。操作系统日志操作系统是基础,应用都是在其之上;操作系统日志的分析,可以反馈出...

Apache Log4j 爆核弹级漏洞,Spring Boot 默认日志框架就能完美躲过

这两天沸沸扬扬的Log4j2漏洞门事件炒得热火朝天:突发!ApacheLog4j2报核弹级漏洞。。赶紧修复!!|Java技术栈|Java|SpringBoot|Spring...

Linux服务器存在大量log日志,如何快速定位错误?

来源:blog.csdn.net/nan1996jiang/articlep/details/109550303针对大量log日志快速定位错误地方tail/head简单命令使用:附加针对大量log日志...

Linux中查看日志文件的正确姿势,求你别tail走天下了!

作为一个后端开发工程师,在Linux中查看查看文件内容是基本操作了。尤其是通常要分析日志文件排查问题,那么我们应该如何正确打开日志文件呢?对于我这种小菜鸡来说,第一反应就是cat,tail,vi(或...

分享几款常用的付费日志系统,献给迷茫的你!

概述在前一篇文章中,我们分享了几款免费的日志服务器。他们各有各的特点,但是大家有不同的需求,有时免费的服务器不能满足大家的需要,下面推荐几款付费的日志服务器。1.Nagios日志服务器Nagio...

取消回复欢迎 发表评论: