Unix 命令(和 bash 别名)或脚本可在 Fail2ban 中绑定/取消禁止 IP 地址,而无需查找和指定“监狱名称”

Unix 命令(和 bash 别名)或脚本可在 Fail2ban 中绑定/取消禁止 IP 地址,而无需查找和指定“监狱名称”

我正在创建一个 bash 别名(或者可能是一个脚本),以在 Ubuntu 20.04 上使用fail2ban 禁止和取消禁止 IP 地址。

狂欢句法我正在习惯解除禁令IP 地址是:

fail2ban-client set YOURJAILNAMEHERE unbanip IPADDRESSHERE

句法我习惯于禁止IP 地址是:

fail2ban-client set YOURJAILNAMEHERE banip IPADDRESSHERE

所以我对应的bash别名语法为了解禁IP 地址将是:

alias unbanip='sudo fail2ban-client set YOURJAILNAMEHERE unbanip'

和我相应的 bash别名语法为了禁止IP 地址将是:

alias banip='sudo fail2ban-client set YOURJAILNAMEHERE banip'

然后,实际的巴什别名为了解禁IP 地址将是:

alias unbanip='sudo fail2ban-client set sshd unbanip'

实际的巴什别名语法为禁止IP 地址将是:

alias banip='sudo fail2ban-client set sshd banip'

生成的实际 bash 命令(使用别名)将如下所示:

# Unban a specific IP
unbanip 123.456.78.90

# Ban a specific IP
banip 123.456.78.90

所有这一切的问题在于,您无法真正创建真正的命令或 bash 别名来直接禁止指定的 IP,因为:

1)解封时,首先要查找对应的封禁ip的jail,并将该jail输入到bash命令中。

2)对于禁止,您必须在一个命令中指定所有监狱,以禁止所有监狱中的某个 IP。

我想做的是

1)提出一个用于禁止 IP 的命令(无需指定监狱),该命令会自动禁止所有监狱中的 IP,并且

2)提出一个命令来解除 IP 禁令,而无需查找该 IP 禁令属于哪个监狱。本质上,unban 命令会查找指定 IP 属于哪个监狱,然后自动将其输入到语法的 YOURJAILNAMEHERE 部分,以查找一个或多个监狱。

任何人都有一些 bash 技能,可能能够想出一个命令(带有相应的 bash 别名)或脚本来执行此操作?任何帮助深表感谢!

答案1

对于fail2ban的现代版本(例如v0.11.2),您可以解除禁令一个或多个 IP,但不知道哪个监狱产生了禁令:

fail2ban-client unban <IP> ... <IP>

Fail2ban 本身不能发起禁令跨所有监狱的 IP 数量,主要是因为这通常是不可取的(即假设所有监狱的操作是封锁所有端口的 IP 禁令,一次禁令就足够了)。但是您可以创建一个小 bash 脚本,它使用循环来执行此操作,如下所示:

#!/bin/bash
# Fail2ban All-Jail IP Banner
if [[ -z $1 || $1 == "-h" ]]; then
  echo "$(basename "$0"): Fail2ban All-Jail IP Banner"
  echo "Usage: $(basename "$0") <IP> ... <IP>"
  echo "Advisory: this immediately bans the specified IPs across all fail2ban jails - use with care!"
  exit 0
fi
while read -r JAIL; do
  echo -n "$JAIL banning IP(s): "
  fail2ban-client set $JAIL banip $*
done < <(fail2ban-client status|sed -n '/Jail list:/{s/^.*list:\s*//;s/, /\n/g;p}')

相关内容