我想将“.googlebot.com”添加到 fail2ban 的忽略 iplist,因为 ignoreip 说明提到 DNS 主机是可接受的输入。这是正确的格式吗?
# "ignoreip" can be an IP address, a CIDR mask or a DNS host. Fail2ban will not
# ban a host which matches an address in this list. Several addresses can be
# defined using space separator.
答案1
从查看使用“ignoreip”值的 Python 脚本来看,尝试对这样的名称进行通配符匹配是行不通的,它需要是一个 IP/网络或一个可以解析为 IP 的名称。
如果日志中有“googlebot.com”字符串,那么使用“ignoreregex”是否可行?命令和用法列在此处:http://www.fail2ban.org/wiki/index.php/Commands#JAIL_CONFIGURATION
答案2
我的日志文件只有 IP 号码(没有域名),所以ignoreregex
对我来说不起作用。
我将在这里发布我所做的事情,希望对那些尝试做类似事情的人有用。这是在 Ubuntu 18.04 上使用 Fail2Ban v0.10.2 完成的。
- 创建一个脚本,该脚本接受 IP 号码,执行反向 DNS 查找,并检查主机名是否在允许的域名中。将该脚本放入 /etc/fail2ban/filter.d/ignorecommands。我将该脚本命名为
ignorehost
。
#!/usr/bin/env fail2ban-python
# Inspired by apache-fakegooglebot script
#
# Written in Python to reuse built-in Python batteries and not depend on
# presence of host and cut commands
#
import sys
import re
from fail2ban.server.ipdns import DNSUtils, IPAddr
ALLOWED_HOSTS = [
".phlapa.fios.verizon.net",
".nwrknj.fios.verizon.net",
".hsd1.de.comcast.net",
".hsd1.pa.comcast.net"]
def process_args(argv):
if len(argv) != 2:
raise ValueError("Please provide a single IP as an argument. Got: %s\n"
% (argv[1:]))
ip = argv[1]
if not IPAddr(ip).isValid:
raise ValueError("Argument must be a single valid IP. Got: %s\n"
% ip)
print("Ip received!")
return ip
def is_allowed_host(ip):
host = DNSUtils.ipToName(ip)
if not host:
return False
else:
m = re.match('.\S+(-\d+)(?P<domain>\.\S+)', host)
domain = m.group('domain')
if domain in ALLOWED_HOSTS:
return True
else:
return False
if __name__ == '__main__': # pragma: no cover
try:
ret = is_allowed_host(process_args(sys.argv))
except ValueError as e:
sys.stderr.write(str(e))
sys.exit(2)
sys.exit(0 if ret else 1)
- 在 /etc/fail2ban/jail.local 中将此行添加到所需的 jail:
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
就我而言,我将该行放在 ssh 和 sshd jails 中:
[sshd]
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
[ssh]
ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
- 重新加载fail2ban
systemctl reload fail2ban.service
答案3
更好的解决方案是在过滤器配置文件中添加 ignoreregex 行:
ignoreregex = ^<HOST> -.*"GET.*HTTP.*Googlebot/2\.1.*"$
它将忽略 Googlebot。如果您使用的是 Apache,请务必检查access.log
而不是。error.log