我正在尝试模拟 TCP SYN 洪水来调整 Web 服务器(计划在 AWS 上部署)。
我设置了一个“目标”VM,禁用了 iptables 并从几个本地“源”机器(在这些机器的 OUTPUT 链中过滤 RST)运行 hping(hping -p 80 -i u1000 -c 1000 -S destaddr)。
我原本期望在目标服务器的 netstat 输出中看到 1000 条 SYN_RECV 记录,但我只看到最多 256 条(每台“源”计算机 256 条)。我似乎达到了“目标”计算机的某些限制,但找不到它在哪里。tcp_max_syn_backlog 增加到 8096。
知道这个限制是在哪里设置的吗?
答案1
好的,所以我在 webhostingtalk 上问了同样的问题,虽然没有得到直接的答案,但它有助于开阔视野 :)
基本上,我忽略了应用程序级别(Web 服务器)的限制。但这位来自荷兰的绅士深入挖掘,并在此处发布了他非常相关的发现:
http://blog.dubbelboer.com/2012/04/09/syn-cookies.html
基本上,Web 服务器(我使用的是 nginx)将一个常量(监听积压限制)传递给监听函数,它定义如下:
https://github.com/git-mirror/nginx/...x_config.h#L97
定义 NGX_LISTEN_BACKLOG 511
因此内核限制尚未发挥作用。
Nginx 常量已编译,因此我快速检查了 apache - 幸运的是它是可配置的:
http://httpd.apache.org/docs/2.0/mod...#listenbacklog
因此我将其设置为 8k 并得到了我需要的结果(嗯,丢失了 2 个数据包:
源:
hping -S -c 20000 -i u20 -p 80 目标
目标:
netstat -nta | grep SYN_RECV | wc 8192 49152 729088
最后,我最初的 256 个连接限制实际上是由于我最初向端口 22 发送请求(并且 sshd 显然将 tcp 连接积压设置为 256)。