Apache-2.4

阿帕奇訪問日誌

  • January 27, 2020

我使用 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, like Gecko) Chrome/79.0.3945.88 Safari/537.36”

看來,apache 對 IP 進行反向查找並首先記下主機名。

這會導致 fail2ban 自我禁止伺服器 IP 而不是請求者 IP。

如何防止 somedomain.de:80 條目?

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並會在字元串中搜尋 begin 僅由於 anchor ^

這對於正則表達式也足夠了,如果您必須禁止所有內容other_vhosts_access.log(無論生成的 http 狀態如何)。

如果你有 fail2ban 版本 <= 0.9 使用&lt;HOST&gt;而不是&lt;ADDR&gt;.

您還可以檢查fail2ban-regex它是否會擷取一些誤報,例如:

fail2ban-regex --raw -vv /path/to/log '^\S+\s+&lt;ADDR&gt;\s+\S+\s+\S+\s+\[\]\s+"[^\"]+" [345]\d+' \
 | grep &lt;your-IP-or-hostname&gt;

引用自:https://serverfault.com/questions/1000333