我需要實作fail2ban 來保護伺服器。我想掃描日誌並禁止產生大量 404 訊息的主機。
我遇到的問題是,某個 NAT IP 後面可能有許多客戶端,我需要區分它們。每個客戶端都請求不同的 URL,格式如下:
https://server.example.com/path/<uniqueid>/<mac_address>
我想運行fail2ban,以便它考慮正規表示式中的唯一ID,而不是僅僅查看每個IP 的404 錯誤數量。
我開發了以下正則表達式,它似乎捕獲了所需的事件:
(?P<host>(\d{1,3}.){4})\ -\ -\ \[\d{1,2}\/\w+\/\d{4}[\:\d{2}]+\ \+\d{4}\] "GET \/path\/(?P<unique_id>.+)\/.+HTTP\/\d.\d" ".+" ".+" 404.+
這應該可以匹配:
1.1.1.11 - - [29/Aug/2018:01:27:45 +0100] "GET /path/3B44444444483/ddddee37D4.cfg HTTP/1.1" "somestring" "otherstring" 404 - 2005 5 0.117
這應該匹配,但被視為與上面不同的實例:
1.1.1.11 - - [29/Aug/2018:01:27:45 +0100] "GET /path/3B46666444483/ddddee37D4.cfg HTTP/1.1" "somestring" "otherstring" 404 - 2005 5 0.117
答案1
使用此配置,您的伺服器在日誌中尋找 404 回應會消耗更多的 CPU,而不是不為 X IP 提供 404 回應的任何安全優勢或 CPU 優勢。
如果您不喜歡看到這些回應,請不要為它們建立日誌條目。