那晚和安全的同事一起搞慢攻击测试,发现apache的这个参数很关键,能阻挡部分慢攻击.
但官方解释不太清楚,简单验证了一下具体含义.
timeout官方解析
我的理解是这个超时参数只是前后两次tcp传输包的间隔,如果大于这个间隔,apache就主动关闭tcp连接.
(中文文档翻译有出入,被坑爹了)
-------------------------------------------------------------------------
httpd.conf设置:
Timeout 10
(1)测试原理:写个脚本与apache三次握手建立tcp连接之后,发送一个不完整的http GET请求,也就是最后的一个"\r\n"不传送,然后每隔5秒发送一个垃圾包.
测试结果:该apache线程一直被这个连接hold住,在大致过了2分钟才返回400错误(Size of a request header field exceeds server limit),断开tcp连接.
注意:这儿返回400是 LimitRequestFieldSize 这个参数的作用,这个参数默认为 8k,表示最多能接收的request header的大小,因为我一直在发垃圾包,所以最终导致request header大于了这个默认值,apache返回了400.(这儿的响应时间跟包的流量有关)
(2)测试方法同(1),不过间隔时间改为 15s 发送一个包,大于timetout的设置.
测试结果:该apache线程10s后就返回了400错误,断开tcp连接. 响应时间与设置的timeout值相同.
结论:
(1)timeout并不是接受一个GET请求耗费的总时间,而只是指两个tcp包之间的超时时间.
(2)如果客户端以小于timeout的时间间隔一直发错误包,这个apache线程将被一直hold住,直到LimitRequestFieldSize所指大小.
测试代码
- #!/usr/bin/perl -w
- use strict;
- use Socket;
- use IO::Handle;
- use threads;
- sub connect {
- my $host = '172.23.181.160';
- my $port = '80';
- my $protocol = getprotobyname('TCP');
- $host = inet_aton($host);
- socket(SOCK, AF_INET, SOCK_STREAM, $protocol) or die ;
- my $dest_addr = sockaddr_in($port, $host);
- connect(SOCK, $dest_addr) or die;
- SOCK->autoflush(1);
- # print SOCK "POST /member/login.jhtml HTTP/1.1\r\nHost:login.taobao.com\r\nContent-Length: 100\r\n\r\n";
- print SOCK "GET /member/login.jhtml HTTP/1.1\r\nHost:login.taobao.com\r\n";
- while (1) {
- print SOCK "hello world!";
- sleep(5);
- }
- close SOCK;
- }
- my $child = 0;
- for ( my $i = 0; $i< 1; $i++) {
- $child = threads->new(\&connect);
- }
- $child->join;
阅读(5482) | 评论(1) | 转发(1) |