一、简介
Fail2Ban是一款入侵防御工具,可以在一定程度上保护服务器免受ssh暴力破解、 ftp/http密码穷举等场景的攻击,它通过使用指定的正则表达式(也称为过滤规则)进行扫描日志文件(/var/log),并根据配置信息来封禁多次访问失败的IP。Fail2Ban封禁IP主要通过向Linux内的防火墙中更新规则来实现
github项目地址: https://github.com/fail2ban/fail2ban
二、安装
RHEL/Rocky/CentOS
# yum install -y fail2ban # systemctl start fail2ban # systemctl enable fail2ban
Ubuntu/Debian
# sudo apt install -y fail2ban
三、修改配置
1、Fail2Ban的配置文件默认都在 /etc/fail2ban/目录里:jail.conf与fail2ban.conf,升级Fail2Ban时,文件会被覆盖。如果需要修改配置文件,建议是复制出来一份local文件进行修改或者创建一个新的 jail.local 文件,并且Fail2Ban启动时会自动读取conf和local文件,local文件的优先级更高。
# cd /etc/fail2ban # cp jail.conf jail.local # cp fail2ban.conf fail2ban.local
2、jail.local配置详解
[DEFAULT]模块:是Fail2Ban的全局模块, 对所有服务模块生效,当然也可以在具体的服务模块下添加参数,局部变量优先级大于全局变量
[DEFAULT] #此参数为加白的网段、IP,可以是域名、网段或单个IP,空格隔开。 ignoreip = 127.0.0.1/8 #设置被封锁的时间间隔,如下表示10分钟,可以是秒(s)、分钟(m)、小时(h)、天(d),不带单位则默认为s,-1表示永久封锁。 bantime = 10m #检测的间隔时间,在间隔时间内,当>=maxtretry设置的失败次数,则触发限制,禁止访问。 findtime = 10m #findtime时间内的最大失败次数 maxretry = 5 #需要采取的行动,和当前系统使用的防火墙相关 banaction = firewallcmd-ipset
注:填写 banaction时 需要确定当前的系统上安装了什么防火墙或安全软件,linux上通常是 iptables, firewalld, ufw这三个工具, 可以通过查看 /etc/fail2ban/action.d/ 目录下的文件来找到 fail2ban 支持的 banaction 列表。
- iptables:ssh禁止来源IP访问场景通常设置 banaction 为 iptables-ipset 或者直接使用 iptables
- firewalld:ssh禁止来源IP访问场景通常设置 banaction 为 firewallcmd-ipset
- ufw:可以直接设置 banaction 为 ufw
[sshd]模块:启用sshd模块需要在 jail.local 文件中找到 [sshd] 模块,并将 enabled 参数改为true
[sshd] enabled = true #启用该模块 port = 22 #ssh端口 logpath = /var/log/auth.log #日志路径 backend = %(sshd_backend)s #后台管理程序,默认由systemd接管,无需修改
注:
1、如果配置文件中无该模块,可以自行手动添加
2、logpath 参数和 linux 发行版本有关:
- RHEL/Rocky/CentOS:logpath = /var/log/secure
- Ubuntu/Debian:logpath = /var/log/auth.log
上面 [DEFAULT] 中使用到的部分参数,也可以用在 [sshd] 模块中, 局部变量优先级大于全局变量,如下
[sshd] enabled = true port = 22 logpath = /var/log/secure backend = %(sshd_backend)s ignoreip = 127.0.0.1/8 ::1 10.10.0.0/16 172.16.0.0/16 bantime = 1m findtime = 1m maxretry = 1 banaction = firewallcmd-ipset
该配置表示,一分钟内如果ssh登陆失败1次,则封锁访问的IP一分钟,同时排除本地回环地址和一些内网网段。(参数含义见 [DEFAULT] 模块处解析,实际请根据业务需求进行配置)
修改完配置文件后重启服务生效
# systemctl restart fail2ban
测试下效果,第一次ssh连接故意输错密码,第二次ssh连接就已经连接不上了,等待一分钟后又能继续连接
四、常用命令汇总
查看日志文件
# less /var/log/fail2ban.log
查看启用的模块列表
# fail2ban-client status
查看 sshd 模块封堵的 IP 列表
# fail2ban-client status sshd
取消 sshd 模块中被封堵的 IP
# fail2ban-client set sshd unbanip 85.209.11.27