Fail2Ban - 如何防止我的 ISP IP 动态被禁止?

Fail2Ban - 如何防止我的 ISP IP 动态被禁止?

我刚刚安装了Fail2Ban。

我想将我的 ISP IP 添加到我的忽略列表中,但我的 IP 是动态的。

在 jail.conf 文件中,我有如下内容:

[DEFAULT]

# "ignoreip" can be an IP address, a CIDR mask or a DNS host
ignoreip = 127.0.0.1
bantime  = 600
maxretry = 3

我的 DNS 看起来像这样:12-123-112-223.zone6.myISPName.co.uk

是否可以将 DNS wild 添加到忽略列表?例如,*.myISPName.co.uk

答案1

fail2ban 不允许您使用通配符地址。
您有几种可能:
1. 对要排除的地址使用动态 DNS
2. 为 iptable 编写接受规则,在 fail2ban 规则之前执行
3. 只需配置 fail2ban

如何配置 fail2ban 以忽略您的地址?
里面/etc/fail2ban/filter.d/有预制的过滤器。您的规则已经使用其中的一个(例如filter = sshd使用 sshd 过滤器)。
只需修改您想要的过滤器(或修改副本)即可添加“排除”规则。
排除规则以 开头ignoreregex。它们的编写方式与“匹配”规则完全相同。请查看man fail2ban-regex
对于您的示例,您只需添加ignoreregex .myISPName.co.uk所需的过滤器即可。
但这也会保护来自同一 ISP 的任何攻击者。

答案2

我的日志文件只有 IP 号码(没有域名),所以ignoreregex对我来说不起作用。

我将在这里发布我所做的事情,希望对那些尝试做类似事情的人有用。这是在 Ubuntu 18.04 上使用 Fail2Ban v0.10.2 完成的。

  1. 创建一个脚本,该脚本接受 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)
  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>
  1. 重新加载fail2ban

systemctl reload fail2ban.service

答案3

在 /usr/local/bin/userip 中创建一个简单的脚本

#!/bin/sh
if [ ! -z $1 ]; then
    who --ips | grep ^$1 | rev | cut -d' ' -f1 | rev | tail -n1
fi

获取登录用户名的 IP 地址作为第一个参数传递

编辑 /etc/fail2ban/action.d/iptables-multiport.conf (或 iptables.conf)

actionban = [ ''$(userip YOURUSER) != '<ip>' ] && iptables -I fail2ban-<name> 1 -s <ip> -j DROP

现在 fail2ban 不会阻止你的 IP 地址,直到你使用你的用户名 YOURUSER 通过 ssh 登录

相关内容