几天以来,我不断收到来自某些 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 个 IP 地址中的 4 个,而每秒都会检测到很多次。
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 ::最佳实践特别是“减少寄生日志流量”部分。
- 不合适的正则表达式也会导致 fail2bans “读取速度可能比日志速度慢”,只是我不认为你的正则表达式不好。但它可以变得更快,只是你需要为此更改日志格式。此外,指定单一和精确
datepattern
可能有助于加快处理速度。 - 总之,它可以创建已知的竞争条件,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。