通过执行以下命令可以找到某个 IP 地址在某一瞬时时间点所消耗的 Apache 工作程序数量:
netstat -pantu | grep :80 |sort | uniq -c |grep <IP_HERE, eg: 192.168> | wc -l
例如,这在 DDoS 攻击期间很有用。由此可以确定自己的对策是否有效减少了为处理过多流量而生成的 Apache 工作进程的数量等。
最近我遇到了一种情况,对共享 IP 地址进行了攻击,而我无法轻易找到哪个用户消耗了最多的 Apache 工作者。 如何确定这一价值?
有人建议我关注每个用户的流量,但是当有大量工作者产生并造成死锁时,这似乎并没有真正给出我正在寻找的答案,所以我到了试图根据每个用户隔离工作者所有权的地步。
答案1
你可以解析mod_status带ExtendedStatus On
输出。这是实时状态所有工作者/线程/子进程。加上 SSL。
谨防,如果服务器响应很快,这将很难跟踪实际请求数(您看不到状态重新加载之间发生的情况 - 只能看到工作人员的最新请求)。
curl 'http://localhost/server-status' | perl -ne 'print "$1\n" if m~<td nowrap>(.*?)</td>.*</td></tr>~ ' | sort | uniq -c | sort -n
或者在 tcpdump sniff 中对 'Host:' 标头进行硬核 grep - 这不会提供实时工作者数量,但会显示实时服务器流 - 因此,sort|uniq|sort
如果滚动速度太快,您必须自己进行 () 采样 - 但您可以看到所有请求都已满足。不过请注意,它不是一个安全的解析器(标头/数据包可能会混乱等)
tcpdump -qlnpA dst port 80 | egrep '^Host:'
你可以使用 tcpdump 来实现一些功能,比如
tcpdump -qlnpA dst port 80 | egrep -e '^Host:' -e '(GET|POST)\s.*HTTP'
答案2
如果您没有 grep 服务器 IP,您可能只需查看输出即可判断。如果没有,您可以使用 sed 仅获取客户端 IP,然后使用sort
和uniq -c
获取计数,但维护脚本会更容易。