![Fail2ban: Failregex에 사용된 정규식이 작동하지 않습니다(대괄호 ] 문제?!)](https://rvso.com/image/777952/Fail2ban%3A%20Failregex%EC%97%90%20%EC%82%AC%EC%9A%A9%EB%90%9C%20%EC%A0%95%EA%B7%9C%EC%8B%9D%EC%9D%B4%20%EC%9E%91%EB%8F%99%ED%95%98%EC%A7%80%20%EC%95%8A%EC%8A%B5%EB%8B%88%EB%8B%A4(%EB%8C%80%EA%B4%84%ED%98%B8%20%5D%20%EB%AC%B8%EC%A0%9C%3F!).png)
fall2ban을 사용하면 apache_access.log 파일의 내용을 기반으로 IP를 금지하고 싶습니다.
이것은 정규식 규칙과 일치시키려는 행의 예입니다.
197.221.254.56 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
이것이 내 Fail2ban 사용자 정의 필터 파일입니다.
[Definition]
failregex = ^<ADDR> - - \[\S+ \S+\] "GET \/ HTTP\/1.0" 400 \S "-" "-"$
ignoreregex =
정규식은 'https://regex101.com/'과 같은 웹사이트에서 완벽하게 작동합니다.
하지만 다음과 같이 fall2ban-regex 도구를 사용할 때:
sudo fail2ban-regex /var/log/site1_access.log /etc/fail2ban/filter.d/les400enhttp1-0.conf
나는 무엇이든 일치합니다.
나는 이 간단한 정규식 규칙 을 사용해 보았습니다 . ^<ADDR> - - \[\S+ \S+
그리고 그것 이 작동 했습니다 !
Results
=======
Failregex: 10 total
|- #) [# of hits] regular expression
| 1) [10] ^<ADDR> - - \[\S+ \S+
`-
Ignoreregex: 0 total
Date template hits:
|- [# of hits] date format
| [10] Day(?P<_sep>[-/])MON(?P=_sep)ExYear[ :]?24hour:Minute:Second(?:\.Microseconds)?(?: Zone offset)?
`-
Lines: 10 lines, 0 ignored, 10 matched, 0 missed
[processed in 0.03 sec]
하지만 정규식을 사용해 보면 다음과 같습니다. ^<ADDR> - - \[\S+ \S+\]
(왼쪽 사각형 sracket]오른쪽에 추가됨)) 'fail2ban-regex' 명령 반환:
Lines: 10 lines, 0 ignored, 0 matched, 10 missed
[processed in 0.03 sec]
|- Missed line(s):
| 36.170.59.167 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 183.228.2.12 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 183.228.2.12 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 126.131.138.146 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 197.221.254.56 - - [13/Jun/2022:22:59:59 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 110.11.157.122 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 220.135.236.27 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 61.231.224.176 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 106.165.107.215 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
| 61.231.224.176 - - [13/Jun/2022:23:00:00 +0200] "GET / HTTP/1.0" 400 0 "-" "-"
`-
10개 놓쳤어요! 왼쪽 대괄호( ] )를 추가하면 예제 행 중 어느 것도 정규식과 일치하지 않습니다.
내 실수가 어디에 있는지 이해가 안 돼요... 도움을 주셔서 감사합니다 :)
답변1
당신이 원하는 것을 고전적인 방법으로 잡는 것이 더 나을 것입니다. 예:
\[.*\]
(당신이 발견한 문제를 일으키는) 날짜 패턴 부분은 분명히 Fail2ban에 의해 특별한 방식으로 처리됩니다.
다음 패턴을 시도해 보면:
\[\]
아이러니하게도 일치하는 것을 볼 수 있습니다. 이는 대괄호 안의 날짜 패턴이 제거되었음을 의미합니다. 그러니 그것을 고려하지 마십시오.
다음과 같이 사용할 수 있습니다.
^<ADDR> -.*\"(GET|POST|HEAD).*HTTP.*\"$
추신. 귀하의 failureregex는 실제로 필터 파일 내에서 주석 처리되어 있으므로 변경할 때 주석 처리를 제거하십시오.