Shell脚本实现自动封禁恶意扫描IP

iptables 简介

我们使用iptables工具实现功能

iptables 是 Linux 系统上最常用的防火墙工具,可以指定策略。

Shell文件创建

首先我们先创建文件scanners.sh

复制代码
vim /usr/local/bin/auto_block_ip.sh

我的目标是每10分钟自动扫描,再10分钟内一个IP访问50次以上就就封禁1天。时间到了后再自动放出来。

第一步 定义部分参数

复制代码
BAN_IPSET="malicious_ips"  # ipset集合名称
SCAN_THRESHOLD=50          # 10分钟内访问50次触发封禁
BAN_DURATION=$((24*60*60)) # 封禁持续时间(秒),24小时
EXCLUDE_IPS="127.0.0.1 0.0.0.0 192.168.253.1" # 排除的IP列表

第二步 创建iptables规则

复制代码
# 创建ipset集合(如果不存在)
if ! ipset list $BAN_IPSET >/dev/null 2>&1; then
    ipset create $BAN_IPSET hash:ip timeout $BAN_DURATION
fi

# 添加iptables规则(如果不存在)
if ! iptables -C INPUT -m set --match-set $BAN_IPSET src -j DROP >/dev/null 2>&1; then
    iptables -I INPUT -m set --match-set $BAN_IPSET src -j DROP
fi

第三步 添加IP检测和封禁机制

复制代码
# 获取所有非排除IP的连接计数
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | grep -vE "$(echo $EXCLUDE_IPS | sed 's/ /|/g')" | uniq -c | \
while read count ip; do
    # 检查是否超过阈值且未被封禁
    if [ $count -gt $SCAN_THRESHOLD ] && ! ipset test $BAN_IPSET $ip >/dev/null 2>&1; then
        # 封禁IP
        ipset add $BAN_IPSET $ip timeout $BAN_DURATION
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 封禁IP: $ip (访问次数: $count)" >> /var/log/ip_block.log
    fi
done

第四步 设置自动执行时间

复制代码
# 设置定时任务
(crontab -l 2>/dev/null; echo "*/10 * * * * /usr/local/bin/auto_block_ip.sh") | crontab -

第五步 测试脚本功能以及脚本使用命令

复制代码
# 给脚本执行权限
chmod +x /usr/local/bin/auto_block_ip.sh

# 手动测试脚本
/usr/local/bin/auto_block_ip.sh

# 查看封禁日志
tail -f /var/log/ip_block.log

# 查看当前封禁IP列表
ipset list $BAN_IPSET

# 手动解封IP
ipset del $BAN_IPSET IP地址

# 清空所有封禁
ipset flush $BAN_IPSET

# 删除整个ipset集合
ipset destroy $BAN_IPSE

附:

复制代码
#!/bin/bash

# 配置参数
BAN_IPSET="malicious_ips"
SCAN_THRESHOLD=50
BAN_DURATION=$((24*60*60))
EXCLUDE_IPS="127.0.0.1 0.0.0.0 192.168.253.1"

# 创建ipset集合
if ! ipset list $BAN_IPSET >/dev/null 2>&1; then
    ipset create $BAN_IPSET hash:ip timeout $BAN_DURATION
fi

# 添加iptables规则
if ! iptables -C INPUT -m set --match-set $BAN_IPSET src -j DROP >/dev/null 2>&1; then
    iptables -I INPUT -m set --match-set $BAN_IPSET src -j DROP
fi

# 检测并封禁IP
netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | grep -vE "$(echo $EXCLUDE_IPS | sed 's/ /|/g')" | uniq -c | \
while read count ip; do
    if [ $count -gt $SCAN_THRESHOLD ] && ! ipset test $BAN_IPSET $ip >/dev/null 2>&1; then
        ipset add $BAN_IPSET $ip timeout $BAN_DURATION
        echo "$(date '+%Y-%m-%d %H:%M:%S') - 封禁IP: $ip (访问次数: $count)" >> /var/log/ip_block.log
    fi
done
相关推荐
Data_Journal3 分钟前
如何绕过 Cloudflare:网页抓取的最佳方法
网络·python
续写烂尾12 分钟前
贴片 SD NAND、eMMC、TF 卡规格怎么定?硬件工程师选型清单
运维·服务器·网络
重生之高冷汉堡包15 分钟前
移动代理 VS 住宅代理IP:性能成本对比与选择
网络
迪康妍妍18 分钟前
终端管控实操:封堵网盘与IM外发通道的落地思路
运维·网络·安全·架构·安全性测试
科技小E23 分钟前
监控设备品牌杂乱无法互通?EasyGBS打通孤岛,统一汇聚视频
服务器·网络·音视频
YH_Analytics1 小时前
2026-2032 食品吸液垫行业市场规模与增长预测
大数据·网络·人工智能
Data analyse4561 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
注塑机数据采集联网2 小时前
注塑机数据采集网关对接MES系统数字化技术方案
大数据·网络·数据库·物联网·数据挖掘·数据分析
weixin199701080162 小时前
《抖音商品API:/product/detail 与 /product/list 的字段边界与图片合规踩坑》(附 Python 源码)
服务器·网络·windows
云飞云共享云桌面2 小时前
设计师共享单台图形服务器,解决 SolidWorks大装配卡顿难题
运维·服务器·3d·自动化·电脑·制造