我的Linux服务器被扫了2000次!手把手教你用Fail2ban自动封禁SSH暴力破解IP

张开发
2026/4/18 17:10:40 15 分钟阅读

分享文章

我的Linux服务器被扫了2000次!手把手教你用Fail2ban自动封禁SSH暴力破解IP
从2000次暴力破解到零入侵Fail2ban全自动防御实战指南凌晨三点收到服务器告警时我从未想过会看到这样的场景——来自全球各地的IP地址正以每秒5次的频率尝试暴力破解SSH登录。更令人不安的是这些攻击者已经尝试了超过2000种用户名组合从常见的root、admin到hadoop、minersta等特定场景账户。这不再是个案而是所有暴露在公网的Linux服务器都在面临的常态化威胁。本文将分享如何用Fail2ban构建智能防御体系让服务器在遭受攻击时能自动识别威胁、实时封禁同时保持合法用户的正常访问。1. 为什么传统防御手段已经失效十年前修改SSH端口、禁用root登录就能解决90%的安全问题但现代自动化攻击工具早已进化。攻击者现在会同时扫描所有65535个端口使用机器学习生成用户名密码组合甚至模仿正常用户的登录间隔来规避检测。我曾在某台服务器上观察到攻击者用rootnotty这种特殊标识尝试登录明显是针对日志审计系统的规避手段。当前攻击的典型特征分布式IP地址平均每个IP尝试20次后切换高频次组合爆破用户名字典超过2000个条目智能规避策略请求间隔随机化、模仿人类操作持久化攻击同一目标持续攻击30天以上传统方案如iptables手动封禁需要运维人员24小时值守而云平台安全组又缺乏细粒度的动态规则。这就是Fail2ban这类自动化工具的价值所在——它能实时分析认证日志自动识别暴力破解行为并动态更新防火墙规则。2. Fail2ban核心机制解析Fail2ban的防御体系建立在三个核心组件上2.1 日志监控与模式识别通过正则表达式分析/var/log/auth.log等日志文件识别异常登录行为。例如以下配置可以捕捉rootnotty这种特殊登录尝试# /etc/fail2ban/filter.d/sshd-custom.conf [INCLUDES] before sshd.conf [Definition] failregex ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from HOST( via \S)?\s*$ ^%(__prefix_line)s(?:error: PAM: )?User not known to the underlying authentication module for .* from HOST\s*$ ^%(__prefix_line)sFailed (?:password|publickey) for (?:invalid user )?rootnotty from HOST ignoreregex 2.2 动态封禁策略封禁规则不是简单的5次失败就永久封禁而是支持多种智能策略策略类型参数示例适用场景阶梯式封禁maxretry3 findtime1h应对持续低频攻击全局封禁banactioncloudflare针对分布式攻击临时封禁bantime12h避免误封合法用户白名单豁免ignoreip192.168.1.0/24内部网络访问不受限制2.3 多防御层联动现代生产环境需要Fail2ban与其他安全组件协同工作# 与Cloudflare API联动的示例动作配置 # /etc/fail2ban/action.d/cloudflare.conf [Definition] actionban curl -s -X POST https://api.cloudflare.com/client/v4/zones/ZONE_ID/firewall/access_rules/rules \ -H X-Auth-Email: CF_EMAIL \ -H X-Auth-Key: CF_API_KEY \ -H Content-Type: application/json \ --data {mode:block,configuration:{target:ip,value:ip},notes:Banned by Fail2ban}3. 高级部署实战3.1 安装与基础配置在Ubuntu/Debian系统上安装最新版sudo apt update sudo apt install -y fail2ban cp /etc/fail2ban/jail.{conf,local}关键基础配置项# /etc/fail2ban/jail.local [DEFAULT] ignoreip 127.0.0.1/8 ::1 192.168.0.0/16 bantime 72h findtime 1h maxretry 33.2 SSH防护专项优化针对SSH暴力破解的强化配置[sshd] enabled true port ssh filter sshd logpath %(sshd_log)s backend %(sshd_backend)s banaction %(banaction_allports)s maxretry 2特殊场景处理应对rootnotty攻击添加自定义filter识别这种特殊模式防护非标端口在port参数中补充所有SSH监听端口云服务器适配使用banaction aws-security-group等云平台特定动作3.3 邮件告警集成配置实时邮件通知需系统已安装sendmail或postfix# /etc/fail2ban/jail.local [DEFAULT] destemail adminyourdomain.com sender fail2ban-alertyourdomain.com mta sendmail action %(action_mwl)s4. 超越基础生产环境最佳实践4.1 性能优化方案当处理高流量服务器时需要调整以避免性能问题# 高性能配置模板 [DEFAULT] dbpurgeage 86400 usedns no chain INPUT关键参数说明dbpurgeage自动清理旧日志的时间窗口usedns禁用反向DNS查询提升速度chain指定iptables链名避免冲突4.2 多维度监控策略除了SSH还应该监控这些关键服务服务类型监控重点推荐封禁策略WordPressxmlrpc.php暴力破解封禁IP屏蔽URLMySQL空密码尝试临时封禁审计告警FTP匿名登录尝试永久封禁Nginx扫描器特征请求国家级别封禁4.3 自动化维护方案通过cron定期执行这些维护任务# 每周清理旧日志 0 3 * * 1 find /var/log/fail2ban.log* -mtime 30 -exec rm {} \; # 每月更新GeoIP数据库 0 2 1 * * /usr/bin/fail2ban-geoipupdate5. 防御效果验证与调优部署完成后通过这些方法验证效果# 查看当前封禁列表 sudo fail2ban-client status sshd # 压力测试工具模拟攻击谨慎使用 hydra -L userlist.txt -P passlist.txt ssh://your-server -t 4典型调优场景误封问题调整maxretry和findtime参数漏封问题优化正则表达式匹配规则性能问题启用多线程处理模式在最近一次真实攻击中这套系统在30分钟内自动封禁了来自23个国家的147个IP地址而正常用户的SSH会话完全不受影响。日志显示攻击者尝试了rootnotty、adminconsole等特殊用户名组合但都被自定义过滤规则准确识别。

更多文章