我使用 fail2ban 来检测对我的任何托管域的恶意请求,它运行良好,但有一个例外。
如果请求被发送到 IP 而不是 fqdn 或子域,它会被捕获并写入 other_vhosts_access.log,因为 ip 本身不是虚拟主机。
示例条目:
somedomain.de:80 20.37.96.167 - - [24/Jan/2020:15:47:04 +0100] "POST //4walls/vendor/phpunit/phpunit/src/Util/PHP/eval-stdin.php HTTP/ 1.1" 301 587 " https://www.google.com/ " "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, 像 Gecko) Chrome/79.0.3945.88 Safari/537.36"
看来,apache 对 IP 进行反向查找并首先记下主机名。
这会导致 fail2ban 自我禁止服务器 IP 而不是请求者 IP。
如何防止 somedomain.de:80 条目?
如果您的过滤器制作正确(例如,没有包罗万象的锚定正则表达式),则无论域和外国地址的确切写入位置都没有关系。
我假设在您的示例日志条目中,这
somedomain.de
是您的,并且20.37.96.167
是“入侵者”的地址。然后正确的失败正则表达式如下所示:锚定部分
^\S+\s+<ADDR>
匹配somedomain.de:80 20.37.96.167
并会在字符串中搜索 begin 仅由于 anchor^
。这对于正则表达式也足够了,如果您必须禁止所有内容
other_vhosts_access.log
(无论生成的 http 状态如何)。如果你有 fail2ban 版本 <= 0.9 使用
<HOST>
而不是<ADDR>
.您还可以检查
fail2ban-regex
它是否会捕获一些误报,例如: