Fail2Ban安装使用教程
因为作为一个 linux 入门级别的小白, 很多人都会把一些 web 面板(比如宝塔面板)作为自己管理 vps 的首选, 而当我一段时间登录宝塔面板之后, 有时就会看到提示发现自己的 SSH 登录竟然失败了上万次! 可这都不是我干的呀(我不是我没有!) 如果自己的 SSH 密码真的被暴力破解了怎么办呢? 那么…试试 fail2ban?
安装
1、对于CentOS6以下, 以及Fedora
sudo yum install fail2ban
2、对于ubuntu, Debian或Linux Mint
sudo apt-get install fail2ban
目录结构
/etc/fail2ban # fail2ban 服务配置目录
/etc/fail2ban/action.d # iptables 、mail 等动作文件目录
/etc/fail2ban/filter.d # 条件匹配文件目录,过滤日志关键内容
/etc/fail2ban/jail.conf # fail2ban 防护配置文件
/etc/fail2ban/fail2ban.conf # fail2ban 配置文件,定义日志级别、日志、sock 文件位置等
cd /etc/fail2ban # 进入配置文件所在的目录
cp jail.conf jail.local # 备份配置文件
配置 fail2ban
通过运行上面的命令, 我们已经完成了 fail2ban 的安装, 接下来就是 fail2ban 的配置
首先使用 vi 或者 vim 打开 fail2ban 的规则配置文件
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
vi /etc/fail2ban/jail.local
你将会看到这样的配置文件(从红色划线记号 [Default] 开始向下翻阅需要更改的配置)

在 [Default] 中, 主要修改 bantime, findtime, 以及 maxretry 这三个选项

图片中三个选项的意思就是在 10 分钟内失败超过 3 次的用户将会被封禁 24 小时
接下来可以按需开启需要的规则, 前文我们说到的 ssh 暴力破解,可以通过设置 fail2ban 中的 [sshd] 规则来防止。
从 [Default] 继续向下翻阅很长的一段之后,我们就来到单个规则的配置啦, 以单个开启 [sshd] 规则为例

我们需要设置 enabled=true 来激活它; 如果你有更改过 ssh 的端口的话(比如改成 1123), 就在 port 需要添加 1123 这个端口(如图)

修改封禁方式为 firewall
banaction = firewallcmd-multiport
修改完配置之后,需要重载让配置生效:
fail2ban-client reload
变更 iptables 封禁策略
Fail2ban 的默认 iptables 封禁策略为 REJECT --reject-with icmp-port-unreachable,需要变更 iptables 封禁策略为 DROP。
cp /etc/fail2ban/action.d/iptables-multiport.conf /etc/fail2ban/action.d/iptables-multiport.local
vi /etc/fail2ban/action.d/iptables-multiport.local
修改内容如下:
[Init]
blocktype = DROP
最后,别忘记重启fail2ban使其生效
sudo systemctl restart fail2ban
激活 fail2ban
在配置完成后, 当然是选择激活它啦
1、对于 CentOS7/8,Fedora
sudo systemctl restart fail2ban
2、对于 Debian, Ubuntu 或 CentOS6:
sudo service fail2ban restart
如果是第一次启动的话建议把命令中的 restart 换成 start
CentOS 设置 fail2ban 自启
systemctl enable fail2ban.service
检验 fail2ban
如果要检验 fail2ban 有没有正确启动, 可以使用这个命令
sudo fail2ban-client ping
如果正确启动的话 fail2ban 会以 pong 作为回应 (Server replied: pong), 其他情况就需要看看配置文件的格式正确以及是不是用 start 命令启动 fail2ban 什么的…
如果要查看 fail2ban 目前启用的规则的话
fail2ban-client status
查看某个规则下被封禁的次数以及 ip(以 [sshd] 规则为例)
fail2ban-client status sshd
查看当前被禁止登陆的ip:
[root@121]# fail2ban-client status ssh-iptables
Status for the jail: ssh-iptables
|- filter
| |- File list: /var/log/secure #日志文件路径
| |- Currently failed: 0 #当前失败次数
| `- Total failed: 3 #总失败次数
`- action
|- Currently banned: 1 #当前禁止的ip数量
| `- IP list: 192.168.1.112 #当前禁止的ip
`- Total banned: 1 #禁止的ip总数
fail2ban-client
命令 | 说明 |
---|---|
start | 启动fail2ban server和监狱 |
reload | 重新加载配置文件 |
stop | 暂停fail2ban和监狱 |
status | 查看运行的监控服务数量和列表 |
set loglevel | 设置日志等级,有 CRITICAL, ERROR, WARNING,NOTICE, INFO, DEBUG |
get loglevel | 获取当前日志的等级 |
set <JAIL> idle onoff | 设置某个监控(监狱)的状态。 |
set <JAIL> addignoreip <IP> | 设置某个监控(监狱)可以忽略的ip |
set <JAIL> delignoreip <IP> | 删除某个监控(监狱)可以忽略的ip |
set <JAIL> banip <IP> | 将ip加入 监控(监狱) |
set <JAIL> unbanip <IP> | 将ip从监控(监狱)移除 |
查看 fail2ban 的日志
fail2ban 的日志默认在 /var/log/fail2ban.log
日志中记录着 Ban IP 的记录和 UnBan IP 的记录
也有修改配置文件重载后的记录
cat /var/log/fail2ban

常用配置防护
1、配置 ssh 连接错误次数限制
追加配置
vi /etc/fail2ban/jail.d/jail.local
# 针对各服务的检查配置,如设置bantime、findtime、maxretry和全局冲突,服务优先级大于全局设置
[ssh-iptables]
# 忽略的IP列表,不受设置限制(白名单)
ignoreip = 127.0.0.1
# 日志修改检测机制(gamin、polling和auto这三种)
backend=auto
# 是否激活此项(true/false)
enabled=true
# 过滤规则filter的名字,对应filter.d目录下的sshd.conf
filter= sshd
# ssh端口
port=22
# 动作的相关参数
blocktype = DROP
action= %(banaction)s[blocktype=%(blocktype)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
# 触发报警的收件人
# sendmail-whois[name=SSH, dest=root, sender=邮箱地址, sendername="Fail2Ban"]
# 检测的系统的登陆日志文件
logpath=/var/log/secure
# 禁止30分钟
bantime=1800
# 这个时间段内超过规定次数会被ban掉
findtime=300
# 最大尝试次数
maxretry=3
重载配置:fail2ban-client reload
查看状态:fail2ban-client status ssh-iptables
2、封禁访问 nginx 404 状态码的 ip 地址的配置规则
vi /etc/fail2ban/filter.d/nginx-404.conf
[Definition]
failregex = <HOST> -.*- .*HTTP/*.* (404|444|403|400) .* .*$
ignoreregex =
保存后测试配置文件相对于日志是否正确
fail2ban-regex /www/wwwlogs/access.log /etc/fail2ban/filter.d/nginx-404.conf

可以看出一共五条记录,规则过滤出了两条,三条正常的记录
然后将封禁规则加入配置文件
vi /etc/fail2ban/jail.d/jail.local # 文件尾部写入
[nginx-404]
enabled = true
port = http,https
filter = nginx-404
action = %(banaction)s[blocktype=%(blocktype)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
blocktype = DROP
logpath = /home/wwwlogs/access.log
bantime = 14400
findtime = 3
maxretry = 3
- filter:规则文件的名字
- blocktype:封禁IP模式
- logpath:日志路径
- bantime:封禁的时间
- findtime:在几秒内
- maxretry:有几次
如果是多个日志文件注意一定要对齐,等号后面的一定要对齐
logpath = /www/wwwlogs/access.log
/www/wwwlogs/wangtwothree.log
/www/wwwlogs/blog.wangtwothree.com.log
重载配置:fail2ban-client reload
查看状态:fail2ban-client status nginx-404
3、简单防 CC 攻击
以 Nginx 为例,使用 fail2ban 来监视 nginx 日志,匹配短时间内频繁请求的 IP,并使用 firewalld 将其 IP 屏蔽,达到 CC 防护的作用。
增加规则
vi /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
failregex = <HOST> -.*- .*HTTP/*.* .* .*$
ignoreregex =
检测规则:
fail2ban-regex /www/wwwlogs/access.log "<HOST> -.*- .*HTTP/*.* .* .*$"
fail2ban-regex /www/wwwlogs/access.log /etc/fail2ban/filter.d/nginx-cc.conf
追加配置
vi /etc/fail2ban/jail.d/jail.local
[nginx-cc]
filter = nginx-cc
enabled = true
port = http,https
bantime = 2h
findtime = 30s
maxretry = 40
action = %(banaction)s[blocktype=%(blocktype)s, port="%(port)s", protocol="%(protocol)s", chain="%(chain)s"]
blocktype = DROP
logpath = /www/wwwlogs/access.log
意思是如果在 30 秒内,同一 IP 达到 40 次请求,则将其封禁 2 小时,具体根据实际情况修改。
重载配置:fail2ban-client reload
查看状态:fail2ban-client status nginx-cc
黑名单验证
要验证 FirewallD 黑名单是否成功,请检查 drop 区和 blacklist ipset
sudo firewall-cmd --direct --get-all-rules
sudo firewall-cmd --list-all
sudo firewall-cmd --list-rich-rules
sudo firewall-cmd --info-zone=drop
sudo firewall-cmd --info-ipset=blacklist | less
第二条命令将输出所有的子网,这些子网是基于被封杀的国家而添加的,可能会相当长。