fail2ban
可以监视你的系统日志,然后匹配日志的错误信息执行相应的屏蔽动作。网上大部分教程都是关于fail2ban
+iptables
组合,考虑到CentOS 7
已经自带Firewalld
,所以这里我们也可以利用fail2ban
+Firewalld
来防SSH或
vsftpd爆破。
准备工作
1、检查Firewalld是否启用
#如果您已经安装iptables建议先关闭
service iptables stop
#查看Firewalld状态
firewall-cmd --state
#启动firewalld
systemctl start firewalld
#设置开机启动
systemctl enable firewalld.service
启用Firewalld
后会禁止所有端口连接,SSH
端口(22
)示例,供参考:
#放行22端口
firewall-cmd --zone=public --add-port=80/tcp --permanent
#重载配置
firewall-cmd --reload
#查看已放行端口
firewall-cmd --zone=public --list-ports
安装fail2ban
#CentOS内置源并未包含fail2ban,需要先安装epel源
yum -y install epel-release
#安装fial2ban
yum -y install fail2ban
安装完成后,服务配置目录为:/etc/fail2ban
/etc/fail2ban/action.d #动作文件夹,内含默认文件。iptables以及mail等动作配置
/etc/fail2ban/fail2ban.conf #定义了fai2ban日志级别、日志位置及sock文件位置
/etc/fail2ban/filter.d #条件文件夹,内含默认文件。过滤日志关键内容设置
/etc/fail2ban/jail.conf #主要配置文件,模块化。主要设置启用ban动作的服务及动作阀值
/etc/rc.d/init.d/fail2ban #启动脚本文件
使用jail.local设定,覆盖默认配置
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
[DEFAULT] #全局设置
ignoreip = 127.0.0.1 #忽略的IP列表,多个IP以空格分割或IP段127.0.0.1/8不受设置限制(白名单)
bantime = 86400 #屏蔽时间,单位:秒
findtime = 600 #这个时间段内超过规定次数会被ban掉
maxretry = 5 #最大尝试次数
backend = auto #日志修改检测机制(gamin、polling和auto这三种)
#这里banaction必须用firewallcmd-ipset,这是fiewalll支持的关键,如果是用Iptables请不要这样填写
banaction = firewallcmd-ipset
action = %(action_mwl)s
[sshd]
enabled = true
filter = sshd
port = 22
action = %(action_mwl)s
sendmail-whois[name=sshd, dest=root, [email protected]]
logpath = /var/log/secure
bantime = 86400
findtime = 600
maxretry = 5
上面IP
,在10
分钟内,如果连续超过5
次错误,则使用Firewalld
将他IP ban
了。
fail2ban 重启验证
systemctl start fail2ban
查看iptables规则是否生效
iptables -nL --line-number(注意查看f2b-模块名sshd所在行)
使用另一台服务器不断尝试连接SSH
,并且不断的将密码输入错误,你会发现连续超过5
次后直接连不上,说明IP
被ban
了,可以输入:fail2ban-client status sshd
查看被ban
的IP
,如下截图。

常用命令
查看黑名单状态
fail2ban-client status sshd(模块名)
黑名单移除IP
fail2ban-client set sshd unbanip IP地址
过滤规则检查
fail2ban-regex 日志文件.log 规则文件../filter.d/sshd.conf
防火墙规则查看与清理
iptables -nL --line-number(注意查看f2b-模块名sshd所在行)
iptables -D f2b-sshd num(-D清理 防火墙模块名 编号)
vsftpd配置注意项
在之前开始使用fail2ban防止vsftpd或ssh暴力破解之后,有一定的效果,但在查看fail2ban.log日志时,发现一个问题:
fail2ban.filter : WARNING Unable to find a corresponding IP address for ns.rs996.com
我们再查看secure日志:
vsftpd: pam_unix(vsftpd:auth): authentication failure; logname= uid=0 euid=0 tty=ftp ruser=www.centos.bz rhost=ns.rs996.com
fail2ban是根
经过分析得出结论:vsftpd默认对客户端ip进行反向解析,如果查询有结果,则把ip解析出来的域名记录secure日志中的rhost中,但是此反向解析出来的域名,本身又没有作A记录的解析,所以fail2ban再进行此域名的解析时,当然就无法获取到IP地址,也就无法禁止此客户端的暴力破解行为。
解决方法:
在vsftpd.con
reverse_lookup_enable=NO
之后重启vsftpd即可。生效之后不仅解决了这个问题,也使得登录vsftpd不再停顿几秒了。
但是/var/log/secure里记录ftp登录失败有一个缺点,就是用相同的用户名,不同的密码登录多次,只是记录首次失败的信息,而之后的就只显示:last message repeated x times这样的信息,无法满足登录失败三次的条件,所以就不能阻止此暴力破解,下面是解决这个问题的方法:
1、打开vsftpd.conf,添加如下代码:
dual_log_enable=YES
use_localtime=YES
2、打开/etc/fail2ban/jail.local,修改以下内容:
[vsftpd-iptables]
...
logpath = /var/log/vsftpd.log
...
注:
1.重启iptables 后需要重启fail2ban ,以此重新加载fail2ban黑名单规则到iptables,不然iptables规则为空;
2.原理:匹配到规则后先将IP加入黑名单—-再加入防火墙规则中;若防火墙规则已经删除,未清理黑名单,再次触发则不会加入防火墙
参考文献
https://github.com/fail2ban/fail2ban
https://www.fail2ban.org/