我们在负载均衡器和 CDN 前端后面有几台 Apache 2.4 Web 服务器 - HTTPS 终止于此 - 我们在后端 Apache 日志中看到前端标头中的客户端 IP。我想知道是否可以使用 iptables 的字符串匹配(在 Web 服务器计算机上)仅根据特定标头(即包含客户端 IP 的标头)来阻止 IP?
我们的 Linux 内核是最新的,并且我们的 iptables 内核模块已经使用以下配置进行了编译:CONFIG_NETFILTER_XT_MATCH_STRING=m。
我读到过,如果字符串匹配超出包含客户端 IP 的特定标头,它可能会占用大量 CPU 并且可能产生意想不到的后果。或者有更好的工具可以实现这一点,比如代理,但我仍然想了解更多关于其他人使用 iptables 的字符串匹配功能与 Apache 和 fail2ban 的经验。
理想情况下,Apache 应该有类似 nginx 的 444。我可以给 IP 403根据标头中的 IP 匹配,但与 403 相比,444 连接中断似乎级别较低(更突然/更可取),并且资源消耗较少;但我想知道 - 是吗?也许 444 比 403 更耗费资源?
谢谢您的见解!
答案1
当您的 fail2ban 和相关逻辑在后端服务器上运行时,没有简单的解决方案。
我认为第一步是使用 Apachemod_remoteip;那么后端服务器上的 Apache 日志将包含实际的客户端 IP,而不是前端/负载均衡器的 IP 地址:
Apache 默认使用连接的
client_ip
值来标识用户代理,连接remote_host
和remote_logname
从该值派生。这些字段在其他可加载模块的身份验证、授权和日志记录等目的中发挥作用。在请求期间,mod_remoteip 会使用代理或负载均衡器提供的已公布用户代理 IP 覆盖连接的客户端 IP。负载均衡器可能会与服务器建立长期的保持连接,并且每个请求都会具有正确的用户代理 IP,即使负载均衡器的底层客户端 IP 地址保持不变。
然后,您可以轻松地针对 Apache 日志文件运行 fail2ban 来识别有问题的 IP
然后你需要一个风俗和合适的fail2ban禁令行动当从后端服务器发出时,将阻止有问题的 IP。例如,这可以是对前端防火墙的 API 调用,将有问题的 IP 添加到阻止列表或任何其他内容。