在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
三、 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)