如何用 CentOS 7的 Fail2Ban 保护 SSH

1.安装Fail2Ban

1.1 从源安装

由于CentOS没有内置Fail2Ban的源,因此我们要先安装EPEL存储库。
注意要root身份下运行

yum install epel-release

备注:宝塔面板默认安装好了EPEL源,可以不用安装这个。直接按下述命令安装Fail2Ban即可。

随后安装Fail2Ban,【centos源的fail2ban版本会偏低一点,vo.9.7】

yum install fail2ban fail2ban-systemd

1.2 从github安装/更新

项目下载地址:

https://github.com/fail2ban/fail2ban/releases

安装命令

#从github下载相应版本
wget  
#解压
tar -xf 0.10.4.tar.gz
#进入解压目录
cd fail2ban-0.10.4
#安装python setup.py install

2.运行Fail2Ban服务并设置开机自启

systemctl enable fail2ban
systemctl start fail2ban

3.配置Fail2Ban

安装成功后Fail2ban配置文件位于

/etc/fail2ban

其中jail.conf为主配置文件,相关的匹配规则位于filter.d目录

开始配置文件

  • 下述的操作用web管理面板操作其实更简单,如宝塔面板等,直接用面板的文件管理器手动编辑文件就行了,就像是平常在Windows下用记事本软件编辑文档,我超喜欢用面板操作的,vi命令又不会,只能用面板操作度日这样子。

默认的Fail2Ban配置文件位于

/etc/fail2ban/jail.conf

里面有一些默认的配规则,但是Fail2Ban升级之后会将其覆盖掉,所以我们要新建一个配置文件来保证配置不会被因为Fail2Ban升级而丢失【该文件可覆盖主配置文件的设置】。

我们需要新建一个名为jail.local的文件,以便Fail2Ban找到它。
操作如下:

#新建配置文件,面板操作则直接在指定位置新建指定文件vi /etc/fail2ban/jail.local#默认配置,面板操作则直接复制粘贴后按需修改[DEFAULT]
ignoreip = 127.0.0.1/8
bantime  = 86400
findtime = 600
maxretry = 5#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写banaction = firewallcmd-ipset
action = %(action_mwl)s

上面配置规则的说明,按需修改

  • ignoreip:IP白名单,白名单中的IP不会屏蔽,可填写多个以(,)分隔

  • bantime:屏蔽时间,单位为秒(s)

  • findtime:时间范围

  • maxretry:最大次数

  • banaction:屏蔽IP所使用的方法,上面使用firewalld屏蔽端口


  • 注意:使用Fail2Ban时,要把自己的IP加入白名单,动态IP的可以绑定一个白名单域名,防止自己由于某些测试操作达成成就“我Ban我自己”,而连不上服务器。

防止SSH爆破

继续修改

jail.local

这个配置文件,在后面继续加入如下内容:

[sshd]
enabled = truefilter  = sshd
port    = 22
action = %(action_mwl)s
logpath = /var/log/secure

上面规则的说明,按需修改

  • [sshd]:名称,可以随便填写

  • filter:规则名称,必须填写位于filter.d目录里面的规则,sshd是fail2ban内置规则

  • port:对应的端口

  • action:采取的行动

  • logpath:需要监视的日志路径

Nginx防止CC攻击

下述操作换成用面板进行还是照样新建文件>>复制粘贴即可。

#需要先新建一个nginx日志匹配规则,面板操作直接在文件夹下,新建指定文件vi /etc/fail2ban/filter.d/nginx-cc.conf#填写如下内容,面板操作则直接复制粘贴[Definition]
failregex = <HOST> -.*- .*HTTP/1.* .* .*$
ignoreregex =

然后再打开jail.local文件
换成命令行操作就是

vi /etc/fail2ban/jail.local

在文件里添加如下内容【面板操作照样复制粘贴】:

[nginx-cc]
enabled = trueport = http,https
filter = nginx-cc
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

上述规则说明,按需修改

  • 上面的配置意思是如果在60s内,同一IP达到20次请求,则将这个IP Ban 1小时。logpathnginx日志路径。

防止WordPress爆破

如果分析日志发现有大量机器人在扫描wordpress登录页面wp-login.php,虽然对方可能没成功,但是为了避免万一还是将他IP干掉为好。

下述操作换成用面板进行还是照样新建文件>>复制粘贴即可

#需要先新建一个nginx日志匹配规则,面板操作直接在文件夹下,新建指定文件
vi /etc/fail2ban/filter.d/wordpress.conf
#填写如下内容,面板操作则直接复制粘贴[Definition]
failregex = ^<HOST> -.* /wp-login.php.* HTTP/1\.."
ignoreregex =

然后再打开jail.local文件
换成命令行操作就是

vi /etc/fail2ban/jail.local

在文件里添加如下内容【面板操作照样复制粘贴】:

[wordpress]
enabled = trueport = http,https
filter = wordpress
action = %(action_mwl)s
maxretry = 20
findtime = 60
bantime = 3600
logpath = /usr/local/nginx/logs/access.log

4.输入命令使配置生效

#重启Fail2Ban使其生效
systemctl restart fail2ban

Fail2Ban的常用命令

#查看当前版本
fail2ban-server -V
#启动fail2ban服务
systemctl start fail2ban
#停止systemctl stop fail2ban
#重启 systemctl restart fail2ban

#开机启动systemctl enable fail2ban

1. 查看指定 Jail 规则下被封禁的ip情况:
fail2ban-client status <JAIL>
2. 添加/解除指定 IP 的封禁:
fail2ban-client set <JAIL> banip/unbanip <IP>
3. 添加/解除指定 IP 的忽略:
fail2ban-client set <JAIL> addignoreip/delignoreip <IP>
4. 测试匹配规则是否正确:
fail2ban-regex <日志文件> <过滤规则>
5. 查看所有命令:
fail2ban-client -h
6. 查看日志:
tail /var/log/fail2ban.log

Fail2ban: 防SSH暴力破解的一键shell脚本


https://github.com/FunctionClub/Fail2ban


wget https://raw.githubusercontent.com/FunctionClub/Fail2ban/master/fail2ban.sh && bash fail2ban.sh 2>&1 | tee fail2ban.log
  1. 第一步选择是否修改SSH端口。

  2. 第二部输入最多尝试输入SSH连接密码的次数

  3. 第三部输入每个恶意IP的封禁时间(单位:小时)