最近,我收到了来自几个 IP 地址的异常高 https 流量,这些 IP 地址的代理伪装成 Windows 客户端。我通过 .htaccess 中的“deny”阻止了该范围(Apache 2.4)
我每秒仍会收到近 1,000 个 HEAD 请求,其中 httpd 正确响应 403……但传入 ping 仍在继续。
我在 AWS EC2 上,正在那里查看选项(除了使用 WAF/负载均衡器等)。我应该为此配置网络防火墙吗,还是有其他简单的方法可以在 EC2 实例入口处阻止此流量?
(编辑)我刚刚将该子网添加到 EC2 网络 ACL 入站规则(拒绝),它似乎正在起作用……也许这是正确的答案?
答案1
在 AWS 上阻止少量 IP 地址的最简单方法是 NACL(网络访问控制列表)。NACL 是理想的选择,因为它们同时具有允许和拒绝规则,可让您拒绝一些 IP,然后允许大范围的 IP - 通常是 0.0.0.0/0。
另一方面,安全组只有允许规则。如果你想排除一个 IP,你就得费很大劲地制定一整套允许规则,让所有你想要的 IP 减去你不想要的 IP,这将是很多的規則。
如果您不想要的流量来自多个 IP,那么最好使用 AWS WAF 或 CloudFlare 等外部服务。CloudFlare 有免费和付费计划,他们的免费计划足以满足许多个人服务器的需求,而他们的付费计划则非常划算。注意:我与 CloudFlare 没有任何关系,我只是喜欢他们的服务。
Fail2ban 是另一种选择。此选项或类似选项的缺点是您仍然需要使用带宽和 CPU 来拒绝这些请求。我更喜欢使用 CDN 来完全阻止它们到达服务器。
答案2
根据你在 ec2 实例上运行的操作系统,你可以安装失败2ban并为其编写一个小脚本,检查您的 access_log 中是否存在 HEAD 请求,并阻止发出过多请求的任何 IP。
我链接到了fail2ban
repo,但是现在大多数(所有?)发行版都通过包管理器提供它。
它的优点fail2ban
是一旦设置完成就会自动运行,并在可配置的时间后解除对 IP 的阻止,这可能会或可能不会帮助解决用户抱怨他们意外阻止了自己并请求解除阻止的问题。
这里是某人使用它来过滤运行过多GET
请求的Web 客户端的一个例子robots.txt
。它的要点是根据 OP 的需求而改编的,是一个模式配置文件jail-d/apache-head.conf
[apache-head]
enabled = true
port = http,https
filter = apache-too-many-heads
logpath = /var/www/*/logs/access.log
datepattern = %%d/%%b/%%Y:%%H:%%M:%%S %%z
maxretry = 300
findtime = 5m
bantime = 1h
和一个filter.d/apache-too-many-heads.conf
# Fail2Ban filter to scan Apache access.log for DoS attacks
[INCLUDES]
before = common.conf
[Definition]
# Option: failregex
# Notes.: regex to match HEAD requests in the logfile
# The host must be matched by a group named "host". The tag "<HOST>"
# can be used for standard IP/hostname matching and is only an alias for
# (?:::f{4,6}:)?(?P<host>[\w\-.^_]+)
# Values: TEXT
failregex = ^<HOST> .*"HEAD
# Option: ignoreregex
# Notes.: regex to ignore. If this regex matches, the line is ignored.
# Values: TEXT
#
ignoreregex =
这将找到在 5 分钟内 (findtime) 有超过 300 个 (maxretry) HEAD(failregex)请求的主机,并使用iptables
/nftables
阻止其 IP 一小时 (bantime)。