用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 15:09:21 浏览: 336
以下是实现上述功能的 shell 脚本示例:
```
#!/bin/bash
# 设置变量
white_list="192.168.1.1,192.168.1.2"
check_interval=20
max_tcp_conn=50
log_dir="/home/ddos"
log_file_max_size=100MB
log_expired_days=3
black_ip_list_file="/home/ddos/blackIpList.txt"
# 创建目录
mkdir -p "$log_dir"
# 初始化日志文件
now=$(date +%s)
log_file="$log_dir/ddos-$now.log"
echo -e "time\tattacker_ip\taccess_port\tprotocol\tpacket\ttcp_conn_cnt" > "$log_file"
# 进入检测循环
while true
do
# 获取当前系统所有网卡的 IP 地址
local_ips=$(ip -o -4 addr | awk '{print $4}' | cut -d/ -f1 | grep -v '^127\.' | tr '\n' ',')
# 构建白名单正则表达式
white_regex=$(echo "$white_list,$local_ips" | tr ',' '|' | sed 's/\./\\./g')
# 获取当前每个 IP 建立的 TCP 连接数
ip_conn_cnts=$(ss -ntu | awk '{print $5}' | sort | uniq -c | awk -v white_regex="$white_regex" '
$2 !~ white_regex {print $2, $1}
')
# 遍历每个 IP 的连接数
while read -r ip conn_cnt
do
# 如果连接数超过限制,记录日志并封禁 IP
if [ "$conn_cnt" -gt "$max_tcp_conn" ]
then
# 获取当前时间
now=$(date +%s)
# 获取 IP 的访问端口、协议、携带的报文信息
access_info=$(ss -ntu | awk -v ip="$ip" '$5 == ip {print $1, $2, $6}')
access_port=$(echo "$access_info" | awk '{print $1}' | cut -
阅读全文