python检测和防御DOS攻击教程

在windows开发,最后丢到linux中运行,需要安装python3.0+版本在linux中。

利用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的使用率

(6)uptime 获取CPU的平均负载

(7)ss -lnt 显示监听状态下的队列情况:ss -lnt

(8)/opt/lampp/logs/access_log Web服务器访问日志

(9)ifconfig 或 ip -s link 找RX: 接收的字节,TX:发出的字节,计算每秒的大小

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

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

(1)修改系统配置参数,来增加系统的TCP连接数

(2)直接结束某些消耗CPU的进程,或者停止Apache的服务

(3)开启防火墙,将目标IP地址进行封锁

(4)自行查阅资料,进行其他可行的操作

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

DOS攻击具备什么样的特征?

(1)连接数量很多

(2)CPU负载很高

(3)带宽消耗很高

(4)固定于特定IP

基本步骤:

1、确保在Linux上可以正常运行Python 3,而CentOS内置的是 Python 2.7

2、做基本的调研,明确对于DOS的入侵检测,需要使用哪些方法或命令

3、将可以使用的命令通过Python来运行,并进行调试,确保Python+命令可以正常工作

可以直接使用命令提取数据,如使用grep, awk, 或sort等,也可以直接使用Python解析字符串的方式提取数据。

4、想办法找到连接数最多的攻击源IP地址,驱动Linux的防火墙进行入侵防御

5、最后进行整合,测试,再模拟攻击,来确保脚本本身可以正常检测

一、在CentOS上安装Python3
1、下载Python 3.10源代码文件

下载地址:Python Source Releases | Python.org

2、运行以下命令完成安装过程
[root@centqiang ~]# mkdir /usr/local/python3
[root@centqiang ~]# tar -zxvf Python-3.10.0.tgz
[root@centqiang ~]# cd Python-3.10.0
[root@centqiang ~]# ./configure --prefix=/usr/local/python3
[root@centqiang ~]# make
[root@centqiang ~]# make install
3、确认是否安装成功
[root@centqiang ~]# /usr/local/python3/bin/python3
Python 3.10.0 (default, Oct 26 2021, 21:23:05) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import time
>>> print(time.strftime('%Y-%m-%d %H:%M:%S'))  
2021-10-26 21:37:33
>>> import random
>>> print(random.randint(100, 200))
192
>>> exit()
​
如果上述各方面显示正常,则说明Python3安装成功,第三库目录位于:/usr/local/python3/lib/python3.10/site-packages
4、设置环境变量

编辑用户主目录下的 ~/.bash_profile 文件,设置PATH环境变量

export PYTHON_HOME=/usr/local/python3
PATH=$PATH:$HOME/bin:$PYTHON_HOME/bin
export PATH

编辑完成后,运行 source ~/.bash_profile 使环境变量生效,然后可以在命令行直接执行 python3 和 pip3 即可

5、配置pip国内镜像源
在用户主目录下创建 ~/.pip/pip.conf
​
[global]
index-url=http://pypi.douban.com/simple
trusted-host = pypi.douban.com 
二、理解各个命令的含义
1、uptime

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

2、netstat

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

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

各个连接状态的标识:

3、ss

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

显示监听状态下的队列情况:ss -lnt
显示非监听状态下的连接详情:ss -nt
显示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
关闭防火墙:systemctl stop firewalld
添加允许端口:firewall-cmd --add-port=80/tcp
列出防火墙规则:firewall-cmd --list-all
禁止IP地方访问80端口:firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.112.148" port port="80" protocol="tcp" reject'
让配置永久生效:添加允许端口:firewall-cmd --add-port=80/tcp --permanent
允许http服务通过1分钟:firewall-cmd --zone=public --add-service=http --timeout=1m,这个 timeout 选项是一个以秒(s)、分(m)或小时(h)为单位的时间值。
5、sysctl

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

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

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

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

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

一些优化方案:Linux下解决高并发socket最大连接数限制,tcp默认1024个连接_王树民的博客-CSDN博客

三、 python代码示例
# 1、采集CPU的平均负载
def get_cpu_load():
    # 利用Python处理字符串的方式
    uptime = os.popen('uptime').read()
    uptime = uptime.replace(": ", ",")
    cpu_load = float(uptime.split(",")[-3])
​
    # 利用awk命令来提取CPU负载 或者
    cpu_load = os.popen("uptime | awk -F ': ' '{print $2}' | awk -F ',' '{print $1}'").read()
    cpu_load = float(cpu_load)
​
    return cpu_load
# 2、采集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
​
if __name__ == '__main__':
    while True:
        cpu = get_cpu_load()
        conn = get_conn_count()
        recvq, sendq = get_queue_size()
        print(f"CPU-Load: {cpu}, TCP Conn: {conn}, TCP Queue: {recvq, sendq}")
​
        # 对采集到的数据进行判断,并进行预警提醒
        if cpu > 50 and conn > 500 and recvq > sendq - 10:
            print("当前系统TCP连接负载过重,CPU使用率过高,存在DOS攻击的可能性.")
​
        time.sleep(2)

猜你喜欢

转载自blog.csdn.net/m0_73896875/article/details/131580781