如何使用fail2ban显示所有被禁止的IP?

Dar*_*ber 79 fail2ban

当我运行这个命令时,fail2ban-client status sshd我得到了这个:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 1
|  |- Total failed:     81
|  `- File list:        /var/log/auth.log
`- Actions
   |- Currently banned: 2
   |- Total banned:     8
   `- Banned IP list:   218.65.30.61 116.31.116.7
Run Code Online (Sandbox Code Playgroud)

它只在禁用 IP 列表中显示两个 IP,而不是像 Total Banned 所说的那样显示 8 个。

当我这样做时,tail -f /var/log/auth.log我得到了这个:

Mar 29 11:08:40 DBSERVER sshd[29163]: error: maximum authentication attempts exceeded for root from 218.65.30.61 port 50935 ssh2 [preauth]
Mar 29 11:08:40 DBSERVER sshd[29163]: Disconnecting: Too many authentication failures [preauth]
Mar 29 11:08:40 DBSERVER sshd[29163]: PAM 5 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.65.30.61  user=root
Mar 29 11:08:40 DBSERVER sshd[29163]: PAM service(sshd) ignoring max retries; 6 > 3
Mar 29 11:08:44 DBSERVER sshd[29165]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=218.65.30.61  user=root
Mar 29 11:08:46 DBSERVER sshd[29165]: Failed password for root from 218.65.30.61 port 11857 ssh2
Mar 29 11:09:01 DBSERVER CRON[29172]: pam_unix(cron:session): session opened for user root by (uid=0)
Mar 29 11:09:01 DBSERVER CRON[29172]: pam_unix(cron:session): session closed for user root
Mar 29 11:10:01 DBSERVER CRON[29226]: pam_unix(cron:session): session opened for user root by (uid=0)
Mar 29 11:10:02 DBSERVER CRON[29226]: pam_unix(cron:session): session closed for user root
Mar 29 11:10:18 DBSERVER sshd[29238]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=113.122.43.185  user=root
Mar 29 11:10:20 DBSERVER sshd[29238]: Failed password for root from 113.122.43.185 port 46017 ssh2
Mar 29 11:10:33 DBSERVER sshd[29238]: message repeated 5 times: [ Failed password for root from 113.122.43.185 port 46017 ssh2]
Mar 29 11:10:33 DBSERVER sshd[29238]: error: maximum authentication attempts exceeded for root from 113.122.43.185 port 46017 ssh2 [preauth]
Mar 29 11:10:33 DBSERVER sshd[29238]: Disconnecting: Too many authentication failures [preauth]
Mar 29 11:10:33 DBSERVER sshd[29238]: PAM 5 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=113.122.43.185  user=root
Mar 29 11:10:33 DBSERVER sshd[29238]: PAM service(sshd) ignoring max retries; 6 > 3
Mar 29 11:11:36 DBSERVER sshd[29245]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.7  user=root
Mar 29 11:11:38 DBSERVER sshd[29245]: Failed password for root from 116.31.116.7 port 24892 ssh2
Mar 29 11:11:43 DBSERVER sshd[29245]: message repeated 2 times: [ Failed password for root from 116.31.116.7 port 24892 ssh2]
Mar 29 11:11:43 DBSERVER sshd[29245]: Received disconnect from 116.31.116.7 port 24892:11:  [preauth]
Mar 29 11:11:43 DBSERVER sshd[29245]: Disconnected from 116.31.116.7 port 24892 [preauth]
Mar 29 11:11:43 DBSERVER sshd[29245]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.7  user=root
Mar 29 11:12:39 DBSERVER sshd[29247]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.7  user=root
Mar 29 11:12:41 DBSERVER sshd[29247]: Failed password for root from 116.31.116.7 port 26739 ssh2
Mar 29 11:12:45 DBSERVER sshd[29247]: message repeated 2 times: [ Failed password for root from 116.31.116.7 port 26739 ssh2]
Mar 29 11:12:45 DBSERVER sshd[29247]: Received disconnect from 116.31.116.7 port 26739:11:  [preauth]
Mar 29 11:12:45 DBSERVER sshd[29247]: Disconnected from 116.31.116.7 port 26739 [preauth]
Mar 29 11:12:45 DBSERVER sshd[29247]: PAM 2 more authentication failures; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.7  user=root
Mar 29 11:13:41 DBSERVER sshd[29249]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=116.31.116.7  user=root
Mar 29 11:13:43 DBSERVER sshd[29249]: Failed password for root from 116.31.116.7 port 27040 ssh2
Run Code Online (Sandbox Code Playgroud)

被禁IP还在尝试中。

但是,当我检查时,sudo iptables -L INPUT -v -n我得到了这个:

Chain INPUT (policy ACCEPT 228 packets, 18000 bytes)
 pkts bytes target     prot opt in     out     source               destination
 6050  435K f2b-sshd   tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            multiport dports 22
Run Code Online (Sandbox Code Playgroud)

我在这里做错了什么?

如何显示所有禁止的 IP 列表?

小智 45

请记住,fail2ban 禁止 IP 本质上是暂时的。

查看已被阻止的 IP 的完整列表的最佳方法是检查日志文件:

sudo zgrep 'Ban' /var/log/fail2ban.log*
Run Code Online (Sandbox Code Playgroud)

编辑:此答案以前搜索过'Ban:',但即使在 2013 年,来源也没有冒号 ( ref )。

以下命令还可以为您提供干净的输入规则列表:

sudo iptables -L INPUT -v -n | less
Run Code Online (Sandbox Code Playgroud)

  • 我的日志文件中没有冒号(因此需要调整 grep)。尽管如此,作为评论而不是编辑留下,因为我不知道这是多么普遍/如果这是最近的变化。 (10认同)
  • 删除搜索词 'Ban' 后的 ':',因为 ':' 不再写入日志文件中。因此,您将能够使用上述命令再次查看被阻止的 IP。 (2认同)

小智 22

与上面的NA AE类似,包括kwaa的评论,这列出了所有 IP:

sudo zgrep 'Ban' /var/log/fail2ban.log*
Run Code Online (Sandbox Code Playgroud)

但是那个输出有很多行。这会计算所有已记录的禁止(并且可能未禁止)的 ip 的行数:

sudo zgrep 'Ban' /var/log/fail2ban.log* | wc -l
Run Code Online (Sandbox Code Playgroud)

上述命令的输出(带行数)应与 fail2ban 状态输出中的“Total Banned”计数相匹配:

fail2ban-client status sshd
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 18.04.1 LTS 中测试。

我从 'wc -l' 行的输出:

7244
Run Code Online (Sandbox Code Playgroud)

而从fail2ban的状态,同样验证了7244号:

Status for the jail: sshd
|- Filter
|  |- Currently failed: 7
|  |- Total failed: 49457
|  `- File list:    /var/log/auth.log
`- Actions
   |- Currently banned: 9
   |- Total banned: 7244
   `- Banned IP list:   [...]
Run Code Online (Sandbox Code Playgroud)


Vel*_*les 13

banned命令(v0.11.2):

fail2ban-client banned
Run Code Online (Sandbox Code Playgroud)

示例输出:

[{'sshd': []}, {'apache-badbots': []}, {'apache-auth': ['XXX.24.23.164', 'XXX.155.205.108', 'XXX.62.130. 158']}]

  • 我收到以下错误:`[8760]:错误 NOK:('无效命令',)无效命令` (4认同)
  • 我尝试使用 v0.11.1 并得到无效命令,所以看来这样的命令是在 v0.11.2 中引入的 (2认同)

小智 12

查看完整的 iptables 行:

sudo iptables -L -n | awk '$1=="REJECT" && $4!="0.0.0.0/0"'
Run Code Online (Sandbox Code Playgroud)

仅查看 IP 地址:

sudo iptables -L -n | awk '$1=="REJECT" && $4!="0.0.0.0/0" {print $4}'
Run Code Online (Sandbox Code Playgroud)

根据您的情况,您可以通过“DROP”更改“REJECT”。


Fak*_*aka 10

您可以使用sqlite3命令通过查询数据库bips表来进行一些统计/var/lib/fail2ban/fail2ban.sqlite3(如果您的fail2ban版本 < v0.11.1,请更改bipsbans)。

显示所有 IP 地址及其监狱:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select ip,jail from bips"
Run Code Online (Sandbox Code Playgroud)

显示所有唯一的 IP 地址:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select distinct ip from bips"
Run Code Online (Sandbox Code Playgroud)

显示sshd监狱中所有唯一的 IP 地址:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select distinct ip from bips where jail='sshd'"
Run Code Online (Sandbox Code Playgroud)

显示所有监狱中前 20 个最受禁止的 IP 地址:

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 "select jail,ip,count(*) as count from bips group by ip order by count desc limit 20"
Run Code Online (Sandbox Code Playgroud)

如果您想在 GUI 应用程序中查看此文件的结构和所有数据,我建议使用DB Browser For Sqlite.


从版本开始v0.11.1,fail2ban 改变了它的数据库结构。我在我的 Linux 机器上运行这个命令,看看有什么区别(Fail2Ban v0.11.1,Ubuntu 20.04

sqlite3 /var/lib/fail2ban/fail2ban.sqlite3 '.schema'
Run Code Online (Sandbox Code Playgroud)

部分输出是:

CREATE TABLE bans(jail TEXT NOT NULL, ip TEXT, timeofban INTEGER NOT NULL, bantime INTEGER NOT NULL, bancount INTEGER NOT NULL default 1, data JSON, FOREIGN KEY(jail) REFERENCES jails(name) );
CREATE TABLE bips(ip TEXT NOT NULL, jail TEXT NOT NULL, timeofban INTEGER NOT NULL, bantime INTEGER NOT NULL, bancount INTEGER NOT NULL default 1, data JSON, PRIMARY KEY(ip, jail), FOREIGN KEY(jail) REFERENCES jails(name) );
Run Code Online (Sandbox Code Playgroud)

  • 现在是`SELECT jail,ip,timeofban FROM bans`(2020 年10 月),如果你想跳过包含匹配完整日志的`data` 字段。 (2认同)

小智 8

仅供参考:

  • “被禁止的总数”是该监狱被禁止的 IP 总数(可能已经被取消禁止)。
  • “目前被禁止”是该监狱目前被禁止的唯一 IP(IP 列表证实了这一点)。

希望有帮助。


gst*_*uis 5

如果您想查看禁用 IP 的列表及其超时(超时到期,它们将从禁用池中删除),您可以使用:

ipset list
Run Code Online (Sandbox Code Playgroud)


小智 5

'刚刚完成更新我的配置以应对 ssh 攻击。

这就是我如何查看被禁止的 IP 及其过期时间,并验证禁令是否到位。我在 Debian 11.2 上使用 Fail2Ban v0.11.2。

> fail2ban-client get sshd banip --with-time
45.9.20.73  2022-02-21 23:56:35 + 3456000 = 2022-04-02 23:56:35

> iptables -L f2b-sshd
Chain f2b-sshd (1 references)
target     prot opt source               destination         
REJECT     all  --  45.9.20.73           anywhere             reject-with icmp-port-unreachable
RETURN     all  --  anywhere             anywhere
Run Code Online (Sandbox Code Playgroud)