我使用 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 进入?
答案1
apache 对 IP 进行反向查找并首先记下主机名。
如果您的过滤器正确制作(例如没有捕获所有内容的锚定正则表达式),则无论域和外部地址的具体写在哪里都无所谓。
我假设在您的示例日志条目中,somedomain.de
是您的,并且20.37.96.167
是“入侵者”的地址。那么正确的失败正则表达式将如下所示:
# ban everything (with code 300-599):
failregex = ^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+
锚定部分^\S+\s+<ADDR>
匹配somedomain.de:80 20.37.96.167
,并且仅由于锚点而从开头搜索字符串^
。如果您必须禁止所有内容(无论生成的 http 状态如何),
这也足以作为正则表达式。other_vhosts_access.log
如果您的 fail2ban 版本 <= 0.9,请使用<HOST>
而不是<ADDR>
。
您还可以检查fail2ban-regex
它是否会捕获一些误报,例如:
fail2ban-regex --raw -vv /path/to/log '^\S+\s+<ADDR>\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+' \
| grep <your-IP-or-hostname>