为 Named 创建 Fail2ban 规则

为 Named 创建 Fail2ban 规则

由于我正在尝试为 Fail2ban 创建一条规则,由于过去我真的很紧张,所以这条规则我似乎已经消失了很长一段时间,我也愿意将它提交给全世界 :-)

做了什么?

  1. 已在 fail2ban/filter/named-antispam.conf 下创建了一个文件

  2. 创建内容
    #cat filter.d/named-antispam.conf
    [Definition]
    prefregex = ([a-zA-Z][a-zA-Z][a-zA-Z])\s([0-9]|[0-9][0-9])\s([0-9][0-9]):([0-9][0-9]:[0-9][0-9])
    failregex = ^rate limit drop all response to <HOST>$

和 jail.conf

#Disabled for Writing this Articel
[named-antispam]
enabled = false
filter = named-antispam
logpath  = /var/log/named/rate.log
bantime      = 2628000
maxretry     = 30
findtime     = 60
  1. 检查如果我启用 fail2ban 并将其设置为调试,会发生什么情况?

2021-01-26 11:25:19,461 fail2ban.filterpyinotify[14180]: DEBUG   Event queue size: 16
2021-01-26 11:25:19,462 fail2ban.filterpyinotify[14180]: DEBUG   <_RawEvent cookie=0 mask=0x2 name='' wd=2 >

如果我禁用该规则,我可以设置没有该错误的调试 - 所以在我看来,我遇到了某种我无法弄清楚的错误,这就是我在这里问的原因。并在结尾处 - 是的,我的日志中有很多条目,但 fail2ban 并不关心

答案1

您没有提供问题的本质,也没有提供您想要在过滤器中捕获的消息的日志摘录,也没有提供fail2ban-regex -v使用过滤器找到的尝试。

我猜这条信息是这样的:

Jan 26 14:00:10 srv named[26403]: client 192.0.2.100#21324 (example.com): rate limit drop all response to 192.0.2.0/24

这里有两点需要注意 - 首先 IP 在客户端之后(此处192.0.2.100),最后它有一个子网(IP/CIDR 表示法,此处192.0.2.0/24)。

如果您想禁止某个子网(如果您的 fail2ban 和 choosen banaction 能够禁止所有子网),您可以根据您的版本使用:

要么这样(如果你的fail2ban支持<SUBNET>):

failregex = ^\s*\S+\s+named(?:\[\d+\])?: [^:]+: rate limit drop all response to <SUBNET>

或这个:

failregex = ^\s*\S+\s+named(?:\[\d+\])?: [^:]+: rate limit drop all response to (?:<F-IP4>\d+\.\S+</F-IP4>|<F-IP6>\w+\:\S+</F-IP6>)

您也可以禁止IP而不是子网,然后使用以下任一方法:

failregex = ^\s*\S+\s+named(?:\[\d+\])?: client <ADDR>[^:]*: rate limit drop all response

您还可以使用来检查fail2ban-regex,例如:

msg='Jan 26 14:00:10 srv named[26403]: client 192.0.2.100#21324 (example.com): rate limit drop all response to 192.0.2.0/24'
fail2ban-regex "$msg" '^\s*\S+\s+named(?:\[\d+\])?: [^:]+: rate limit drop all response to <SUBNET>'
...
Lines: 1 lines, 0 ignored, 1 matched, 0 missed

或者使用日志文件测试过滤器使用以下命令:

fail2ban-regex /var/log/named/rate.log named-antispam

至于您的prefregexfailregex- 它们根本不正确。prefregex 和 failregex 都不能包含时间戳匹配的部分datepattern(请阅读我们的操作方法维基百科或者手动的, 它包含了: 注意:failregex将在处理后应用于消息的剩余部分prefregex(如果指定),而处理后又会进行datepattern(即从消息中剪掉与最佳模式匹配的时间戳字符串)。

这也是prefregex有意义的,如果您需要一些预过滤,例如您有多个failregex(并且这样的正则表达式将应用于整行,或者应用于在<F-CONTENT>和之间包含的部分匹配的RE </F-CONTENT>,如果它被指定的话。如果没有预期的预过滤,则prefregex没有什么意义。

无论如何,如果你因为某种原因需要它,它看起来会像这样:

prefregex = ^\s*\S+\s+named(?:\[\d+\])?: <F-CONTENT>.+</F-CONTENT>$ 

failregex = ^[^:]+: rate limit drop all response to <SUBNET>
#failregex = ^[^:]+: rate limit drop all response to (?:<F-IP4>\d+\.\S+</F-IP4>|<F-IP6>\w+\:\S+</F-IP6>)
#failregex = ^client <ADDR>[^:]*: rate limit drop all response

相关内容