无法在 Fail2Ban 中编译正则表达式

无法在 Fail2Ban 中编译正则表达式

我正在尝试让这个正则表达式在 Fail2Ban 中工作:

SRC=(?<ADDR>.*) DST.*(?=DPT=5003)

在正则表达式测试器中,它运行良好。在 Fail2Ban 中测试时,我收到此错误:

ERROR: Unable to compile regular expression 'SRC=(?\[?(?:(?:::f{4,6}:)?(?P<ip4>(?:\d{1,3}\.){3}\d{1,3})|(?P<ip6>(?:[0-9a-fA-F]{1,4}::?|::){1,7}(?:[0-9a-fA-F]{1,4}|(?<=:):)))\]?.*) DST.*(?=DPT=5003)'

这是我想要抓取的日志中的一行:

Jul 14 13:30:44 servername kernel: [  803.539059] [UFW BLOCK] IN=eth0 OUT= MAC=somemacadress SRC=somesourceip DST=somedestinationip LEN=60 TOS=0x00 PREC=0x00 TTL=53 ID=18692 DF PROTO=TCP SPT=50852 DPT=5003 WINDOW=14600 RES=0x00 SYN URGP=0

基本上,如果 DPT=5003 上有阻止,我想阻止 IP

有人可以帮忙吗?

谢谢!

答案1

通常情况下,修复拼写错误就足够了 - 要么使用(?:...)note :,要么删除组括号:

- SRC=(?<ADDR>.*) DST.*(?=DPT=5003)
+ SRC=<ADDR>.* DST.*(?=DPT=5003)

但是这个 RE 是脆弱的(没有锚点,包含 catch-all 等)... 有关更好的 failregex 示例,请参见https://github.com/fail2ban/fail2ban/pull/2225#issuecomment-766087078

答案2

正则表达式SRC=(?<ADDR>.*) DST.*(?=DPT=5003)使用 PCRE 命名捕获组语法,?<ADDR>该语法fail2ban是用 Python 编写的,无法理解也不会使用。您需要使用fail2ban自己的替换<HOST>来捕获 IP 或主机名。请参阅开发过滤器来自fail2ban文档。

更新:<ADDR>替换也被识别,但没有记录在我链接的页面中。

相关内容