用linux编写一个通用的实时在后台监测防止ddos攻击脚本,直接给出完整的案例,无需解释,要求有白名单列表,多个白名单用逗号隔开,排除本地所有网卡ip,每20秒钟检测一次(shell变量配置),限制每个ip每秒钟和服务器建立的最大TCP连接数(shell变量配置),并增加日志记录功能,超过最大连接数则要记录时间、攻击者ip、访问端口、协议、携带报文、建立的tcp连接总数等信息保存到/home/ddos目录下(shell变量配置),每个日志文件最大100MB(shell变量配置,自动清理3天以前的日志),超过100MB则要重新生成新文件,以生成时间命名(精确到毫秒),并使用iptables立即封禁该ip(已经封禁过的无需再次封禁),保存到/home/ddos/blackIpList.txt(shell变量配置),以上代码中文件或者目录不存在的需要自动进行创建,灵活发挥,减少人工干预和出错概率
时间: 2023-02-07 11:01:53 浏览: 61
以下是一个示例脚本,请注意,这只是一个示例,并不能保证完全能够满足所有情况:
```
#!/bin/bash
# 设置变量
whiteList="192.168.1.1,192.168.1.2"
maxConnectionPerIpPerSecond=50
logDir="/home/ddos"
logFileMaxSize=100MB
logKeepDays=3
blackIpListFile="/home/ddos/blackIpList.txt"
# 如果目录或文件不存在,则创建
[ ! -d "$logDir" ] && mkdir -p "$logDir"
[ ! -f "$blackIpListFile" ] && touch "$blackIpListFile"
# 获取本地所有网卡的IP地址
localIps=$(ip addr | grep 'inet ' | awk '{print $2}' | cut -d '/' -f 1)
# 每20秒检测一次
while true
do
# 获取当前时间
now=$(date +"%Y%m%d%H%M%S%3N")
# 获取每个IP的TCP连接数
ipConnectionCount=$(ss -ant | awk '{print $5}' | grep -oE "[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}" | sort | uniq -c)
# 遍历每个IP
while read -r line
do
# 获取IP地址和连接数
count=$(echo "$line" | awk '{print $1}')
ip=$(echo "$line" | awk '{print $2}')
# 如果不在白名单内,且连接数大于最大值,则记录日志并封禁
if ! echo "$whiteList" | grep -q "$ip" && [ "$count" -gt "$maxConnectionPerIpPerSecond" ]
then
# 记录日志
echo "$now $ip $count" >> "$logDir/$now.log"
# 封禁IP
iptables -I INPUT -s "$ip" -j DROP
echo "$ip" >> "$blackIpListFile"
fi
done <<< "$ipConnectionCount"
# 清理过期日志
find "$logDir"