wrk泛洪攻击监控脚本_wrk ddos攻击

57 阅读2分钟
  1. 网络连接数:检测与端口80的连接数(使用netstat和ss命令);
  2. 系统负载均衡:使用uptime命令获取系统负载均衡数据;
  3. 访问日志情况:检测最近一千条访问日志中404状态码的数目(使用tail和grep命令)。

当网络连接数、系统负载均衡或404日志数等任一指标超过设定的阈值时,脚本使用iptables命令封锁当前访问量最高的IP地址,从而阻止DDoS攻击。

使用方法如下

  1. 将脚本保存为.py文件;
  2. 在终端中进入该文件所在的目录,执行命令:
python filename.py

其中filename.py为脚本文件名; 3. 等待wrk工具启动; 4. 监控泛红攻击,当达到设定的阈值时,脚本会自动封锁IP并退出。

需要注意的是,该脚本需要权限才能使用iptables命令,因此需要使用root用户或sudo命令执行。

完整代码如下:

import os
import subprocess
import time

"""检测网络连接情况"""
def check_connections():
    # 通过 netstat 命令统计与端口80的连接数
    netstat_result = subprocess.check_output('netstat -an | grep :80 | wc -l', shell=True)
    # 通过 ss 命令统计与端口80的连接数
    ss_result = subprocess.check_output('ss -lnt | grep :80 | wc -l', shell=True)
    # 计算总连接数
    connections = int(netstat_result.strip()) + int(ss_result.strip())
    return connections

def check_load():
    """检测系统负载情况"""
    # 执行 uptime 命令,获取系统负载均衡数据
    result = subprocess.check_output('uptime', shell=True)
    # 将结果转化为字符串
    result_str = result.decode('utf-8')
    # 根据空格分割字符串并获取最后三个元素(即负载均衡)
    load_avg = result_str.split()[-3:]
    # 将负载均衡前面的逗号去掉,并将结果转化为浮点数类型
    load_avg_str = load_avg[0].strip(',')
    return float(load_avg_str)

def check_logs():
    """检测访问日志情况"""
    # 查看日志文件,检索恶意IP
    result = subprocess.check_output('tail -n 1000 /opt/lampp/logs/access_log | grep \' 404 \' | wc -l', shell=True)
    return int(result.strip())

def block_ip(ip):
    """使用iptables命令封锁IP"""
    # 将IP通过防火墙加入黑名单
    os.system('iptables -I INPUT -s {} -j DROP'.format(ip))
    print('IP {} blocked.'.format(ip))

def main():
    # 泛红攻击检测阈值
    MAX_CONNECTIONS = 500
    MAX_LOAD = 2.0
    MAX_LOGS = 100

    # 等待wrk工具启动
    time.sleep(5)

    # 循环检测泛红攻击
    while True:
        connections = check_connections()
        load = check_load()
        logs = check_logs()

        print('Connections: {}, Load: {}, Logs: {}'.format(connections, load, logs))

        if connections > MAX_CONNECTIONS or load > MAX_LOAD or logs > MAX_LOGS:
            # 监测到泛红攻击,封锁IP
            ip = subprocess.check_output('netstat -an | grep :80 | awk \'{print $5}\' | cut -d: -f1 | sort | uniq -c | sort -nr | head -n 1 | awk \'{print $2}\'', shell=True)
            block_ip(ip.strip())
            break

        time.sleep(5)

if __name__ == '__main__':
    main()