首先,看看这个问题:
我们在其中一台 Debian VPS 服务器上看到了完全相同的情况 - 但有一个很大的不同,即所述请求的规律性。我们看到每分钟有 5000 多个请求 - 有时每秒多达 100 个请求 - 全部针对我们没有托管的域 - 这是一个大问题,因为 apache 正在消耗大量内存,然后导致服务器崩溃。
other_vhosts_access.log
我从 Apache截取了尾部快照并上传到此处:
http://www.heavencore.co.uk/filehub/20140411101731_apache_log_tail.txt
该日志的两个示例:
vps.XXXXXX.co.uk:80 216.244.68.216 - - [10/Apr/2014:14:57:15 +0000] "GET http://advs.adgorithms.com/ttj?id=2440545 HTTP/1.0" 404 527 "http://www.cashwargames.com/girls-games.htm" "Mozilla/4.0 (compatible; MSIE 5.0; Mac_PowerPC; Alexa Toolbar)"
vps.XXXXXX.co.uk:80 192.157.246.54 - - [10/Apr/2014:14:57:15 +0000] "GET http://ads.yahoo.com/st?ad_type=ad&ad_size=300x250§ion=5452138&pub_url=${PUB_URL} HTTP/1.0" 404 520 "http://www.verlyer.com/?p=866" "Mozilla/5.0 (Windows; U; Windows NT 5.1; ru-RU) AppleWebKit/533.18.1 (KHTML, like Gecko) Version/5.0.2 Safari/533.18.5"
即使我们删除了所有虚拟主机 - Apache 仍然会用 404 回复所有这些请求,如果我们将 Apache 配置为拒绝所有请求 - 它只会开始用 403 回复
作为权宜之计,我们使用 IPTABLES 来阻止除主要用户的几个 IP 地址之外的所有到服务器的流量。
但是,正如您从尾部日志中看到的那样,这些请求来自数千个唯一地址 - 大概是某些僵尸网络已经登录到我们的服务器上了??
我们如何才能阻止这次攻击并重新恢复服务器的公共 http 访问???(现在已持续超过 48 小时)
VPS 由第三方托管,我们无法控制外围防火墙/虚拟机管理程序。
第三方支持人员唯一推荐的是使用 IPT 来阻止所有 IP - 考虑到 IP 数量之多,我们不明白这如何可能实现?
答案1
我会尝试使用带有一些不同速度的 Web 服务器(带有 worker 或 event MPM 的 apache 2.4,或者 ngix)的反向代理,它只允许对真正的 Web 服务器发出有效请求(可能是带有 prefork MPM 的 apache,以实现 PHP 兼容性)。
两者都可以在同一个 VPS 上运行。例如,真实的 Web 服务器可以在非标准端口上监听 127.0.0.2。
答案2
您可以配置一个默认虚拟主机来处理除您的服务器之外的所有域。将其配置为对所有查询返回 403 请求。这将包含最少的内容。还将其配置为不允许保持活动以快速释放资源。
使用默认虚拟主机的单独日志,并将 fail2ban 配置为丢弃任何连接的主机,这将快速阻止主机。Fail2ban 将在可配置的时间后清除阻止。