5分钟搞定:用Fail2Ban自动封禁SSH暴力破解IP(附详细配置步骤)

张开发
2026/4/13 13:09:11 15 分钟阅读

分享文章

5分钟搞定:用Fail2Ban自动封禁SSH暴力破解IP(附详细配置步骤)
服务器安全防护实战5分钟部署智能SSH防御系统每次登录服务器时看到满屏的Failed password记录就像发现自家门锁被撬的痕迹——这种不安感我太熟悉了。去年我的测试服务器在48小时内遭遇了来自23个国家的17,842次暴力破解尝试直到配置了自动化防御系统才真正安心。本文将分享一套经过实战检验的SSH防护方案特别适合缺乏专职安全团队的中小企业。1. 威胁识别读懂攻击者的足迹上周帮朋友检查一台被入侵的服务器时在/var/log/secure中发现攻击者用了近400个常见用户名轮番尝试。这种撞库式攻击其实有很明显的特征# CentOS/RHEL系统查看失败登录 grep Failed password /var/log/secure | awk {print $11} | sort | uniq -c | sort -nr # Ubuntu/Debian系统 grep -oP Failed password for .* from \K[0-9.] /var/log/auth.log | sort | uniq -c典型攻击模式通常呈现以下特征特征指标正常情况暴力破解攻击每分钟失败登录次数5次50-5000次尝试用户名数量1-3个50-500个来源IP地理分布集中全球分散请求时间分布工作时间集中全天候持续提示突然出现的invalid user日志条目是明显的攻击信号合法用户不会故意用不存在的用户名登录2. 防御体系构建四层防护网2.1 基础加固修改默认暴露面就像不会把保险箱放在客厅显眼处首先应该调整SSH的默认配置# 修改SSH端口示例 sudo sed -i s/#Port 22/Port 58234/ /etc/ssh/sshd_config # 禁用root登录和密码认证 echo -e PermitRootLogin no\nPasswordAuthentication no | sudo tee -a /etc/ssh/sshd_config # 限制并发会话 echo MaxSessions 3 | sudo tee -a /etc/ssh/sshd_config关键参数对照表参数推荐值安全作用Port1024-65535避开自动化扫描的常见端口LoginGraceTime30s缩短攻击窗口MaxAuthTries3限制单次连接尝试次数ClientAliveInterval300自动断开闲置连接2.2 智能封锁Fail2Ban实战配置Fail2Ban的过滤规则就像智能门卫我的生产环境配置是这样的# /etc/fail2ban/jail.local [sshd] enabled true port 58234 filter sshd logpath /var/log/secure maxretry 3 findtime 1h bantime 1d ignoreip 192.168.1.0/24 [sshd-ddos] enabled true port 58234 filter sshd logpath /var/log/secure maxretry 10 findtime 10m bantime 6h常用管理命令备忘# 查看被封禁IP fail2ban-client status sshd # 手动解封某个IP fail2ban-client set sshd unbanip 203.0.113.45 # 实时监控日志 tail -f /var/log/fail2ban.log2.3 网络层防护iptables深度配置结合iptables可以构建更立体的防御# 限制每分钟新连接数 iptables -A INPUT -p tcp --dport 58234 -m state --state NEW -m recent --set iptables -A INPUT -p tcp --dport 58234 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP # 国家IP段白名单需xt_geoip模块 iptables -N SSH_GEO iptables -A INPUT -p tcp --dport 58234 -j SSH_GEO iptables -A SSH_GEO -m geoip --src-cc CN,US,JP -j RETURN iptables -A SSH_GEO -j DROP2.4 密钥管理更安全的认证方式SSH密钥对的管理也有讲究这是我的操作流程# 生成ED25519密钥比RSA更安全 ssh-keygen -t ed25519 -a 100 -f ~/.ssh/prod_access # 强制密钥使用二次验证 echo command/usr/bin/ssh-otp-verify $(cat ~/.ssh/prod_access.pub) authorized_keys # 密钥部署后立即加密存储原文件 gpg --encrypt --recipient adminexample.com ~/.ssh/prod_access3. 监控与响应建立安全闭环3.1 实时告警系统这个Python脚本可以发送Telegram告警#!/usr/bin/env python3 import re from telegram import Bot bot Bot(tokenYOUR_BOT_TOKEN) chat_id YOUR_CHAT_ID def send_alert(ip, attempts): message f SSH警报\nIP: {ip}\n尝试次数: {attempts}\n地理位置: https://ipinfo.io/{ip} bot.send_message(chat_idchat_id, textmessage) # 在Fail2Ban的action配置中调用此脚本3.2 自动化日志分析用Go编写的轻量级日志分析工具示例package main import ( bufio fmt os regexp ) func main() { file, _ : os.Open(/var/log/secure) defer file.Close() scanner : bufio.NewScanner(file) ipPattern : regexp.MustCompile(from (\d\.\d\.\d\.\d)) for scanner.Scan() { if strings.Contains(scanner.Text(), Failed password) { ip : ipPattern.FindStringSubmatch(scanner.Text())[1] fmt.Printf(检测到攻击尝试来自IP: %s\n, ip) } } }4. 进阶防护策略4.1 蜜罐技术应用在非标准端口设置伪SSH服务# 使用socat创建假SSH socat TCP-LISTEN:2222,fork EXEC:/bin/false 21 | logger -t fake_ssh # 针对该端口的Fail2Ban配置 [fake-ssh] enabled true port 2222 logpath /var/log/syslog maxretry 1 bantime 7d4.2 基于时间的访问控制使用time-based防火墙规则# 只允许工作时间访问UTC时间8:00-18:00 iptables -A INPUT -p tcp --dport 58234 -m time --timestart 08:00 --timestop 18:00 -j ACCEPT iptables -A INPUT -p tcp --dport 58234 -j DROP最近在客户的生产环境部署这套组合方案后SSH攻击尝试从日均1,200次降到了个位数。有个有趣的发现攻击者通常在封禁后2-3天就会放弃对该IP的尝试这比想象中要快得多。

更多文章