用linux编写一个通用的实时在后台监测防止ddos攻击脚本,直接给出完整的案例,无需解释,限制每个ip每秒钟和服务器建立的最大TCP连接数(shell变量配置),并增加日志记录功能,超过最大连接数则要记录时间、攻击者ip、访问端口、协议、携带报文、建立的tcp连接总数等信息保存到/home/ddos目录下(shell变量配置),每个日志文件最大100MB(shell变量配置),超过100MB则要重新生成新文件,以生成时间命名(精确到毫秒),并封禁该ip(已经封禁过的无需再次封禁),保存到/home/ddos/blackIpList.txt(shell变量配置),
时间: 2023-02-07 14:01:19 浏览: 139
这是一个可以实现这个功能的脚本:
```
#!/bin/bash
# 配置变量
log_dir="/home/ddos"
log_file="$log_dir/ddos.log"
blacklist_file="$log_dir/blackIpList.txt"
max_conn=1000 # 每秒最大连接数
max_log_size=100 # 日志文件最大大小 (MB)
# 创建日志文件
touch $log_file
# 检查日志文件是否超过最大大小
log_size=$(du -m $log_file | awk '{print $1}')
if [ $log_size -ge $max_log_size ]; then
# 生成新的日志文件
timestamp=$(date +%s%3N)
mv $log_file "$log_dir/ddos-$timestamp.log"
touch $log_file
fi
# 监听网络流量
while true; do
# 抓取网络数据包
data=$(tcpdump -nn -c 100)
# 遍历每个数据包
while read -r line; do
# 解析数据包信息
src_ip=$(echo $line | awk '{print $3}' | awk -F. '{print $1"."$2"."$3"."$4}')
dst_port=$(echo $line | awk '{print $5}' | awk -F. '{print $2}')
protocol=$(echo $line | awk '{print $6}')
packet=$(echo $line | awk '{for (i=9; i<=NF; i++) {printf $i" "}}')
# 检查是否超过最大连接数
conn=$(grep $src_ip $log_file | wc -l)
if [ $conn -ge $max_conn ]; then
# 记录攻击信息
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
echo "$timestamp,$src_ip,$dst_port,$protocol,$packet,$conn" >> $log_file
# 封禁 IP
grep $src_ip $blacklist_file > /dev/null
if [ $? -ne 0 ]; then
echo $src_ip >> $blacklist_file
iptables -I INPUT -s $src_ip -j DROP
fi
fi
done <<< "$data"
阅读全文