Utoljára aktív 1721369279

block_ip_with_iptables.sh Eredeti
1# 1)屏蔽每分钟访问超过200的IP
2
3# 方法1:根据访问日志(Nginx为例)
4
5#!/bin/bash
6DATE=$(date +%d/%b/%Y:%H:%M)
7ABNORMAL_IP=$(tail -n5000 access.log |grep $DATE |awk '{a[$1]++}END{for(i in a)if(a[i]>100)print i}')
8#先tail防止文件过大,读取慢,数字可调整每分钟最大的访问量。awk不能直接过滤日志,因为包含特殊字符。
9for IP in $ABNORMAL_IP; do
10 if [ $(iptables -vnL |grep -c "$IP") -eq 0 ];
11 then
12 iptables -I INPUT -s $IP -j DROP
13 fi
14done
15
16# 方法2:通过TCP建立的连接
17#!/bin/bash
18ABNORMAL_IP=$(netstat -an |awk '$4~/:80$/ && $6~/ESTABLISHED/{gsub(/:[0-9]+/,"",$5);{a[$5]++}}END{for(i in a)if(a[i]>100)print i}')
19#gsub是将第五列(客户端IP)的冒号和端口去掉
20for IP in $ABNORMAL_IP; do
21 if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
22 iptables -I INPUT -s $IP -j DROP
23 fi
24done
25
26
27# 屏蔽每分钟SSH尝试登录超过10次的IP
28# 方法1:通过lastb获取登录状态
29
30#!/bin/bash
31DATE=$(date +"%a %b %e %H:%M") #星期月天时分 %e单数字时显示7,而%d显示07
32ABNORMAL_IP=$(lastb |grep "$DATE" |awk '{a[$3]++}END{for(i in a)if(a[i]>10)print i}')
33for IP in $ABNORMAL_IP; do
34 if [ $(iptables -vnL |grep -c "$IP") -eq 0 ];
35 then
36 iptables -I INPUT -s $IP -j DROP
37 fi
38done
39
40# 方法2:通过日志获取登录状态
41
42#!/bin/bash
43DATE=$(date +"%b %d %H")
44ABNORMAL_IP="$(tail -n10000 /var/log/auth.log |grep "$DATE" |awk '/Failed/{a[$(NF-3)]++}END{for(i in a)if(a[i]>5)print i}')"
45for IP in $ABNORMAL_IP; do
46 if [ $(iptables -vnL |grep -c "$IP") -eq 0 ]; then
47 iptables -A INPUT -s $IP -j DROP
48 echo "$(date +"%F %T") - iptables -A INPUT -s $IP -j DROP" >>~/ssh-login-limit.log
49 fi
50done
51
52
53
54