我的服务器被淹没,直到 apache 变得无响应,我需要一些帮助来查找和阻止负责的 IP 地址。
通常,我的连接数不超过 150 个。现在我有成千上万:
netstat -nat | awk '{print $6}' | sort | uniq -c | sort -n
1 established)
1 Foreign
13 LAST_ACK
20 CLOSING
30 SYN_RECV
41 LISTEN
44 FIN_WAIT1
74 FIN_WAIT2
77 CLOSE_WAIT
273 ESTABLISHED
1960 TIME_WAIT
这是计算每个 IP 的连接数的结果(仅限列表末尾):
netstat -atun | awk '{print $5}' | cut -d: -f1 | sed -e '/^$/d' |sort | uniq -c | sort -n
5 4.59.90.216
5 4.59.90.222
5 4.59.90.237
5 4.59.90.242
5 74.125.26.95
6 186.158.143.202
6 216.58.219.162
6 4.59.90.251
7 104.24.5.60
7 216.58.192.66
7 4.59.90.212
7 4.59.90.231
7 4.59.90.241
9 216.58.192.98
10 189.177.214.89
10 23.10.101.162
11 4.59.90.226
12 85.94.197.200
25 216.58.219.66
31 216.58.219.130
40 0.0.0.0
86 83.101.136.42
1026 10.0.0.2
最后一个是服务器的IP,我不知道为什么会显示。谢谢。
您可以尝试限制连接对 apache 的影响的一件事是限制它们。
有几种方法可以做到这一点,但一种方法可能是:
这将允许在 10 分钟内每个源 IP 有 5 个新连接到端口 80,这可能有助于为您赢得一些时间来进一步挖掘。如果问题不仅仅是 apache,您可能会考虑将其应用于所有TCP 连接 - 但我也建议您在这种情况下为您的 SSH 连接添加一个例外。
如果您还没有,可能值得研究的是fail2ban,您可以将其配置为查看您的apache日志,并根据某些标准阻止主机。
我不确定我是否会建议立即部署它(出现问题的可能性似乎有点高),但从长远来看,值得将其列入潜在解决方案列表。
顺便说一句:所有这些都是假设问题是 Apache 的响应能力/负载,而不是您的 Internet 连接上的负载。
如果您的整个上行链路已经饱和,那么您在主机上就无能为力了,因为问题远不止于此。
如果您是基于云的,也许值得看看存在哪些选项。如果你不是,也许值得看看 CDN/DDoS 保护公司(想到 cloudflare,但我不能代表他们的服务)可以提供帮助。
我也倾向于想知道你的机器对所有这些连接做了什么——
netstat -ptn
可能会有所帮助除此之外,您可以查看
iftop
或iptraf
帮助您更深入地了解正在发生的事情。另请参阅https://stackoverflow.com/questions/368002/network-usage-top-htop-on-linux