虽然SSH作为连接服务器的协议是非常安全的,但是一直暴露在公网中的SSH端口可能会遭受hacker的暴力破解。任何公网上的服务器都是潜在的被攻击对象。

Fail2ban是一个开源的入侵保护框架,它会监控对应的系统日志,并根据检测的可疑行为从而厨房相应的防御动作。Fail2ban可疑根据SSH登陆错误次数,在防火墙iptables中临时增加一条规则,从而防止恶意登陆,达到恶意登陆的目的。

CentOS 7 安装Fail2ban

因为 Fail2ban 在 EPLE (Extra Packages for Enterprise Linux)中不在官方软件仓库中,所以需要先安装 eple-release

1
2
yum update
yum install epel-release

安装 Fail2ban

1
yum install fail2ban

安装完成后启动 Fail2ban

1
systemctl enable fail2ban

设置 Fail2ban 开机启动

CentOS/RHEL 6:

1
sudo chkconfig fail2ban on

Fedora 或 CentOS/RHEL 7:

1
sudo systemctl enable fail2ban

配置 Fail2ban

Fail2ban 的配置文件是 /etc/fail2ban/jail.conf,可以通过配置该文件创建自己的拦截规则。但是因为在升级软件包的过程中会覆盖掉这个文件,所以建议新建一个/etc/fail2ban/jail.local文件而非直接编辑默认配置文件。

1
vim /etc/fail2ban/jail.local

写入如下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[DEFAULT]

#### 以空格分隔的列表,可以是 IP 地址、CIDR 前缀或者 DNS 主机名
#### 用于指定哪些地址可以忽略 fail2ban 防御
ignoreip = 127.0.0.1 172.31.0.0/24 10.10.0.0/24 192.168.0.0/24

#### 客户端主机被禁止的时长(秒)
bantime = 86400

#### 客户端主机被禁止前允许失败的最大次数
maxretry = 5

#### 查找失败次数的时长(秒)
findtime = 600

#### 覆写 `/etc/fail2ban/jail.d/00-firewalld.conf`
banaction = iptables-multiport

#### 开启sshd

[sshd]
enabled = true

重启 Fail2ban

1
systemctl restart fail2ban

查看 Fail2ban 状态

1
2
3
4
5
# fail2ban-client status

Status
|- Number of jail: 1
`- Jail list: sshd

验证 Fail2ban 运行正常,通过 ping 参数运行 fail2ban-client 命令。如果 Fail2ban 正常,则如下所示:

1
2
# sudo fail2ban-client ping
Server replied: pong

查询某个特定 jail 的状态

1
2
3
4
5
6
7
8
9
10
#### sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 6
| |- Total failed: 12
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 1
|- Total banned: 1
`- Banned IP list: 8.8.8.8 #被屏蔽的IP

如果错误的屏蔽了某个 IP 可以使用下列命令:

1
# sudo fail2ban-client set ssh-iptables unbanip 8.8.8.8

Fail2ban 其它命令:

1
2
3
4
5
6
7
8
#### 最近一次启动日志
journalctl -b -u fail2ban

#### fail2ban日志
tail -F /var/log/fail2ban.log

#### 显示防火墙规则
iptables -L -n

Fail2ban 不仅可以屏蔽 SSH 暴力破解,还可应用于 Web 服务器、SMTP、FTP、DNS 等服务器监控。