我正在创建一个 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}')