大多数 Linux 服务器通过端口 22 提供 SSH 登录,用于远程管理。这个端口是一个众所周知的端口,所以经常受到暴力袭击。Fail2ban 的服务可以通过创建规则来缓解这个问题,这些规则会根据预定义次数的不成功登录尝试自动更改您的 iptables 防火墙配置。这将允许您的服务器响应非法访问尝试,而无需您的干预。
Fail2ban 可以根据登录失败次数,自动在防火墙的 iptables 添加一条规则,防止恶意登录。下面,我们将介绍如何在 CentOS 7 服务器上安装和使用 Fail2ban。
安装 Fail2ban
Fail2ban 不在官方软件包仓库中,它在 EPEL 中(Extra Packages for Enterprise Linux)。
安装 epel-release:
sudo yum install epel-release
安装 Fail2ban:
sudo yum install fail2ban
安装完成之后,启用 Fail2ban:
sudo systemctl enable fail2ban
配置 Fail2ban
Fail2ban 服务的配置文件在 /etc/fail2ban
目录。在其中可以找到 jail.conf
配置文件,我不会直接编辑这个文件,因为在升级软件包时,会覆盖这个文件,使配置失效。我们应该创建一个新文件 jail.local
,在jail.local
定义的值会覆盖 jail.conf
中的值。
我们来创建一个 jail.local
文件:
vim /etc/fail2ban/jail.local
写入如下代码:
[DEFAULT]
# 禁止一个 IP 一小时
bantime = 3600
# 覆写 /etc/fail2ban/jail.d/00-firewalld.conf:
banaction = iptables-multiport
[sshd]
enabled = true
上面覆写了三个配置,bantime,使用 iptables,开启 sshd。
配置完成之后,重启 fail2ban:
sudo systemctl restart fail2ban
查询 fail2ban 服务状态:
sudo fail2ban-client status
查询某个 jail 的详细信息:
fail2ban-client status sshd
探索其他设置
上面定义的 jail.local
是最初始的配置,还有很多其他配置选项。打开 jail.conf
文件,看看更多选项。
实用命令
最近一次启动,fail2ban 日志:
journalctl -b -u fail2ban
实时跟踪显示 fail2ban 日志(按 Ctrl- C 退出):
tail -F /var/log/fail2ban.log
显示防火墙规则:
iptables -L
显示防火墙规则对应的命令:
iptables -S
fail2ban 从黑名单(ban list)中移除 IP 的方法:
fail2ban-client set sshd unbanip 1.1.1.1
此时再查看 banlist 会发现 IP 已移除。
fail2ban-client status sshd
跟踪失败的登录条目:
以下命令用于检查是否通过 ssh 端口尝试登录服务器失败。
cat /var/log/secure | grep 'Failed password'
执行上述命令将得到来自不同 IP 地址的根密码尝试失败的列表。结果的格式与下面所示的相似:
Fer 8 12:41:12 htf sshd[5487]: Failed password for root from 1.1.1.1 port 23021 ssh2
Fer 8 12:41:15 htf sshd[1254]: Failed password for root from 1.1.1.1 port 15486 ssh2
Fer 8 12:41:16 htf sshd[1254]: Failed password for root from 1.1.1.1 port 24457 ssh2
Fer 8 12:41:18 htf sshd[1254]: Failed password for root from 1.1.1.1 port 24457 ssh2
通过 Fail2Ban 检查被禁止的 IP:
iptables -L
-n