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 的一个前端。