Fail2Ban安装使用及常用配置教程

#编程技术 2022-12-09 19:28:00 | 全文 2142 字,阅读约需 5 分钟 | 加载中... 次浏览

👋 相关阅读


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] 开始向下翻阅需要更改的配置)

图片alt

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

图片alt

图片中三个选项的意思就是在 10 分钟内失败超过 3 次的用户将会被封禁 24 小时

接下来可以按需开启需要的规则, 前文我们说到的 ssh 暴力破解,可以通过设置 fail2ban 中的 [sshd] 规则来防止。

从 [Default] 继续向下翻阅很长的一段之后,我们就来到单个规则的配置啦, 以单个开启 [sshd] 规则为例

图片alt

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

图片alt

修改封禁方式为 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 idle on\off 设置某个监控(监狱)的状态。
set addignoreip 设置某个监控(监狱)可以忽略的ip
set delignoreip 删除某个监控(监狱)可以忽略的ip
set banip 将ip加入 监控(监狱)
set unbanip 将ip从监控(监狱)移除

查看 fail2ban 的日志

fail2ban 的日志默认在 /var/log/fail2ban.log

日志中记录着 Ban IP 的记录和 UnBan IP 的记录

也有修改配置文件重载后的记录

cat /var/log/fail2ban

图片alt

常用配置防护

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

图片alt

可以看出一共五条记录,规则过滤出了两条,三条正常的记录

然后将封禁规则加入配置文件

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

如果是多个日志文件注意一定要对齐,等号后面的一定要对齐

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

第二条命令将输出所有的子网,这些子网是基于被封杀的国家而添加的,可能会相当长。

Edit | Last updated on 2024-03-04 23:34:50




×