我已经为我的 fail2ban 做了一些过滤器,但只是一些简单的事情,例如:
[Definition]
failregex = ^ .* "GET .*/wp-login.php
ignoreregex =
我的服务器上不使用 wordpress,因此我阻止了许多恶意尝试。我还创建了类似的,例如:phpmyadmin、wp-admin、wp-include 等。
但是我在我的 access.log 中发现了一些奇怪的事情,例如:
167.172.145.56 - - [22/Sep/2021:06:44:50 -0700] "GET /wp-login.php HTTP/1.1" 403 9901 "http://cpanel.alebalweb-blog.com/wp-login.php" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
167.172.145.56 - - [22/Sep/2021:06:44:50 -0700] "GET /wp-login.php HTTP/1.1" 403 9901 "http://mail.alebalweb-blog.com/wp-login.php" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:62.0) Gecko/20100101 Firefox/62.0"
61.135.15.175 - - [22/Sep/2021:05:45:24 -0700] "GET / HTTP/1.1" 200 26210 "http://webdisk.alebalweb-blog.com/" "Mozilla/5.0 (Linux; Android 10.0; MI 2 Build/O012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4472.114 Mobile Safari/537.36"
61.135.15.175 - - [22/Sep/2021:05:45:24 -0700] "GET / HTTP/1.1" 200 26210 "http://webmail.alebalweb-blog.com/" "Mozilla/5.0 (Linux; Android 10.0; MI 2 Build/O012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4472.114 Mobile Safari/537.36"
61.135.15.175 - - [22/Sep/2021:05:45:24 -0700] "GET / HTTP/1.1" 200 26210 "http://cpcalendars.alebalweb-blog.com/" "Mozilla/5.0 (Linux; Android 10.0; MI 2 Build/O012) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4472.114 Mobile Safari/537.36"
这些子域名不存在。
受 apache-badbots 的启发,我尝试创建一个新的过滤器,但我不确定它是否正确:
[Definition]
varioustoblock = cpanel\.|store\.|webdisk\.|autodiscover\.|app\.|cpcalendars\.|cpcontacts\.|webmail\.|mail\.|fulaifushi\.|surf11818\.|asg\.|owa\.|exchange\.\$
failregex = ^<HOST> -.*"(GET|POST).*HTTP.*".*(?:%(varioustoblock)s).*"$
ignoreregex =
datepattern = ^[^\[]
特别是对于 (.),过去我遇到了 fail2ban 过滤器中的 (.) 问题,解决方案是将其完全删除...
但在这种情况下,它们无法被删除,我无法阻止我的网址中包含“邮件”一词的任何人...我需要确保阻止“邮件”。
我想创建一个大型过滤器,可以识别不存在的子域并尝试访问 wordpress 或 phpmyadmin,但是如果您从未使用过 pyton regex,那真的很可怕......
谁能帮我?
(我也考虑过从 dns 配置中删除 *.alebalweb-blog.com,但我不确定这是否是个好主意,因为我也使用了一些子域。)
附言:如果有人试图访问我的网站上不存在的子域名,我应该有多担心?
答案1
可能的过滤器可能如下所示:
[Definition]
datepattern = ^\S+ \S+ \S+( \[{DATE}\])
errcode = (?!401)[45]\d\d
allowedsubdomains = www|mail|cpannel
wrongdomains = (?!(?:%(allowedsubdomains)s)?\.)(?:[^\."]+\.){2,}[^\."]+
failregex = ^<ADDR> \S+ \S+ "[A-Z]+ /[^"]*" (?:(?P<err>%(errcode)s)|\d+)(?(err)| \d+ "https?://%(wrongdomains)s")
errcode
由于条件匹配,例如代码的情况,这将匹配指定的任何“坏”代码或错误域200
。
在哪里:
(?:(?P<err>%(errcode)s)|\d+)
- 匹配指定的错误代码(例如 403 并将其存储为命名组err
)或任何其他代码(例如 200);(?(err)...A...|...B...)
- 如果条件表达式与子表达式 A 匹配,则与err
上述表达式匹配(仅为错误代码,因为这里 A 为空),否则匹配子表达式 B(错误的子域)。(?!(?:%(allowedsubdomains)s)?\.)(?:[^\."]+\.){2,}[^\."]+
- 由于负向前瞻(?!...)
和(?:[^\."]+\.){2,}[^\."]+
某些类似 zzz.xxx.yyy 的情况,匹配除以允许的子域开头的字符串之外的任何内容。
但最好在网络服务器端限制域名并禁止任何对非法域名的请求。
在这种情况下,过滤器可能是这样的:
[Definition]
datepattern = ^\S+ \S+ \S+( \[{DATE}\])
errcode = (?!401)[45]\d\d
failregex = ^<ADDR> \S+ \S+ "[A-Z]+ /[^"]*" %(errcode)s\b