关于 CentOS7 上 fail2ban 的几点补充

1、日志文件不读取

CentOS7 上的 fail2ban 默认情况下的设置 logpath = /var/log/secure 无效,因为日志是从哪里读取依赖于 backend 的设置,默认设的是 backend=systemd,并不读取 /var/log/secure 日志文件,需改为 backend=auto 才可。这可以通过 fail2ban-client status sshd 的显示结果来判断,Filter 里如果有

Journal matches:  _SYSTEMD_UNIT=sshd.service + _COMM=sshd

说明用的就是 systemd;如果用的是日志文件会显示

File list:        /var/log/secure

也可以通过如下两条命令查看

fail2ban-client  get sshd journalmatch
fail2ban-client  get sshd logpath

若用的是 systemd,则两行的结果分别为

_SYSTEMD_UNIT=sshd.service + _COMM=sshd
No file is currently monitored

若用的是日志文件,则两行的结果分别为

No journal match filter set
Current monitored log file(s):
`- /var/log/secure

2、firewalld 防火墙

CentOS7 下默认用的是 firewalld 防火墙,本来 sshd.conf 中指定了 action = firewallcmd-allports,结果发现并不管用,虽然 fail2ban-client status sshd 看有 IP 被禁,但其实并没有加入防火墙。yum 装 fail2ban 时注意到自动装了 fail2ban-firewalld 这个包,查看其内容发现只有一个文件,即 /etc/fail2ban/jail.d/00-firewalld.conf,其内容恰是定义 firewalld 防火墙的操作。我计划是禁所有端口,参照该文件里的内容,直接在 sshd.conf 中把 action = firewallcmd-allports 改成如下二者之一都行。

banaction_allports = firewallcmd-rich-rules[actiontype=<allports>]
action = firewallcmd-rich-rules[actiontype=<allports>]

不过需注意,修改 sshd.conf 后如果只执行 fail2ban-client reload 好像并不生效,必须执行 fail2ban-client restart 后才生效。

3、测试

出于测试目的,我在 jail.d/sshd.conf 中设置了如下两行用于使用日志文件,且日志中有登录失败的 IP。

backend=auto`
logpath = /var/log/secure

想着先通过 fail2ban-client unban --all 解除所有封禁,然后 fail2ban-client restart 期待着重新从日志中读取 IP 并封禁,查看防火墙操作是否生效。然而结果却是并没有从日志中获取 IP,也没有封禁任何 IP。后来我发现 fail2ban 好像是通过监测日志文件的变化来读取它,只是重启 fail2ban 并不会重新封禁,但如果我用 vi 修改了 /var/log/secure 比如加了一个空行并保持,这样 fail2ban 就会读取日志了,成功封禁了 IP,也加进了防火墙,可通过 firewall-cmd --list-all 查看,其实相应 IP 也加进了 iptables,好像 CentOS7 上 firewalld 只是 iptables 的一个前端。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容