当前位置: 首页 > article >正文

《深入解析:DOS检测的技术原理与方法》

DDOS入侵检测与防御

一、实现Linux下DDOS的入侵检测与防御

利用Python编程实现对wrk的泛洪攻击检测,并让程序触发调用Linux命令实现防御:

1、泛洪攻击的检测,可以考虑使用的命令,这些命令可以通过Python进行调用和分析

(1) netstat -ant | wc -l
(2) netstat -ant | grep SYN_RECV
(3) netstat -s | grep overflowed
(4) netstat -s | grep dropped
(5) top -n 1 获取CPU的使用率

以上操作过程的命令,允许使用管道和AWK等技术提取数据,也可以直接使用Python进行数据提取。

2、防御措施可以选择以下几种

(1) 修改系统配置参数,来增加系统的TCP连接数 (2) 直接结束某些消耗CPU的进程,或者停止Apache的服务 (3) 开启防火墙,将目标IP地址进行封锁 (4) 自行查阅资料,进行其他可行的操作

上述Python代码实现的核心就是调用系统命令,再通过Python进行分析,触发命令的执行等。建议在Linux上安装Python3.7及以上的版本。

3、基本步骤

1、确保在Linux上可以正常运行Python3,而CentOS内置的是Python 2.7。 2、做基本的调研,明确对于DOS的入侵检测,需要使用哪些方法或命令。 3、将可以使用的命令通过Python来运行,并进行调试,确保Python+命令可以正常工作。可以直接使用命令提取数据,如使用grep,awk或sort等,也可以直接使用python解析字符串提取数据。 4、想办法找到连接数最多的攻击源IP地址,驱动Linux的防火墙进行入侵防御。5、最后进行整合,测试,再模拟攻击,来确保脚本本身可以正常检测。

二、理解各个命令的含义

1、uptime

uptime命令用于查看主机的开机时长,用户连接数量,以及在1、5、15分钟三段时间内,CPU的负载情况。

2、netstat

netstat命令用来打印Linux中网络系统的状态信息,可让你得知整个Linux操作系统的网络情况。需要注意的是在Windows和Linux上的参数会略有不同。

1. 以数字方式列出所有TCP连接情况:netstat -ant
2. 以数字方式列出所有UDP连接情况:netstat -anu
3. 以数字方式列出所有TCP和UDP处理监听状态的情况:netstat -anult
4. 显示所有端口的统计信息:netstat -s
5. 显示TCP端口的统计信息:netstat -st
6. 显示核心路由信息:netstat -r
7. 显示所有连接的进程信息:netstat -ap

3、ss

用来显示处于活动状态的套接字信息。ss命令可以用来获取socket统计信息,它可以显示和netstat类似的内容。但ss的优势在于它能够显示更多更详细的有关TCP和连接状态的信息,而且比netstat更快速更高效。

1. 显示监听状态下的队列情况:ss -lnt
2. 显示非监听状态下的连接详情:ss -nt
3. 显示socket摘要信息:ss -s

LISTEN状态:Recv-Q表示的当前等待服务端调用accept完成三次握手的listen backlog数值,也就是说,当客户端通过connect()去连接正在listen()的服务端时,这些连接会一直处于这个queue里面直到被服务端accept();Send-Q表示的则是最大的listen backlog数值,这就是上面提到的min(backlog, somaxconn)的值。

非LISTEN状态:Recv-Q表示receive queue中的bytes数量;Send-Q表示send queue中的bytes数值,该数值意义不大,更多关注连接的数量和状态即可。

4. firewall-cmd

1. 关闭防火墙: `systemctl stop firewalld`
2. 添加允许端口: `firewall-cmd --add-port=80/tcp`
3. 列出防火墙规则: `firewall-cmd --list-all`
4. 禁止IP地方访问80端口: `firewall-cmd --add-rich-rule='rule family="ipv4 source address=192.168.112.148 port port=80 protocol=tcp reject'`(解封只需要把add——remove)
5. 让配置永久生效: 添加允许端口: `firewall-cmd --add-port=80/tcp --permanent`

5. sysctl

sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys目录下。sysctl配置与显示在/proc/sys目录中的内核参数。可以用sysctl来设置或重新设置联网功能,如IP转发、IP碎片去除以及源路由检查等。用户只需要编辑/etc/sysctl.conf文件,即可手工或自动执行由sysctl控制的功能。

1. 显示所有系统参数: `sysctl -a`
2. 使用cat查看指定参数: `cat /proc/sys/net/ipv4/ip_forward`,除/proc/sys外,后面的路径与参数名称一致,换成/即可
3. 临时改变某个指定参数的值,如: `sysctl -w net.ipv4.ip_forward=1`,也可以: `echo 1 > /proc/sys/net/ipv4/ip_forward`
4. 如果想永久保留配置,可以修改/etc/sysctl.conf文件

快速修改部分参数,优化性能:

1. net.ipv4.tcp_syncookies:
   是否打开SYN COOKIES的功能,“1”为打开,“2”关闭。
2. net.ipv4.tcp_max_syn_backlog:
   SYN队列的长度,加大队列长度可以容纳更多等待连接的网络连接数。
3. net.ipv4.tcp_synack_retries 和 net.ipv4.tcp_syn_retries:
   定义SYN重试次数,默认为5,建议为2。
4. net.ipv4.sack=0

其他参数的说明: https://www.cnblogs.com/feiyun126/p/8646989.html

一些优化方案: https://blog.csdn.net/wangshuminjava/article/details/80935792

三、DOS的实现

1,python解析字符串

kali:vi dos.py(需要安装python3环境)
import os
import time
from collections import Counter


def get_cpu_load():
    # 第一步:先采集跟DOS攻击关联度较高的数据
    # 1、采集cpu数据的平均负载
    uptime = os.popen('uptime').read()
    # print(uptime)
    uptime = uptime.replace(": ", ",")
    float(uptime.split(",")[-3])
    # print(cpu_load)
    # print(type(cpu_load))

    # 利用awk命令来提取数据
    cpu_load = os.popen("uptime | awk -F ': ' '{print $2}' | awk -F ',' '{print $1}'").read()
    # print(cpu_load)
    # print(type(cpu_load))
    cpu_load = float(cpu_load)
    # print(type(cpu_load))
    # print(cpu_load)
    # 返回数据
    return cpu_load


# 采集netstat -ant的连接数量
def get_conn_count():
    netstat = os.popen('netstat -ant | wc -l').read()
    return int(netstat)


# 3、采集队列长度
def get_queue_size():
    # ss -lnt | grep :80 | awk '{print $3}'
    sslnt = os.popen("ss -lnt | grep :80").read()
    recvq = int(sslnt.split()[1])
    sendq = int(sslnt.split()[2])
    return recvq, sendq


# 4、采集连接数据最多的IP地址
def get_most_ip():
    result = os.popen('netstat -ant | grep :80').read()
    line_list = result.split('\n')
    ip_list = []
    for line in line_list:
        try:
            temp_list = line.split()
            ip = temp_list[-2].split(':')[0]
            ip_list.append(ip)
        except:
            pass
    dict = Counter(ip_list)
    most_ip = dict.most_common(3)
    return most_ip[0][0]


# 5、调用firewall -cmd防火墙命令封锁被攻击IP地址
def firewall_ip(ip):
    result = os.popen(f"firewall-cmd --add-rich-rule='rule family=ipv4 source address={ip} port port=80 protocol=tcp reject'").read()
    if 'success' in result:
        print(f"已成功封禁可疑{ip}")
    else:
        print(f"对可疑攻击{ip}封锁失败")


if __name__ == '__main__':
    while True:
        cpu = get_cpu_load()
        conn = get_conn_count()
        recvq, sendq = get_queue_size()
        most_ip = get_most_ip()
        print(f"cpu_load:{cpu},TCP_Conn:{conn},TCP_Queue:{recvq, sendq}")
        # 对采集到的数据进行判断,并进行预警提醒
        if cpu > 50 and conn > 500 and recvq > sendq - 10:
            print(f"当前系统TCP连接负载过重,CPU使用率过高,存在DOS攻击的可能性,可疑IP地址为:{most_ip}")
            firewall_ip(most_ip)

        time.sleep(5)

2,命令行提取数据

uptime | awk -F ": " '{print $2}'
uptime | awk -F ": " '{print $2}' | awk -F "," '{print $1}'

 


http://www.kler.cn/a/518968.html

相关文章:

  • 【QT】 控件 -- 显示类
  • 《CPython Internals》阅读笔记:p360-p377
  • Linux Futex学习笔记
  • 使用python-docx包进行多文件word文字、字符批量替换
  • 区块链共识机制详解
  • [特殊字符]【计算机视觉】r=2 采样滤波器全解析 ✨
  • 9.business english-agreement
  • WPS添加文本超简单,批量操作不费劲-Excel易用宝
  • 基于Flask框架和Hive数仓的农业数据分析系统
  • 【论文阅读】RT-SKETCH: GOAL-CONDITIONED IMITATION LEARNING FROM HAND-DRAWN SKETCHES
  • 设计模式的艺术-中介者模式
  • 深度学习 Pytorch 单层神经网络
  • React Native 0.77 发布:更强的样式支持与性能优化
  • 图像处理算法研究的程序框架
  • 将本地项目上传到 GitLab/GitHub
  • 基于 Bash 脚本的系统信息定时收集方案
  • 机器学习-使用梯度下降最小化均方误差
  • 数据库的JOIN连接查询算法
  • BUUCTF_Web( XSS COURSE 1)xss
  • golang 编程规范 - Effective Go 中文
  • 【C】memory 详解
  • 了解网络编程
  • 【面试】如何自我介绍?
  • 基于Docker的Spark分布式集群
  • 深度学习-97-大语言模型LLM之基于langchain的实体记忆和知识图谱记忆
  • 2024年AI多极竞争:技术创新与商业突破