Linux系统防CC攻击自动拉黑IP增强版(Shell脚本)
Linux系统在面对网络攻击时,尤其是CC攻击(Challenge Collapsar),往往需要有效的防护手段,本文将介绍一个用于防御CC攻击的Shell脚本,该脚本可以自动检测并拉黑发起攻击的IP地址,从而保护服务器免受恶意流量的侵袭。
脚本解析
1、脚本功能:
并发连接检查:通过netstat
命令获取当前所有TCP连接,筛选出目标端口(如80)的连接,统计每个IP的并发连接数。
黑名单处理:对并发连接数超过设定阈值的IP进行拉黑操作,使用iptables将这些IP加入黑名单。
邮件通知:当有IP被拉黑时,发送邮件通知管理员。
2、代码详解:
“`bash
#!/bin/bash
#Author:ZhangGe
#Desc:Auto Deny Black_IP Script.
#Date:20141105
# 取得参数$1为并发阈值,若留空则默认允许单IP最大50并发
if [[ z $1 ]];then
num=50
else
num=$1
fi
# 巧妙的进入到脚本工作目录
cd $(cd $(dirname $BASH_SOURCE) && pwd)
# 请求检查、判断及拉黑主功能函数
function check(){
iplist=netstat an |grep ^tcp.*:80|egrep v 'LISTEN|127.0.0.1'|awk F"[ ]+|[:]" '{print $6}'|sort|uniq c|sort rn|awk v str=$num '{if ($1>str){print $2}}'
if [[ ! z $iplist ]]; then
> ./black_ip.txt
for black_ip in $iplist
do
# 白名单过滤中已取消IP段的判断功能,可根据需要自行修改以下代码
grep q $black_ip ./white_ip.txt
if [[ $? eq 0 ]];then
echo "$black_ip (white_ip)" >>./black_ip.txt
else
echo $black_ip >>./black_ip.txt
iptables nL | grep $black_ip ||(iptables I INPUT s $black_ip j DROP & echo "$black_ipdate +%Y%m%H:%M:%S
">>./deny.log & echo 1 >./sendmail)
fi
done
# 存在并发超过阈值的单IP就发送邮件
if [[cat ./sendmail
== 1 ]];then sendmsg;fi
fi
}
# 发邮件函数
function sendmsg(){
netstat nutlp | grep "sendmail" >/dev/null 2>&1 || /etc/init.d/sendmail start >/dev/null 2>&1
echo e "From: 发邮件地址@qq.com
To:收邮件地址@qq.com
Subject:Someone Attacking your system!!
Its Ip is" >./message
cat ./black_ip.txt >>./message
/usr/sbin/sendmail f 发邮件地址@qq.com t 收邮件地址@qq.com i <./message
> ./sendmail
}
# 间隔10s无限循环检查函数
while true
do
check
# 每隔10s检查一次,时间可根据需要自定义
sleep 10
done
“`
3、执行方式:
将以上代码保存为deny_blackip.sh
。
进入脚本文件所在目录,然后使用如下命令后台执行脚本(后面的50表示并发数,可自行调整):
“`bash
nohup ./deny_blackip.sh 50 &
“`
FAQs常见问题解答
1、Q: 这个脚本适用于哪些场景?
A: 这个脚本主要适用于Web服务器遭受CC攻击的情况,通过监测并发连接数,自动拉黑超过阈值的IP,有效减少恶意流量对服务器的影响,脚本还支持邮件通知功能,便于管理员及时了解服务器状态。
2、Q: 如何自定义并发连接数阈值?
A: 在脚本开头部分,有一个参数设置,可以通过修改这个参数来调整并发连接数阈值。
“`bash
num=50
“`
这里将并发连接数阈值设置为50,可以根据实际需求进行调整。
Linux系统防CC攻击自动拉黑IP增强版 Shell脚本
脚本说明
本脚本旨在帮助Linux系统管理员自动检测和拉黑进行CC攻击的IP地址,脚本会定期检查访问日志,识别出频繁访问的IP地址,并将这些IP地址添加到防火墙的禁止列表中,从而增强系统的安全性。
脚本要求
需要root权限运行脚本
需要安装iptables
(大多数Linux发行版默认已安装)
需要配置好Web服务器的访问日志文件路径
脚本配置
以下是对脚本的基本配置:
日志文件路径,根据实际情况修改 LOG_FILE="/var/log/nginx/access.log" 拦截的IP地址存储文件 BLOCKED_IP_FILE="/var/log/nginx/blocked_ips.txt" 检测频率阈值,单位为秒 FREQUENCY_THRESHOLD=60 拦截时间,单位为秒 BLOCK_TIME=3600 检查频率的IP列表大小 CHECK_SIZE=100 防火墙规则链名 iptables_chain="INPUT"
#!/bin/bash 获取脚本所在目录 SCRIPT_DIR=$(cd "$(dirname "$0")" && pwd) 加载配置 source "$SCRIPT_DIR/config.sh" 检查日志文件是否存在 if [ ! f "$LOG_FILE" ]; then echo "日志文件 $LOG_FILE 不存在,请检查路径是否正确。" exit 1 fi 函数:检查IP是否已被拉黑 is_ip_blocked() { local ip="$1" grep q "$ip" "$BLOCKED_IP_FILE" && return 0 || return 1 } 函数:添加IP到拉黑列表 block_ip() { local ip="$1" echo "$ip" >> "$BLOCKED_IP_FILE" iptables A $iptables_chain s $ip j DROP echo "IP $ip 已被拉黑。" } 函数:移除IP从拉黑列表 unblock_ip() { local ip="$1" sed i "/$ip/d" "$BLOCKED_IP_FILE" iptables D $iptables_chain s $ip j DROP echo "IP $ip 已从拉黑列表中移除。" } 主逻辑 { # 读取日志文件,统计每个IP的访问频率 awk '{print $1}' "$LOG_FILE" | sort | uniq c | sort nr | head n $CHECK_SIZE | while read count ip; do current_time=$(date +%s) last_time=$(grep m 1 "$ip" "$BLOCKED_IP_FILE" | cut d ' ' f 2) # 检查IP是否已被拉黑 if is_ip_blocked "$ip"; then echo "IP $ip 已被拉黑,跳过。" continue fi # 检查IP访问频率是否超过阈值 if [ "$count" gt "FREQUENCY_THRESHOLD" ]; then # 计算距离上次拉黑的时间 if [ n "$last_time" ]; then if [ "$((current_time last_time))" lt "$BLOCK_TIME" ]; then echo "IP $ip 拦截时间未到,跳过。" continue fi fi # 添加IP到拉黑列表 block_ip "$ip" else # 如果IP访问频率低于阈值,检查是否需要移除 if [ n "$last_time" ]; then unblock_ip "$ip" fi fi done } | while read count ip; do echo "IP $ip 访问频率:$count" done
使用方法
1、将以上脚本保存为block_cc.sh
。
2、修改config.sh
文件中的配置参数。
3、给脚本执行权限:chmod +x block_cc.sh
4、定时运行脚本,可以使用cron
或其他定时任务工具。
注意事项
确保脚本中的日志文件路径正确。
定期检查和清理BLOCKED_IP_FILE
文件,以避免过多无效的IP地址占用空间。
脚本中的FREQUENCY_THRESHOLD
和BLOCK_TIME
需要根据实际情况调整。
在生产环境中使用前,请先在测试环境中验证脚本效果。
原创文章,作者:未希,如若转载,请注明出处:https://www.kdun.com/ask/1173679.html
本网站发布或转载的文章及图片均来自网络,其原创性以及文中表达的观点和判断不代表本网站。如有问题,请联系客服处理。
发表回复