![如何处理来自某个 IP 地址的大量连接?](https://linux22.com/image/561879/%E5%A6%82%E4%BD%95%E5%A4%84%E7%90%86%E6%9D%A5%E8%87%AA%E6%9F%90%E4%B8%AA%20IP%20%E5%9C%B0%E5%9D%80%E7%9A%84%E5%A4%A7%E9%87%8F%E8%BF%9E%E6%8E%A5%EF%BC%9F.png)
每隔几周我们就会遇到一个问题,即单个 IP 地址会同时打开大量 Apache 进程。
它似乎每次都连接到类似的页面,但我们的 Apache 进程从正常的~20-25 个繁忙时段增加到最大值 (256)。
然后,此 IP 地址会不断刷新所有请求,导致我们服务器的负载大幅增加,并严重降低网站速度。
每个实例的解决方案都很简单;我从 Apache“服务器状态”中找出 IP,并使用 IP 表规则阻止该 IP。
不幸的是,IP 地址每次都会变化(它总是相似的,当我查找主机时显示“bt openworld”),并且我无法 24/7 全天候登录并添加 IP 表规则。
需要明确的是,我们可以毫无问题地处理来自 Google 和其他搜索引擎的抓取,我不确定我们所遇到的是否是恶意的。
我怎样才能限制其影响?
我们的设置是一台处理 MySQL 和 Apache 的单一服务器。
有人告诉我,负载均衡器是限制单个(但每次攻击都会改变)IP 地址的连接数量的唯一方法。
答案1
也许这样的事情会有所帮助。它将阻止在 2 分钟(180 秒)内打开超过 150 个连接的任何主机:
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 180 --hitcount 150 -j REJECT
你必须调整脚本,这样普通用户就不会被阻止
答案2
那么你可以使用一些 iptables 规则限制并发连接数。
另一个解决方案是优化您的应用程序,以便使用更少的资源更快地处理它们。