Fail2ban

fail2ban 忽略 IP DNS 主機範例?

  • May 13, 2020

我想將“.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.

通過查看使用“ignoreip”值的 Python 腳本嘗試對這樣的名稱進行萬用字元匹配是行不通的,它需要是 IP/網路或解析為 IP 的名稱。

如果“googlebot.com”字元串在日誌中,也許使用“ignoreregex”代替會完成這項工作?命令和用法在這裡列出:http: //www.fail2ban.org/wiki/index.php/Commands#JAIL_CONFIGURATION

我的日誌文件只有 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 中:

ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>

就我而言,我把這條線放在 ssh 和 sshd 監獄裡:

[sshd]

ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>

[ssh]

ignorecommand = %(ignorecommands_dir)s/ignorehost <ip>
  1. 重新載入fail2ban

systemctl reload fail2ban.service

引用自:https://serverfault.com/questions/561088