Fail2Ban 完整部署教程-适用Ubuntu

作用:实时监控系统日志,识别密码暴力破解,自动通过 iptables 拉黑攻击 IP,限时封禁。

一、工作原理

Fail2Ban 不会修复漏洞,持续读取 /var/log/auth.log 登录日志,匹配「密码错误」日志;

短时间内失败次数超过阈值 → 调用防火墙将 IP 丢弃;到达时间自动解封 IP。

底层默认使用 iptables,和 ufw 可以共存,互不冲突。

二、完整部署步骤

1. 安装软件

apt update
apt install fail2ban -y

2. 核心配置说明

不要直接修改 jail.conf,系统更新会覆盖!

新建自定义配置 jail.local(优先级更高)

vim /etc/fail2ban/jail.local

粘贴基础通用配置:

[DEFAULT]
# 全局默认封禁时长:86400秒 = 24小时
bantime  = 86400
# 检测时间窗口:1小时内多次失败触发封禁
findtime = 3600
# 最大尝试失败次数
maxretry = 3
# 封禁工具,使用iptables
banaction = iptables-multiport
# 开启日志
loglevel = INFO

# SSH防护【最重要】
[sshd]
enabled = true
port    = ssh
filter  = sshd
logpath = /var/log/auth.log

参数解释:

  • maxretry = 3:1 小时内密码错误≥3 次 → 拉黑 IP

  • bantime = 86400:封禁 24 小时后自动释放 IP

如果你修改 SSH 默认端口(非 22),需要填写端口号

port = 2233/

Fail2Ban jail.local 完整版【详细中文注释】

# ====================== 【全局默认配置段 [DEFAULT] ======================
# 下面参数所有监狱(jail)默认继承,子监狱可以单独覆盖
[DEFAULT]

# bantime:IP封禁持续时长(单位:秒)
# 86400 = 24小时;0=永久封禁(不推荐)
bantime  = 86400

# findtime:检测时间窗口
# 含义:在findtime时间内,失败次数超过maxretry才触发封禁
findtime = 3600

# maxretry:最大允许失败尝试次数
maxretry = 3

# 封禁动作脚本,使用iptables封禁多端口
# 可选:iptables / iptables-multiport / nftables(新版系统)
banaction = iptables-multiport

# 是否开启增量封禁(重复攻击的IP封禁时间翻倍,进阶防御)
# 第一次24h,再次被抓48h、96h……
bantime.increment = true
# 倍增系数
bantime.factor = 2
# 封禁上限,最长封禁30天(2592000秒)
bantime.maxtime = 2592000

# 【白名单IP!极其重要】本地、办公公网IP加入,永远不会被封禁
# 多个IP使用空格隔开
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 你的办公公网IP

# 日志等级:CRITICAL ERROR WARNING INFO DEBUG
loglevel = INFO

# 是否发送邮件告警(需要服务器安装postfix邮件服务,不需要可以注释)
# destemail = admin@shturl.
# sender = server@shturl.
# mta = sendmail

# ====================== 【SSH防护 核心配置】======================
[sshd]
# 启用此规则 true开启 false关闭
enabled = true

# SSH端口
# 默认22就写 ssh;如果你修改SSH端口为2233,改为 port = 2233
port    = ssh

# 使用的过滤规则,匹配日志中的失败登录
filter  = sshd

# 登录日志文件路径(Ubuntu/Debian)
# CentOS/RHEL 路径为 /var/log/secure
logpath = /var/log/auth.log

# 单独覆盖全局参数(不继承上面DEFAULT),不需要就注释
# maxretry = 3
# bantime = 86400

# ====================== 【可选拓展防护,按需开启】 ======================
# 1. Nginx网站密码爆破防护
#[nginx-auth]
#enabled = true
#filter = nginx-auth
#logpath = /var/log/nginx/error.log
#maxretry = 5

# 2. FTP vsftpd 暴力破解防护
#[vsftpd]
#enabled = true
#filter = vsftpd
#logpath = /var/log/vsftpd.log

# 3. Postfix邮件服务器防护
#[postfix]
#enabled = true
#filter = postfix
#logpath = /var/log/mail.log

3. 启动 & 开机自启

systemctl enable --now fail2ban

三、常用运维命令

# 查看服务状态
systemctl status fail2ban

# 查看SSH监狱状态(列出所有封禁IP)
fail2ban-client status sshd

# 手动解封指定IP
fail2ban-client set sshd unbanip 51.79.143.228

# 手动永久拉黑IP(不依靠自动规则)
fail2ban-client set sshd banip 1.1.1.1

# 重载配置(修改jail.local后执行)
fail2ban-client reload

四、扩展防护(可选)

除 SSH 外,还可以防护 Nginx 网站、FTP、MySQL 爆破,示例:

# Nginx 网站登录防护
[nginx-auth]
enabled = true
filter = nginx-auth
logpath = /var/log/nginx/error.log
maxretry = 5

五、关键注意事项

  1. 已经启用 SSH 密钥登录 + 关闭密码登录

理论上不会产生密码失败日志,Fail2Ban 不会触发封禁。

但依然建议保留 Fail2Ban:阻挡扫描器、恶意 TCP 频繁连接。

  1. AllowUsers、禁止 root 登录搭配使用

    Fail2Ban 是第二层防御;第一层加固永远是 SSH 配置收紧。

  2. 不要把自己办公公网 IP 误封!

    测试时调低失败次数,避免自己被拉黑远程锁机。

  3. 云服务器安全组优先级高于系统防火墙

    Fail2Ban 只能管控服务器内部,无法绕过云厂商安全组。

六、进阶优化方案

永久拉黑高频恶意 IP(永不自动解封)

修改配置,针对持续扫描 IP 使用长效封禁:

[DEFAULT]
bantime.increment = true
bantime.factor = 2
bantime.maxtime = 2592000

效果:重复攻击的 IP,封禁时间指数增长,最高封 30 天。

七、总结

Fail2Ban 属于缓解暴力破解的防御工具,不能替代基础加固。

安全分层逻辑:

SSH密钥登录 + AllowUsers白名单(第一道防线)ufw防火墙(第二道)Fail2Ban自动拉黑(第三道)

评论