我使用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
,並且僅由於錨點而從頭開始搜尋字串^
。
如果您必須禁止所有內容other_vhosts_access.log
(無論產生的 http 狀態),這作為正規表示式也足夠了。
如果您的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>