在CentOS服务器上,暴力破解SSH密码是最常见的攻击手段之一,每天都有大量自动化脚本在扫描和尝试登录你的服务器。Fail2ban是一款开源的动态防御工具,它通过实时监控日志文件,自动封禁那些短时间内多次登录失败的IP地址,从而有效阻止暴力破解攻击。下面直接给出在CentOS 7/8/9上完整安装和配置Fail2ban的具体操作步骤,包括SSH防护、自定义规则、白名单设置和长期优化策略。
一、为什么CentOS服务器必须装Fail2ban
CentOS作为企业级Linux发行版,默认只开放了SSH远程管理端口(22端口)。如果你不做任何防护,攻击者会用字典不断尝试用户名和密码组合。一旦密码被猜中,服务器就会被完全控制,数据泄露、挖矿程序植入、勒索病毒感染等后果不堪设想。Fail2ban的核心原理很简单:它持续读取/var/log/secure等日志文件,当发现某个IP在设定时间内失败登录次数超过阈值,就自动调用防火墙(iptables或firewalld)把这个IP拉黑。这种动态封禁比固定防火墙规则更智能,因为它是根据实际攻击行为实时响应的。
二、安装Fail2ban的完整步骤
首先确保系统已更新到最新状态,然后安装Fail2ban。CentOS 7使用yum,CentOS 8/9使用dnf,操作基本一致。
# 更新系统 yum update -y # 安装EPEL源(CentOS 7需要,8/9自带) yum install epel-release -y # 安装Fail2ban yum install fail2ban -y # 启动服务并设置开机自启 systemctl start fail2ban systemctl enable fail2ban # 查看运行状态 systemctl status fail2ban
安装完成后,不要直接修改/etc/fail2ban/jail.conf这个主配置文件,而是复制一份本地配置文件来修改,这样升级时不会覆盖你的设置。
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
三、配置SSH暴力破解防护规则
打开jail.local文件,找到[sshd]部分进行配置。默认情况下sshd规则是开启的,但参数需要根据实际情况调整。
[sshd] enabled = true port = ssh filter = sshd logpath = /var/log/secure maxretry = 5 findtime = 600 bantime = 3600 action = %(action_mwl)s
这里每个参数的含义要搞清楚:maxretry=5表示5次失败就封禁;findtime=600表示在600秒(10分钟)内累计5次失败才触发;bantime=3600表示封禁1小时。action_mwl是一个组合动作,包括发送带有whois信息的邮件通知、在日志中记录封禁信息、以及通过防火墙封禁IP。如果你不需要邮件通知,可以改成action = %(action_)s,只做封禁不发邮件。
四、配置防火墙后端(firewalld或iptables)
CentOS 7默认用firewalld,CentOS 8/9也是。Fail2ban需要知道用哪种防火墙来执行封禁操作。在jail.local的[DEFAULT]部分设置:
[DEFAULT] banaction = firewallcmd-ipset
如果你用的是iptables,就改成banaction = iptables-multiport。如果用firewalld但没有ipset,可以改成banaction = firewallcmd-allports。设置完之后重启fail2ban让配置生效。
systemctl restart fail2ban
五、设置IP白名单防止误封自己
这一步非常关键。如果你配置不当,可能把自己的IP也封了,导致无法远程登录。在jail.local的[DEFAULT]部分添加ignoreip配置:
[DEFAULT] ignoreip = 127.0.0.1/8 192.168.1.0/24 你的固定公网IP
把127.0.0.1(本地回环)和你的办公网络IP段、以及你自己的固定公网IP都加进去。如果你是动态IP,建议通过其他方式(比如控制台)管理服务器,或者用SSH密钥登录来减少被封的风险。
六、自定义filter规则增强防护
Fail2ban自带的sshd filter通常够用,但你可以创建自定义规则来应对更复杂的攻击场景。比如针对特定的恶意用户名尝试,或者针对非标准SSH端口的防护。
创建自定义filter文件:
vim /etc/fail2ban/filter.d/sshd-custom.conf
[Definition]
failregex = ^%(__prefix_line)s(?:error: PAM: )?[Aa]uthentication (?:failure|error) for .* from <HOST>(?: port \d+)?(?: ssh\d*)?$
^%(__prefix_line)s(?:Failed|Invalid) (?:password|pubkey) for .* from <HOST>(?: port \d+)?(?: ssh\d*)?$
^%(__prefix_line)s[Rr]eceived (?:disconnect|disconnect from) from <HOST>(?: port \d+)?(?: ssh\d*)?: .*$
ignoreregex =
然后在jail.local中引用这个自定义filter:
[sshd] filter = sshd-custom
七、监控Fail2ban运行状态和日志
装好之后要持续监控,确认它在正常工作。查看fail2ban的整体状态:
fail2ban-client status
查看sshd这个jail的详细状态,包括当前被封禁的IP列表:
fail2ban-client status sshd
如果发现某个IP被误封,可以手动解封:
fail2ban-client set sshd unbanip 1.2.3.4
查看fail2ban自己的运行日志排查问题:
tail -f /var/log/fail2ban.log
八、配合SSH密钥登录从根本上杜绝密码破解
Fail2ban是被动防御,最好的策略是主动消除密码登录这个攻击面。在CentOS上配置SSH密钥登录:
# 在本地机器生成密钥对 ssh-keygen -t ed25519 -C "your_email@example.com" # 把公钥传到服务器 ssh-copy-id root@你的服务器IP # 修改SSH配置禁止密码登录 vim /etc/ssh/sshd_config
PasswordAuthentication no PubkeyAuthentication yes PermitRootLogin prohibit-password
# 重启SSH服务 systemctl restart sshd
配置完成后,即使攻击者有密码也无法登录,Fail2ban作为第二道防线依然有价值,可以防止其他端口的暴力尝试和异常扫描行为。
九、进阶优化:多jail防护和告警策略
除了SSH,你还可以用Fail2ban保护其他服务。比如Nginx的登录页面、数据库端口、FTP服务等。在jail.local中添加:
[nginx-http-auth] enabled = true port = http,https filter = nginx-http-auth logpath = /var/log/nginx/error.log maxretry = 3 bantime = 7200 [nginx-limit-req] enabled = true port = http,https filter = nginx-limit-req logpath = /var/log/nginx/error.log maxretry = 10 findtime = 60 bantime = 1800
对于告警,建议配置邮件通知或者接入企业微信、钉钉等Webhook。在action.d目录下创建自定义action脚本,把封禁事件推送到你的即时通讯工具,这样即使不在服务器前也能第一时间知道有攻击发生。
十、常见问题排查和注意事项
第一,如果发现fail2ban启动失败,检查日志看是不是banaction配置和实际防火墙不匹配。第二,CentOS 8/9用的是nftables作为底层,firewalld底层也是nftables,如果banaction设置不对可能封禁不生效,需要确认firewalld-ipset是否可用。第三,不要把maxretry设得太低(比如1或2),正常用户输错一两次密码很常见,太低会频繁误封。第四,bantime也不要设太长,建议1-24小时之间,太长可能影响共享IP的其他用户,而且攻击者换IP很快,封太久意义不大。第五,定期检查/var/log/fail2ban.log,如果发现大量封禁记录,说明你的服务器正在被高频扫描,需要考虑是否更换SSH端口或者增加更多防护层。
总结一下,Fail2ban在CentOS上的部署并不复杂,核心就是安装、配置jail规则、设置白名单、配合防火墙后端、再加上SSH密钥登录这套组合拳。动态防御的精髓在于"根据行为实时响应",而不是一刀切的静态规则。把这套方案落实到位,你的CentOS服务器面对暴力破解攻击的安全性会提升一个数量级。
