以下是一个实时监测并防止DDOS攻击的脚本示例:
``` #!/bin/bash
设置变量
log_dir="/home/ddos" # 日志文件目录 log_file="ddos.log" # 日志文件名 max_conn=1000 # 每个IP每秒最大连接数 max_log_size=100 # 日志文件最大大小(单位:MB)
循环监测
while true do # 获取当前秒数和毫秒数 secs=$(date +%s) millis=$(date +%N)
# 统计每个IP的连接数
conns=$(netstat -anp | grep 'ESTABLISHED' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c)
# 遍历每个IP
while read -r line
do
# 获取IP地址和连接数
ip=$(echo $line | awk '{print $2}')
conn=$(echo $line | awk '{print $1}')
# 如果连接数超过限制
if [ $conn -gt $max_conn ]
then
# 获取攻击者信息
attacker=$(geoiplookup $ip)
port=$(netstat -anp | grep $ip | grep 'ESTABLISHED' | awk '{print $4}' | cut -d: -f2 | sort | uniq)
protocol=$(netstat -anp | grep $ip | grep 'ESTABLISHED' | awk '{print $6}' | sort | uniq)
packet=$(tcpdump -nn -c 1 "src $ip" | grep -oE 'length [0-9]+' | awk '{print $2}')
# 记录日志
echo "$secs.$millis $attacker $ip $port $protocol $packet $conn" >> $log_dir/$log_file
# 阻止攻击
iptables -I INPUT -s $ip -j DROP
fi
done <<< "$conns"
# 检查日志文件大小
log_size=$(du -m $log_dir/$log_file | awk '{print $1}')
if [ $log_size -ge $max_log_size ]
then
mv $log_dir/$