脚本禁止登录尝试

脚本禁止登录尝试

需求

有ip不停的尝试登录,可以通过防火墙进行屏蔽

脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
cat /var/log/secure |grep failure|awk '{for (i=1;i<=NF;i++){if ($i ~/rhost/) {print $i}}}'| sort | uniq|awk -F"=" '{print $2}' >> black.list

cat black.list|sort|uniq > black.list.tmp
rm -rf black.list
mv black.list.tmp black.list

firewall-cmd --list-rich-rules > blackiprule.list
all=`cat blackiprule.list`

for ip in `cat black.list|sort|uniq`
do
if [[ $all =~ $ip ]]
then
:
else
echo "不包含"
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='$ip' reject"
fi
done

cat blackiprule.list|wc -l
firewall-cmd --reload

定期执行脚本即可

上面的脚本存在一个问题,如果机器上面拒绝的ip太多了话,这个防火墙的列表会非常的大,而下面的这个就没有这个问题,建议用下面的方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@VM-4-7-centos ~]# cat blackdeny.sh
#! /bin/sh
cat /var/log/secure |grep failure|awk '{for (i=1;i<=NF;i++){if ($i ~/rhost/) {print $i}}}'| sort | uniq|awk -F"=" '{print $2}' >> /root/black.list

cat /root/black.list|sort|uniq > /root/black.list.tmp
rm -rf /root/black.list
mv /root/black.list.tmp /root/black.list

> /etc/hosts.deny
for ip in `cat black.list|sort|uniq`
do
echo ALL:$ip >> /etc/hosts.deny
done

cat black.list|wc -l

写一个定时任务

1
2
[root@VM-4-7-centos ~]# cat /etc/cron.d/black
*/30 * * * * root /root/blackdeny.sh

上面是通过/etc/hosts.deny方式的

下面提供另外一个ipset的模式的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash

#ipset create blocked_ips hash:ip hashsize 4096 maxelem 1000000 counters
#iptables -I INPUT -m set --match-set blocked_ips src -j DROP
#iptables -I FORWARD -m set --match-set blocked_ips src -j DROP


# 清理旧的日志文件
cat /var/log/secure | grep failure | awk '{for (i=1;i<=NF;i++){if ($i ~/rhost/) {print $i}}}' | \
sort | uniq | awk -F"=" '{print $2}' | \
grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' >> /root/black.list

# 排序去重
cat /root/black.list | sort | uniq > /root/black.list.tmp

# 从ipset导出当前已封禁的IP
ipset list blocked_ips 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' > /tmp/blocked.current

# 找出需要新增的IP(只取有效的IP地址)
grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$' /root/black.list.tmp | \
grep -vxFf /tmp/blocked.current > /root/blocking.list

# 替换black.list
rm -f /root/black.list
mv /root/black.list.tmp /root/black.list

# 添加新IP到ipset
if [ -s /root/blocking.list ]; then
added=0
skipped=0

for ip in $(cat /root/blocking.list | sort | uniq); do
# 再次验证IP格式
if [[ $ip =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then
if ipset add blocked_ips "$ip" 2>/dev/null; then
echo "$(date) - 已添加: $ip" >> /var/log/ipset_auto.log
((added++))
else
# IP可能已存在
((skipped++))
fi
fi
done

echo "$(date) - 添加完成: 新增$added个IP, 跳过$skipped个" >> /var/log/ipset_auto.log

# 重新导出已封禁的IP列表
ipset list blocked_ips 2>/dev/null | grep -oE '[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+' > /root/blocked.list
else
echo "$(date) - 没有需要新增的IP" >> /var/log/ipset_auto.log
fi

# 统计
echo "当前已封禁IP数: $(wc -l < /root/black.list 2>/dev/null || echo 0)"

通过ipset结合iptables来进行封禁

下面是目前收集到的,可以预填充下列表(截止2024年12月27日 3572个ip)

1
wget https://www.zphj1987.com/images/black.list

可以作为初始的ip


脚本禁止登录尝试
https://zphj1987.com/2023/01/31/脚本禁止登录尝试/
作者
zphj1987
发布于
2023年1月31日
许可协议