用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 22:09:23 浏览: 120
下面是一个示例的脚本,请注意这个脚本是给出的一个实现思路,您可以根据自己的需要做相应的修改:
```
#!/bin/bash
# 定义变量
WHITE_LIST="127.0.0.1,172.10.1.1"
INTERVAL=20
MAX_TCP_CONN=5
DDOS_DIR="/home/ddos"
LOG_FILE_SIZE=100
BLACK_IP_FILE="$DDOS_DIR/blackIpList.txt"
# 如果目录不存在,则创建目录
if [ ! -d "$DDOS_DIR" ]; then
mkdir "$DDOS_DIR"
fi
# 清理3天以前的日志
find "$DDOS_DIR" -name "*.log" -mtime +3 -delete
# 循环检测
while true; do
# 获取当前时间
current_time=$(date "+%Y-%m-%d %H:%M:%S")
# 获取所有网卡的IP地址
all_ips=$(ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*')
# 枚举所有IP地址
for ip in $all_ips; do
# 如果是白名单中的IP地址,则跳过
if [[ $WHITE_LIST =~ (^|,)$ip(,|$) ]]; then
continue
fi
# 获取当前IP地址的连接数
conn_count=$(netstat -an | grep "$ip" | wc -l)
# 如果连接数大于限制,则记录日志并封禁IP
if [ $conn_count -gt $MAX_TCP_CONN ]; then
# 获取攻击者的详细信息
attack_info=$(netstat -anp | grep "$ip")
# 将信息写入日志文件
log_file="$DDOS_DIR/$(date "+%Y%m%d%H%M%S").log"
echo "$current_time $ip $attack_info" >> "$log_file
阅读全文