Nginx

fail2ban 檢測到攻擊者 IP 但沒有禁止它,並且讀取日誌很慢

  • September 6, 2021

幾天后,我收到了一些 IP 地址對我的 nginx 的攻擊。我已經決定使用fail2ban 來自動禁止它,但我注意到它執行得不是很好。我可以在日誌中看到正在檢測 IP 地址,但沒有按預期禁止。

我的監獄檔案是:

[nginx-40x-req]
enabled  = true
bantime.rndtime = 2800
bantime.increment = true
port     = http,https
filter   = nginx-40x-req
logpath  = /var/log/nginx/access.log
maxretry = 5

我的過濾器看起來像這樣:

[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<HOST>",

在我的 nginx 上,我添加了一個映射來檢測它的請求,並在檢測到時返回 403。日誌如下所示:

{"status": 403, "request_time": 0.000,  "remote_addr": "xx.xx.xx.xx", "@timestamp": "2021-09-03T18:32:34+02:00", "type": "nginx", "hostname": "vps-e642f340", "host": "d.itsyjd.com", "uri": "/v2/speed_test", "request": "GET https://d.itsyjd.com/v2/speed_test HTTP/1.1", "request_method": "GET", "request_proto": "http", "request_proto_proxy": "-", "request_uri": "/v2/speed_test", "request_args": "-", "server_proto": "HTTP/1.1", "body_bytes_sent": 552, "http_referer": "-", "http_user_agent": "Mozilla/5.0 (Linux; Android 8.0; MHA-AL00 Build/HUAWEIMHA-AL00; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/57.0.2987.132 MQQBrowser/6.2 TBS/044304 Mobile Safari/537.36 (compatible; Baiduspider/2.0;+http://www.baidu.com/search/spider.html)", "msec": 1630686754.923, "upstream_connect_time": -, "upstream_header_time": -, "upstream_response": -, "pipe": "p", "gzip_ratio": "-", "brotli_ratio": "-", "remote_user": "-", "bad_request": "1"}

在我的 fail2ban 上,我可以看到很多消息說檢測到 IP 地址:

2021-09-03 18:34:31,494 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found xx.xx.xx.xx - 2021-09-03 18:29:33

但它仍然沒有禁止這些 IP 地址。

我注意到的一件事是fail2ban讀取速度比日誌速度慢,所以我開始認為可能是問題所在,因為當那些IP被禁止並且fail2ban實時讀取時,另一個IP地址被禁止沒有問題. max_retry 為 5 且所有 IP 地址已被檢測到超過 5 次,因此必須禁止它們。

任何人都知道我可能做錯了什麼(因為肯定是我沒有看到的東西)。

最好的祝福。

編輯:寫完這條消息後,我看到這是禁止的,但工作速度很慢。在大約 15 分鐘內從大約 11 個中禁止了大約 4 個 IP 地址,當每秒它們被檢測到很多次時。

EDIT2:用一個簡單的清除日誌echo "" > <logfile>觸發了禁令。

我的fail2ban版本是0.10.2

由於有問題的攻擊者被禁止並且只接收到幾個請求,fail2ban 正在實時讀取並禁止:

2021-09-03 18:46:13,759 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:13
2021-09-03 18:46:13,909 fail2ban.actions        [32586]: NOTICE  [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:46:18,855 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:46:18
2021-09-03 18:47:07,004 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:47:06
2021-09-03 18:48:34,390 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:34
2021-09-03 18:48:54,230 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,231 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:48:54
2021-09-03 18:48:54,335 fail2ban.actions        [32586]: NOTICE  [nginx-40x-req] Ban XX.XX.XX.XX
2021-09-03 18:50:08,488 fail2ban.filter         [32586]: INFO    [nginx-40x-req] Found XX.XX.XX.XX - 2021-09-03 18:50:08

所以我仍然認為問題可能是讀取速度。

編輯3:

最後我將fail2ban 版本升級到0.11.2,我添加了一個日期模式並更改了地址檢測器。現在似乎讀取 nginx 文件的速度快了很多。

[Definition]
failregex = ^{"status": (400|401|403), "request_time": [0-9\.]+,\s+"remote_addr": "<ADDR>",
datepattern = "@timestamp": "%%Y-%%m-%%dT%%H:%%M:%%S%%z"
  1. 不建議監視訪問日誌,請參閱fail2ban/wiki :: 最佳實踐,尤其是“減少寄生日誌流量”部分。
  2. 不適當的正則表達式也可能導致fail2bans“讀取速度可能比日誌速度慢”,只是我沒有看到你的RE不好。但它可以做得更快,只是您需要為此更改日誌記錄格式。還指定單一和精確datepattern可能有助於加快處理速度。
  3. 合而為一,它可以創建已知的競爭條件,fail2ban 在 v.0.10.5 之前受到影響,有關詳細資訊,請參閱https://github.com/fail2ban/fail2ban/issues/2660(該修復程序已在 v.0.10 中發布。 6 / v.0.11.2)

還要注意類似問題的答案,例如https://github.com/fail2ban/fail2ban/issues/3021#issuecomment-834287295

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