一、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 = 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-common.conf iptables-common.local
[root@localhost action.d]# vim iptables-common.local
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连接失败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 地址添加到 fail2b文章来源(Source):浅时光博客 an 的禁止列表中。
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:加载新配置测试
当我们的配置发生改变了我们可以使用fail2
,来加载新的配置;如果reload配置未生效,那么尝试重启fail2ban服务
[root@localhost ~]# fail2ban-client reload
# 查看启用的规则
[root@localhost ~]# fail2ban-client status


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

以上就是本次文章所有知识点,如果文章对你有帮助就动动你那发财的小手,点个赞留个言,给本站加点热度。谢谢支持!
必须 注册 为本站用户, 登录 后才可以发表评论!