Fail2ban防止暴力破解工具使用教程

  • 场景
  • Fail2ban安装和配置
    • 安装
    • 配置
  • 原理
  • 遇到的问题以及解决办法
    • 问题1:设置的策略是10分钟内ssh连接失败2次的ip进行封禁,日志中实际却出现4次连接。
    • 问题2:策略设置为1分钟内失败两次,封禁ip。但通过日志发现,暴力破解也修改了策略,每分钟尝试1次ssh连接,这样导致该ip无法被封禁。

场景

物理主机服务器托管于第三方机房中,仅仅提供电源以及网络服务,并未提供安全防护管理。因此,我们经常遇到网络攻击,常见的就是通过ssh进行暴力破解,进入服务器,植入病毒和程序,进而造成经济损失。

ssh连接日志记录:

/var/log/secure
Mar  9 03:40:00 localhost sshd[78060]: Failed password for root from 14.103.109.71 port 49730 ssh2
Mar  9 03:40:00 localhost sshd[78060]: Connection closed by 14.103.109.71 port 49730 [preauth]
Mar  9 03:40:00 localhost unix_chkpwd[78088]: password check failed for user (root)
Mar  9 03:40:00 localhost sshd[78086]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.132.8  user=root
Mar  9 03:40:00 localhost sshd[78086]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar  9 03:40:01 localhost unix_chkpwd[78107]: password check failed for user (root)
Mar  9 03:40:01 localhost sshd[78090]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71  user=root
Mar  9 03:40:01 localhost sshd[78090]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar  9 03:40:02 localhost sshd[78086]: Failed password for root from 14.103.132.8 port 37816 ssh2
Mar  9 03:40:02 localhost sshd[78086]: Received disconnect from 14.103.132.8 port 37816:11: Bye Bye [preauth]
Mar  9 03:40:02 localhost sshd[78086]: Disconnected from 14.103.132.8 port 37816 [preauth]
Mar  9 03:40:03 localhost sshd[78090]: Failed password for root from 14.103.109.71 port 49742 ssh2
Mar  9 03:40:03 localhost sshd[78090]: Connection closed by 14.103.109.71 port 49742 [preauth]
Mar  9 03:40:03 localhost unix_chkpwd[78125]: password check failed for user (root)
Mar  9 03:40:03 localhost sshd[78123]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71  user=root
Mar  9 03:40:03 localhost sshd[78123]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar  9 03:40:06 localhost sshd[78123]: Failed password for root from 14.103.109.71 port 54450 ssh2
Mar  9 03:40:06 localhost sshd[78123]: Connection closed by 14.103.109.71 port 54450 [preauth]
Mar  9 03:40:06 localhost unix_chkpwd[78131]: password check failed for user (root)
Mar  9 03:40:06 localhost sshd[78129]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71  user=root
Mar  9 03:40:06 localhost sshd[78129]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Mar  9 03:40:08 localhost sshd[78129]: Failed password for root from 14.103.109.71 port 54458 ssh2
Mar  9 03:40:08 localhost sshd[78129]: Connection closed by 14.103.109.71 port 54458 [preauth]
Mar  9 03:40:09 localhost unix_chkpwd[78138]: password check failed for user (root)
Mar  9 03:40:09 localhost sshd[78136]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=14.103.109.71  user=root
Mar  9 03:40:09 localhost sshd[78136]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"

从ssh记录中可以看到,这10秒钟有4次ssh请求,差不多1分钟24次记录,已经属于恶意暴力破解了。

Fail2ban安装和配置

安装

  • Linux(CentOS/RHEL)
yum install epel-release -y  # 先安装 EPEL 源(CentOS 7)yum install fail2ban -ysystemctl enable --now fail2ban
  • Linux(Ubuntu/Debian)
apt update && apt install fail2ban -ysystemctl enable --now fail2ban

配置

  1. 安装路径:
(base) [root@localhost fail2ban]# cd /etc/fail2ban/
(base) [root@localhost fail2ban]# pwd
/etc/fail2ban
(base) [root@localhost fail2ban]# ls
action.d  fail2ban.conf  fail2ban.d  filter.d  jail.conf  jail.d  jail.local  paths-common.conf  paths-fedora.conf
(base) [root@localhost fail2ban]# 
  1. 配置文件路径

(1) 主配置文件(不推荐直接修改)

/etc/fail2ban/jail.local

(1) 主配置文件(不推荐直接修改)

/etc/fail2ban/jail.conf

注意:(系统默认配置,升级时会被覆盖)

(2) 自定义配置文件(推荐修改)

/etc/fail2ban/jail.local

注意:(用户自定义配置,优先级高于 jail.conf,不会被升级覆盖)

  1. 自定义配置文件注释
enabled = true
port = ssh
filter = sshd
logpath = /var/log/secure  # CentOS
maxretry = 5               # 允许5次失败尝试(平衡安全与误封风险)
findtime = 300             # 5分钟内的失败尝试计入统计(实时响应攻击)
bantime = 86400            # 封禁24小时(足够阻止暴力破解,避免长期误封)
ignoreip = 127.0.0.1 192.168.1.0/24  # 信任内网IP
  1. 相关命令

重启fail2ban应用:

systemctl restart fail2ban

实时监控fail2ban工具的日志:

tail -f /var/log/fail2ban.log

输出封禁ip列表:

fail2ban-client status sshd | grep "Banned IP list"

原理

遇到的问题以及解决办法

问题1:设置的策略是10分钟内ssh连接失败2次的ip进行封禁,日志中实际却出现4次连接。

日志内容:

Jul 17 14:43:07 localhost sshd[105931]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232  user=root
Jul 17 14:43:07 localhost sshd[105931]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jul 17 14:43:09 localhost sshd[105931]: Failed password for root from 101.37.23.232 port 41776 ssh2
Jul 17 14:43:09 localhost sshd[105931]: Connection closed by 101.37.23.232 port 41776 [preauth]
Jul 17 14:45:42 localhost sshd[126373]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232  user=root
Jul 17 14:45:42 localhost sshd[126373]: pam_succeed_if(sshd:auth): requirement "uid >= 1000" not met by user "root"
Jul 17 14:45:42 localhost sshd[126375]: Invalid user pi from 101.37.23.232 port 43878
Jul 17 14:45:42 localhost sshd[126375]: input_userauth_request: invalid user pi [preauth]
Jul 17 14:45:42 localhost sshd[126375]: pam_unix(sshd:auth): check pass; user unknown
Jul 17 14:45:42 localhost sshd[126375]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232
Jul 17 14:45:43 localhost sshd[126499]: Invalid user hive from 101.37.23.232 port 44702
Jul 17 14:45:43 localhost sshd[126499]: input_userauth_request: invalid user hive [preauth]
Jul 17 14:45:43 localhost sshd[126499]: pam_unix(sshd:auth): check pass; user unknown
Jul 17 14:45:43 localhost sshd[126499]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=101.37.23.232
Jul 17 14:45:44 localhost sshd[126373]: Failed password for root from 101.37.23.232 port 43054 ssh2
Jul 17 14:45:44 localhost sshd[126373]: Connection closed by 101.37.23.232 port 43054 [preauth]
Jul 17 14:45:44 localhost sshd[126375]: Failed password for invalid user pi from 101.37.23.232 port 43878 ssh2
Jul 17 14:45:44 localhost sshd[126375]: Connection closed by 101.37.23.232 port 43878 [preauth]
Jul 17 14:45:44 localhost sshd[126499]: Failed password for invalid user hive from 101.37.23.232 port 44702 ssh2
Jul 17 14:45:44 localhost sshd[126499]: Connection closed by 101.37.23.232 port 44702 [preauth]
Jul 17 14:57:58 localhost sudo:    root : TTY=pts/5 ; PWD=/root ; USER=root ; COMMAND=/bin/grep Ban /var/log/fail2ban.log
Jul 17 14:57:58 localhost sudo: pam_unix(sudo:session): session opened for user root by root(uid=0)

问题分析:

  1. 攻击行为分析
    从日志来看,IP 101.37.23.232 在短时间内进行了多次SSH暴力破解尝试:

14:43:07

尝试 root 登录 → 失败(1次)

14:45:42

尝试 root 登录 → 失败(2次)

尝试 pi 用户登录 → 无效用户(3次)

尝试 hive 用户登录 → 无效用户(4次)

总计失败登录尝试次数:

root 用户:2次

无效用户(pi、hive):2次

总失败次数:4次

  1. Fail2Ban 策略匹配
    您设置的策略是 10分钟内限制2次(maxretry = 2),但Fail2Ban 默认只统计同一用户的失败登录:

sshd jail 的默认 failregex 会分别统计:

root 的失败登录(2次)→ 未达到 maxretry=2 的封禁阈值(刚好等于,但可能未触发)。

pi 和 hive 的失败登录(各1次)→ 未达到单独封禁条件。

关键问题:

Fail2Ban 默认不合并不同用户的失败登录,因此虽然总失败次数是4次,但每个用户的失败次数均未达到 maxretry=2 的封禁条件。

  1. 为什么IP没有被封禁?
    原因说明:

分用户统计失败次数: Fail2Ban 默认按用户名分别计算 maxretry,root 2次,pi 1次,hive 1次,均未达到封禁条件。
时间窗口 (findtime):所有尝试均在 2分钟 内发生(14:43-14:45),远小于findtime=10m,但按用户分开统计导致未触发。
无效用户未计入:部分Fail2Ban配置可能忽略 invalid user 的日志(需检查 filter.d/sshd.conf 的 failregex)。

处理问题:

方案一:修改 filter.d/sshd.conf 合并统计所有失败登录

编辑 Fail2Ban 的 SSH 过滤规则:

sudo vim /etc/fail2ban/filter.d/sshd.conf

在 failregex 部分取消用户区分,例如:

failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from <HOST>( port \d+)? ssh2$^%(__prefix_line)sFailed password for .* from <HOST>( port \d+)? ssh2$^%(__prefix_line)sConnection closed by <HOST> port \d+ \[preauth\]$

然后重载配置:

sudo fail2ban-client reload sshd

方案二:降低 maxretry 或缩短 findtime

sudo vim /etc/fail2ban/jail.local

调整参数:

maxretry = 2     # 保持当前值,但修改过滤规则后会更敏感
findtime = 1m    # 缩短统计窗口至1分钟
bantime = 1h     # 封禁1小时

重启 Fail2Ban:

sudo systemctl restart fail2ban

方案三:手动封禁该IP(临时措施)

sudo fail2ban-client set sshd banip 101.37.23.232

验证是否生效

检查封禁列表:

sudo fail2ban-client status sshd

模拟攻击测试:

使用另一台服务器尝试多次失败登录,观察是否触发封禁。

总结

当前策略问题:Fail2Ban 默认分用户统计失败次数,导致攻击者通过切换用户名绕过封禁。

修复方法:

  1. 修改 sshd.conf 合并所有失败登录统计。

  2. 调整 maxretry 和 findtime 提高敏感性。

  3. 手动封禁 确认的恶意 IP。

最终效果:调整后,同一IP的多次失败登录(无论用户名)将在 findtime 窗口内累计,达到 maxretry 后自动封禁。

问题2:策略设置为1分钟内失败两次,封禁ip。但通过日志发现,暴力破解也修改了策略,每分钟尝试1次ssh连接,这样导致该ip无法被封禁。

解决方法:

将findtime修改时间长一点,保证安全,例如:1小时,1天

findtime = 6000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/89191.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/89191.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/89191.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

亚远景科技助力长城汽车,开启智能研发新征程

亚远景科技助力长城汽车&#xff0c;开启智能研发新征程在汽车智能化飞速发展的当下&#xff0c;软件研发管理成为车企决胜未来的关键。近日&#xff0c;亚远景科技胡浩老师应邀为长城汽车开展了一场主题深刻且极具实用价值的培训。本次培训聚焦软件研发管理导论 - 建立机器学习…

图算法在前端的复杂交互

引言 图算法是处理复杂关系和交互的强大工具&#xff0c;在前端开发中有着广泛应用。从社交网络的推荐系统到流程图编辑器的路径优化&#xff0c;再到权限依赖的拓扑排序&#xff0c;图算法能够高效解决数据之间的复杂关联问题。随着 Web 应用交互复杂度的增加&#xff0c;如实…

Prometheus Operator:Kubernetes 监控自动化实践

在云原生时代&#xff0c;Kubernetes 已成为容器编排的事实标准。然而&#xff0c;在高度动态的 Kubernetes 环境中&#xff0c;传统的监控工具往往难以跟上服务的快速变化。Prometheus Operator 应运而生&#xff0c;它将 Prometheus 及其生态系统与 Kubernetes 深度融合&…

一种融合人工智能与图像处理的发票OCR技术,将人力从繁琐的票据处理中解放

在数字化浪潮席卷全球的今天&#xff0c;发票OCR技术正悄然改变着企业财务流程的运作模式。这项融合了人工智能与图像处理的前沿技术&#xff0c;已成为财务自动化不可或缺的核心引擎。核心技术&#xff1a;OCR驱动的智能识别引擎发票OCR技术的核心在于光学字符识别&#xff08…

时空大数据:数字时代的“时空罗盘“

引言&#xff1a;为何需要“时空大数据”&#xff1f;“大数据”早已成为热词&#xff0c;但“时空大数据”的提出却暗含深刻逻辑。中国工程院王家耀院士指出&#xff0c;早期社会存在三大认知局限&#xff1a;过度关注商业大数据而忽视科学决策需求&#xff1b;忽视数据的时空…

PySide笔记之信号连接信号

PySide笔记之信号连接信号code review! 在 PySide6&#xff08;以及 Qt 的其他绑定&#xff0c;如 PyQt&#xff09;中&#xff0c;信号可以连接到信号。也就是说&#xff0c;可以把一个信号的发射&#xff0c;作为另一个信号的触发条件。这样做的效果是&#xff1a;当第一个信…

Linux操作系统之线程:线程概念

目录 前言&#xff1a; 一、进程与线程 二、线程初体验 三、分页式存储管理初谈 总结&#xff1a; 前言&#xff1a; 大家好啊&#xff0c;今天我们就要开始翻阅我们linux操作系统的另外一座大山&#xff1a;线程了。 对于线程&#xff0c;大体结构上我们是划分为两部分…

windows利用wsl安装qemu

首先需要安装wsl,然后在swl中启动一个子系统。这里我启动一个ubuntu22.04。 接下来的操作全部为在子系统中的操作。 检查虚拟化 在开始安装之前,让我们检查一下你的机器是否支持虚拟化。 要做到这一点,请使用以下命令: sean@DESKTOP-PPNPJJ3:~$ LC_ALL=C lscpu | grep …

如何使用 OpenCV 打开指定摄像头

在计算机视觉应用中&#xff0c;经常需要从特定的摄像头设备获取视频流。例如&#xff0c;在多摄像头环境中&#xff0c;当使用 OpenCV 的 cv::VideoCapture 类打开摄像头时&#xff0c;如果不指定摄像头的 ID&#xff0c;可能会随机打开系统中的某个摄像头&#xff0c;或者按照…

JAVA面试宝典 -《分布式ID生成器:Snowflake优化变种》

&#x1f680; 分布式ID生成器&#xff1a;Snowflake优化变种 一场订单高峰&#xff0c;一次链路追踪&#xff0c;一条消息投递…你是否想过&#xff0c;它们背后都依赖着一个“低调却关键”的存在——唯一ID。本文将带你深入理解分布式ID生成器的核心原理与工程实践&#xff0…

苹果的机器学习框架将支持英伟达的CUDA平台

苹果专为Apple Silicon设计的MLX机器学习框架即将迎来CUDA后端支持&#xff0c;这意义重大。原因如下。 这项开发工作由GitHub开发者zcbenz主导&#xff08;据AppleInsider报道&#xff09;&#xff0c;他于数月前开始构建CUDA支持的原型。此后他将项目拆分为多个模块&#xff…

golang语法-----变量、常量

变量1、声明与初始化&#xff08;1&#xff09;标准声明 (先声明&#xff0c;后赋值)var age int // 声明一个 int 类型的变量 age&#xff0c;此时 age 的值是 0 fmt.Println(age) // 输出: 0age 30 // 给 age 赋值 fmt.Println(age) // 输出: 30//int 的零…

Jenkins+Docker(docker-compose、Dockerfile)+Gitee实现自动化部署

项目目录结构 project-root/ ├── pom.xml ├── docker │ ├── copy.sh │ ├── file │ │ ├── jar │ │ │ └── 存放执行copy.sh以后jar包的位置 │ │ └── Dockerfile │ └── docker-compose.yml ├── docker-only-test │ ├─…

TASK01【datawhale组队学习】地瓜机器人具身智能概述

https://github.com/datawhalechina/ai-hardware-robotics 参考资料地址 具身智能&#xff08;Embodied AI&#xff09; 具身智能 智能的大脑 行动的身体。 比例&#xff08;Proportional&#xff09;、积分&#xff08;Integral&#xff09;、微分&#xff08;Derivative&a…

uni-app 配置华为离线推送流程

1、首先需要创建一个华为开发者账号&#xff0c;我这个是个人开发账号 申请开发者账号 2、去AppGallery Connect登陆我们刚刚创建好的账号&#xff0c;点击页面的APP进入到如下3 AppGallery Connect ‎‎‎‎‎ ‎3、在AppGallery Connect 网站中创建一个 Android应用、点击…

当下主流摄像头及其核心参数详解

&#x1f4d6; 推荐阅读&#xff1a;《Yocto项目实战教程:高效定制嵌入式Linux系统》 &#x1f3a5; 更多学习视频请关注 B 站&#xff1a;嵌入式Jerry 当下主流摄像头及其核心参数详解 一、摄像头发展概述 摄像头作为现代智能设备&#xff08;如手机、安防、车载、工业等&am…

下载了docker但是VirtualBox突然启动不了了

今天下docker后发现 eNSP 路由器&#xff0c;防火墙启动不了了去virtualbox检查的时候发现无法启动&#xff1a;报错&#xff1a;不能为虚拟电脑 AR_Base 打开一个新任务.Raw-mode is unavailable courtesy of Hyper-V. (VERR_SUPDRV_NO_RAW_MODE_HYPER_V_ROOT).返回代码: E_F…

C++11之lambda表达式与包装器

lambda与包装器lambda语法捕捉列表lambda的应用lambda的原理包装器functionbindlambda语法 lambda 表达式本质是⼀个匿名函数对象&#xff0c;跟普通函数不同的是他可以定义在函数内部。 lambda 表达式语法使⽤层⽽⾔没有类型&#xff0c;所以我们⼀般是⽤auto或者模板参数定义…

有痛呻吟!!!

XiTuJueJin:YYDS 分盘 有些平台吃相太难看&#xff0c;同样的文章&#xff0c;我还先选择现在这里发布&#xff0c;TMD. 莫名其妙将我的文章设置为仅VIP可见&#xff0c;还是今天才发现&#xff0c;之前只是将一两篇设置为仅VIP可见&#xff0c;今天突然发现这种标识的都自动…

2025年7-9月高含金量数学建模竞赛清单

2025年7-9月高含金量数学建模竞赛 ——“高教社杯”国赛 & “华为杯”研赛作为过来人&#xff0c;真心觉得参加数学建模比赛是我本科阶段做的最值的事之一。 它锻炼的那种把实际问题转化成模型求解的思维&#xff0c;对做研究、写论文甚至以后工作都帮助很大。我当时就是靠…