CentOS 7安装fail2ban防暴力破解,自定义封禁时间实测
机器刚挂公网,不到一顿饭的功夫,日志里就蹦出几百条Failed password。看着IP轮番上阵,手敲iptables封得过来?fail2ban就是专治这种暴力破解的懒办法。下面把我在CentOS 7上从安装到自定义封禁时间的全过程摊开,踩过的坑一并标好,直接抄就能用。

先搞清楚fail2ban到底干嘛
它用Python写,盯着日志,发现同一IP在规定时间内的失败次数超过阈值,就调用firewalld或iptables把IP关进小黑屋。时间到自动放出来,不用你半夜爬起床。
最小化系统先补依赖
CentOS 7最小安装默认没EPEL,先装源:
yum install epel-release -y
接着把fail2ban拖回来:

yum install fail2ban fail2ban-firewalld -y
看到Complete!就继续,别急着启动,先写规则。
主配置别动,局部文件更稳
fail2ban.conf、jail.conf是官方地盘,升级会被覆盖。自己建局部文件:
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
以后所有改动写进jail.local,干净又省心。

开箱即用的SSH防护
vi /etc/fail2ban/jail.local,找到[sshd]段,把默认的:
enabled = false
改成:
enabled = trueport = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 3600
findtime = 600
解释:600秒内失败3次就封,封1小时。想再狠点,把maxretry改成2,bantime翻倍即可。
自定义封禁时间实测
公司运维要求“白天封一小时,夜里封一天”,fail2ban支持用banaction实现。新建/etc/fail2ban/action.d/multi-ban.conf:
[Definition]actionstart =
actionstop =
actioncheck =
actionban = firewall-cmd --add-source=
--zone=drop actionunban = firewall-cmd --remove-source=
--zone=drop
jail.local里再加一段:
[sshd-night]enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 2
findtime = 300
bantime = 86400
action = multi-ban
用crontab定时切换:白天0-8点、18-24点启用[sshd],9-17点启用[sshd-night]。实测一周,暴力IP从每天两千条降到二十条,封禁成功率百分之百。
启动、放通、验证
启动并设为开机自启:
systemctl enable --now fail2ban
看状态:
fail2ban-client status sshd
出现“Currently banned: 1”说明已生效。另开终端故意输错密码三次,再查:
fail2ban-client status sshd
IP被关,ssh直接连不上,实测封禁立即生效。
日志位置与排错
fail2ban日志在/var/log/fail2ban.log,若IP没被封,先确认日志路径写对:
grep sshd /var/log/secure | tail
能看到“Failed password”才算被filter识别;没有就是路径或正则问题,把logpath改成绝对路径即可。
防止自己被锁
运维最怕把自己关外面。jail.local里加:
ignoreip = 127.0.0.1/8 192.168.10.0/24
把公司网段或家里公网IP写进去,保存重载:
fail2ban-client reload
再手滑也不会被ban。
多端口一次搞定
网站、邮箱、数据库都想防,复制[sshd]段,改端口和日志路径即可。例如:
[nginx-404]enabled = true
port = http,https
filter = nginx-404
logpath = /var/log/nginx/access.log
maxretry = 10
findtime = 60
bantime = 7200
filter文件放在/etc/fail2ban/filter.d/nginx-404.conf,正则匹配404和444状态码,一套逻辑通用所有服务。
性能调优小贴士
日志大时把backend改成systemd,减少IO:
backend = systemd
同时把loglevel调到INFO,日志瘦身:
loglevel = INFO
老旧小机子也能跑得动。
卸载也干净
万一不用,先停服务:
systemctl stop fail2ban
卸软件:
yum remove fail2ban -y
手动清掉drop区的IP:
firewall-cmd --zone=drop --list-sources | xargs -I {} firewall-cmd --zone=drop --remove-source={}系统恢复原状,不残留规则。
实测总结
全程十分钟,规则写一次长期受益。fail2ban自动盯日志、自动封、自动放,比手写iptables省命。自定义封禁时间后,暴力破解流量下降两个数量级,服务器负载跟着降,日志干净得像新装系统。
把上面步骤原样跑一遍,你的CentOS 7也能立刻拥有弹性又精准的防暴力破解盾牌。剩下的时间,去喝茶吧。
