在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服务器面对暴力破解攻击的安全性会提升一个数量级。