我正在尝试让这个正则表达式在 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>
替换也被识别,但没有记录在我链接的页面中。