当前位置: 首页 > news >正文

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; thenipset 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; theniptables -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# 封禁IPipset add $BAN_IPSET $ip timeout $BAN_DURATIONecho "$(date '+%Y-%m-%d %H:%M:%S') - 封禁IP: $ip (访问次数: $count)" >> /var/log/ip_block.logfi
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; thenipset 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; theniptables -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; doif [ $count -gt $SCAN_THRESHOLD ] && ! ipset test $BAN_IPSET $ip >/dev/null 2>&1; thenipset add $BAN_IPSET $ip timeout $BAN_DURATIONecho "$(date '+%Y-%m-%d %H:%M:%S') - 封禁IP: $ip (访问次数: $count)" >> /var/log/ip_block.logfi
done

http://www.dtcms.com/a/321937.html

相关文章:

  • 考研复习-计算机组成原理-第四章-指令系统
  • nvm安装低版本的node失败(The system cannot find the file specified)
  • Mysql 如何使用 binlog 日志回滚操作失误的数据
  • 系统构成与 Shell 核心:从零认识操作系统的心脏与外壳
  • 物联网电能表在企业能耗监测系统中的应用
  • 人工智能与交通:出行方式的革新
  • Android 监听task 栈变化
  • 基于R语言,“上百种机器学习模型”学习教程 | Mime包
  • qt qtablewidget自定义表头
  • ubantu20.04 orin nx 显示器驱动
  • 【C++】类和对象--类中6个默认成员函数(2) --运算符重载
  • 【C#】掌握并发利器:深入理解 .NET 中的 Task.WhenAll
  • Docker容器部署前端Vue服务
  • 复杂路况误报率↓78%!陌讯轻量化模型在车辆违停识别的边缘计算优化​
  • 2025-08-08 李沐深度学习11——深度学习计算
  • 位置编码——RoPE篇
  • 机器学习算法篇(七)深入浅出K-means算法:从原理到实战全解析
  • 【深度学习新浪潮】近三年3DGS在大规模场景重建中的研究进展(2022-2025)
  • 北京上海深圳广州打捞日记
  • 一种基于空间聚类的低特征场景下多目标跟踪技术
  • 什么是ros功能包和ros节点
  • C++程序库选择:权衡与取舍的艺术——以iostream和stdio为例
  • 【大模型】(实践版)Qwen2.5-VL-7B-Instruct模型量化以及运行测试
  • 基于python的农产品销售调度管理的数据可视化系统/基于django的农产品销售系统设计与实现
  • 12-Django项目实战-登录短信验证
  • 解决 MinIO 上传文件时报 S3 API Requests must be made to API port错误
  • 半精度权重 及 Phi-3线性层的权重分布
  • Node.js版本管理,方便好用
  • Mybatis注解开发与事务
  • MPLS LDP标签的分发与管理