一、Fail2ban介绍
Fail2Ban 是入侵检测软件框架,保护计算机免受暴力破解。Fail2ban由Python语言开发,Fail2ban可以监视系统日志,然后根据配置里的规则执行对应的屏蔽操作,例如你的Linux服务器有人尝试暴力破解SSH登入,则可以通过Fail2ban调用Firewalld进行屏蔽。

二、场景说明解释
最近进行改造自己的小破站时,登入到服务器发现执行一些命令特别卡顿,刚开始以为是自己的网络问题,发现不是网络问题后,又开始查看系统内存、CPU、磁盘IO等发现没有任何问题,后面就想到是不是自己的服务器有人在疯狂扫描呢?然后我通过下面的命令查看到居然有人尝试SSH登入我的服务器几万次
- 查看尝试登录失败最多的ip
lastb | awk '{ print $3}' | sort | uniq -c | sort -n
- 然后我就通过iptables进行屏蔽拉黑,但是后面想一想每次去手动屏蔽不太现实,然后我就想到了
Fail2ban这个软件程序,下面我就演示下这个软件如何使用。
三、Fail2ban安装
#包含在epel-release源中,所以需要首先安装epel-release源
yum install epel*
#CentOS安装
yum install fail2ban
#Ubuntu
apt-get install fail2ban
- 安装成功后 Fail2ban 配置文件位于
/etc/fail2ban,其中 jail.conf 为主配置文件,相关的匹配规则位于filter.d目录
四、Fail2ban配置
1、防火墙配置
- 我使用的是CentOS 7默认是firewalld,所以我这里需要放通必要的访问端口
#查看状态
firewall-cmd --state
#启动
systemctl start firewalld
#设置自动启动
systemctl enable firewalld
#开启一些必要的端口
firewall-cmd --zone=public --add-port=22/tcp --permanent
firewall-cmd --zone=public --add-port=80/tcp --permanent
firewall-cmd --zone=public --add-port=443/tcp --permanent
firewall-cmd --reload
#查看已经放通的端口
firewall-cmd --list-all
2、配置监狱
- 新建
jail.local来覆盖 Fail2ban 的一些默认规则
~]# vim /etc/fail2ban/jail.local
# 默认配置
[DEFAULT]
# 指定哪些地址可以忽略 fail2ban 屏蔽(白名单)
ignoreip = 127.0.0.1/8
# 客户端IP被封禁时长
bantime = 24h
# 如果在findtime秒内未找到匹配项,则计数器设置为零
findtime = 10m
# 允许客户端最大尝试失败的次数
maxretry = 5
# 在达到maxretry阈值时使用的默认动作;如果使用iptables将下面的注释取消,并将firewalld配置注释或者删除
banaction = firewallcmd-ipset
# 允许你对每个端口的IP地址进行标记和封锁
banaction_allports = firewallcmd-ipset
#banaction = iptables-multiport
#banaction_allports = iptables-allports
action = %(action_mwl)s
#名称自定义
[sshd]
#true表示开启
enabled = true
#规则名称(也就是文件名),必须填写位于filter.d目录里面的规则
filter = sshd
#对应的端口或者协议;不显式配置port参数则封禁IP访问服务器所有端口
port = 22
#采取的行动,下面表示禁IP+写入日志
action = %(action_mwl)s
#需要监视的日志路径
logpath = /var/log/secure
3、封禁策略
- 这里注意修改Fail2ban的封禁策略为
DROP;注意:不要修改默认配置文件,在 /etc/fail2ban/action.d/ 目录下复制对应策略文件并将.conf修改为.local
# iptables
[root@localhost action.d]# cp iptables.conf iptables.conf_bak
[root@localhost action.d]# vim iptables.conf
blocktype = DROP
# firewalld
[root@localhost action.d]# cp firewallcmd-common.conf firewallcmd-common.local
[root@localhost action.d]# vim firewallcmd-common.local
blocktype = DROP
4、启动程序
systemctl start fail2ban.service
systemctl enable fail2ban.service
systemctl status fail2ban.service
# 启动和服务日志查看
tailf /var/log/fail2ban.log
五、Fail2ban测验
- 为了方便测试,我们需要将上面规则策略时间和次数调整下,配置成客户端在10秒内尝试SSH连
原文链接:https://dqzboy.com 接失败3次则进行防御,接下来我们进行测试
- 测试之前查看Fail2ban sshd的情况
~]# fail2ban-client status sshd

- 现在通过ssh客户端工具连接然后连续故意输错3次密码来查看效果

- 登入到Fail2ban服务器上查看已经封禁的IP
~]# fail2ban-client status sshd

- 解锁被Ban IP,可以使用下面命令删除
[root@localhost ~]# fail2ban-client set sshd unbanip 192.168.66.61
1
[root@localhost ~]# fail2ban-client status sshd
Status for the jail: sshd
|- Filter
| |- Currently failed: 0
| |- Total failed: 0
| `- Journal matches: _SYSTEMD_UNIT=sshd.service + _COMM=sshd
`- Actions
|- Currently banned: 0
|- Total banned: 1
`- Banned IP list:
Fail2ban还可以配合Nginx这些去做防御;对于防御最好关闭Root远程登入,更改SSH的远程访问端口等
六、Nginx防御配置
1、Nginx日志格式
这里我的Nginx日志格式为默认的,下面的规则也是基于默认格式格式进行正则匹配的,要根据自己实际的日志格式写正则进行匹配
192.168.66.1 - - [27/June/2022:21:40:41 +0800] "GET / HTTP/1.1" 403 3308 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36"
2、防止CC攻击
这里仅以Nginx为例,使用fail2ban来监视nginx日志,匹配短时间内频繁请求的IP,并使用firewalld将其IP屏蔽,达到CC防护的作用
2.1:创建匹配规则
# 需要先新建一个nginx日志匹配规则
[root@localhost ~]# vi /etc/fail2ban/filter.d/nginx-cc.conf
[Definition]
# 此处的正则匹配规则是根据 nginx 的访问日志进行撰写,不同的恶意扫描有不同的日志特征
failregex = ^<HOST> .*"GET .* HTTP.*" 4\d{2} \d+ ".*"$
# 忽略对静态内容的请求
ignoreregex = "GET .*\.css.*" "GET .*\.js.*" "GET .*\.png.*" "GET .*\.gif.*" "GET .*\.jpeg.*"
这个规则将通过正则表达式匹配 Nginx 访问日志,检测每个 IP 地址尝试的 GET 请求是否返回
HTTP 4xx的响应代码(如 404,403 等),如果是,则认为该请求可能是 CC 攻击,将该 IP 地址添加到 fail2ban 的禁止列表中。
2.2:添加Nginx监狱
[root@localhost ~]# vim /etc/fail2ban/jail.local
#名称自定义
[nginx-cc]
#true表示开启
enabled = true
#对应的端口或者协议
port = http,https
#规则名称(也就是文件名),必须填写位于filter.d目录里面的规则
filter = nginx-cc
#采取的行动,下面表示禁IP+写入日志
action = %(action_mwl)s
# 允许客户端尝试失败的次数
maxretry = 20
# 在findtime时间内允许尝试maxretry次
findtime = 60
# 客户端IP被封禁时长;单位默认为秒(s),可以用分m,时h,天d,月mo,年y, -1为永久屏蔽
bantime = 1h
#需要监视的日志路径
logpath = /var/log/nginx/access.log
上面的配置意思是如果在60s内,同一IP达到20次请求,则将其IP ban 1小时,上面只是为了测试,请根据自己的实际情况修改。logpath为nginx日志路径。
2.3:加载新配置测试
当我们的配置发生改变了我们可以使用fail2ban-client reload ,来加载新的配置;如果reload配置未生效,那么尝试重启fail2ban服务
[root@localhost ~]# fail2ban-client reload
# 查看启用的规则
[root@localhost ~]# fail2ban-client status


- 现在我们访问某一个页面,速度刷新进行测试; 正常情况下会无法访问,然后再次查看规则
原文链接:https://dqzboy.com 里面是否有被Ban的IP
[root@localhost ~]# fail2ban-client status nginx-cc

3、使用firewalld如何查看被Ban的IP
当使用 Firewalld 与 Fail2Ban 相结合时,Fail2Ban 通常会通过创建一个或多个 ipset 列表来管理被封锁的 IP 地址,并将这些列表应用到 Firewalld 的规则中。要查看 Fail2Ban 封禁的 IP 地址,你可以通过两个步骤进行:
1. 查找 Fail2Ban 使用的 ipset 名称
Fail2Ban 为每个 jail 创建一个单独的 ipset 列表,通常名为 f2b-<jailname>(例如,对于 SSH jail,它可能是 f2b-sshd)。首先,你需要确定 Fail2Ban 使用的准确 ipset 名称。
- 运行以下命令来列出所有当前活动的 ipset 列表及其内容:
sudo ipset list
在输出结果中,寻找名称以 f2b- 开头的列表,这些即为 Fail2Ban 管理的列表。
2. 查看特定 ipset 中的封禁 IP 地址
一旦知道了要查找的 ipset 名称,就可以直接查看该列表中封禁的 IP 地址。假设 ipset 名称是 f2b-sshd,使用以下命令查看:
sudo ipset list f2b-sshd
这条命令将显示出 f2b-sshd 列表中所有的条目,主要是被封禁的 IP 地址。
3. 使用firewall-cmd检查是否引用了ipset
仅仅因为 ipset 中有这个集合,并不直接意味着所有在该集合中的 IP 地址都已经被阻止访问你的服务器。为了让 ipset 中的集合生效,需要防火墙规则引用这个集合,并指定对集合中的 IP 地址执行的操作(如拒绝)。这通常通过添加 iptables 规则或 firewalld 配置实现。
如果你的系统使用 firewalld 并与 Fail2Ban 集成,你可以检查 firewalld 是否有引用 ipset 集合的规则。尽管 firewall-cmd --list-all 命令展示了当前区域的配置,但它可能不直接显示涉及 ipset 的规则。
sudo firewall-cmd --direct --get-all-rules

必须 注册 为本站用户, 登录 后才可以发表评论!