系统运维

Fail2ban结合Firewalld与iptables防御实践

浅时光博客 · 6月27日 · 2022年 25793次已读

一、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
文章来源(Source):https://www.dqzboy.com
  • 解锁被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原文链接:https://www.dqzboy.comban-client reload ,来加载新的配置;如果reload配置未生效,那么尝试重启fail2ban服务

[root@localhost ~]# fail2ban-client reload

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

以上就是本次文章所有知识点,如果文章对你有帮助就动动你那发财的小手,点个赞留个言,给本站加点热度。谢谢支持!


本文作者:浅时光博客
原文链接:https://www.dqzboy.com/9412.html
版权声明:知识共享署名-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)协议进行许可,转载时请以>超链接形式标明文章原始出处和作者信息
免责声明:本站提供的内容仅限于个人学习和研究使用;禁止将内容用于商业或非法用途。下载后请在24小时内彻底删除,否则后果由用户承担。访问和下载本站内容即表示您已同意上述条款 。

0 条回应

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