Fail2Ban核心架构学习

Fail2Ban 的核心价值就在于精细化配置 ,包含原理拆解、文件结构、自定义规则、多服务防护、排错的超详细指南,全程适配 Ubuntu 系统。


一、Fail2Ban 核心架构(先懂原理再配)

Fail2Ban 由 3 个核心组件协同工作,理解这个能避免配置时踩坑:

  1. Jail(规则容器)
    • 是 Fail2Ban 的核心配置单元,一个 Jail 对应一个防护场景(如 SSH 防护、Apache 防护)。
    • 每个 Jail 包含 监控日志路径、匹配规则、封禁参数 三部分。
  2. Filter(过滤规则)
    • 本质是正则表达式集合,用来从日志中识别恶意行为(如 SSH 密码错误、Web 404 爆破)。
    • 存放路径:/etc/fail2ban/filter.d/,文件后缀为 .conf
  3. Action(执行动作)
    • 触发规则后要执行的操作,默认是调用防火墙封禁 IP,也可以自定义(如发送邮件告警)。
    • 存放路径:/etc/fail2ban/action.d/,常用动作是 iptables-multiport(多端口封禁)。

二、Ubuntu 下 Fail2Ban 完整安装与初始化

1. 安装与依赖检查

bash

运行

复制代码
# 安装 Fail2Ban
sudo apt update && sudo apt install fail2ban -y

# 检查依赖(确保 iptables/ufw 已安装,Ubuntu 默认有)
sudo apt install iptables ufw -y

# 启动并设置开机自启
sudo systemctl start fail2ban
sudo systemctl enable fail2ban

# 验证状态(显示 active (running) 则正常)
sudo systemctl status fail2ban

2. 配置文件目录结构详解

Fail2Ban 的配置文件遵循 "主配置 + 自定义配置" 原则,永远不要直接修改默认文件 ,而是在 jail.d 目录新建自定义配置覆盖默认值:

plaintext

复制代码
/etc/fail2ban/
├── fail2ban.conf          # 全局主配置(日志级别、进程 PID 等,一般不修改)
├── jail.conf              # 默认规则模板(包含 SSH、Apache 等,仅作参考)
├── jail.d/                # 自定义规则目录(优先级最高,推荐放这里)
│   ├── ssh.conf           # 你的 SSH 防护配置
│   └── apache.conf        # 你的 Web 防护配置
├── filter.d/              # 过滤规则目录(正则表达式)
│   ├── sshd.conf          # SSH 日志匹配规则
│   └── apache-auth.conf   # Apache 认证失败匹配规则
└── action.d/              # 动作脚本目录(封禁/告警等)
    └── iptables-multiport.conf  # 多端口封禁动作

三、核心配置参数详解(必懂)

不管是配置 SSH 还是 Web 防护,都离不开这些核心参数,下面逐一解释:

参数 作用 示例值 说明
enabled 是否启用该 Jail true/false 只有设为 true 才会生效
port 防护的端口 ssh/http,https/80,443,22 支持服务名或端口号,多个用逗号分隔
filter 关联的过滤规则 sshd/apache-auth 对应 filter.d 下的 .conf 文件
logpath 监控的日志文件路径 /var/log/auth.log 支持通配符,如 /var/log/apache2/*.log
maxretry 最大失败次数 3/5 超过次数则封禁
bantime 封禁时长(秒) 3600(1 小时) 设为 -1 表示永久封禁
findtime 统计时间窗口(秒) 600(10 分钟) 比如 10 分钟内失败 5 次触发封禁
ignoreip 白名单 IP 127.0.0.1 192.168.1.0/24 多个 IP / 网段用空格分隔,不会被封禁
action 触发后执行的动作 %(action_)s 默认是封禁 IP,%(action_mw)s 是封禁 + 发邮件

四、实战配置 1:SSH 深度防护(最常用)

SSH 是服务器最容易被暴力破解的入口,下面配置严格的防护规则,并加入邮件告警:

1. 新建 SSH 自定义配置

bash

运行

复制代码
sudo nano /etc/fail2ban/jail.d/sshd.conf

粘贴以下内容(参数已优化,适合生产环境):

ini

复制代码
[sshd]
# 基础防护参数
enabled = true
port = ssh  # 等价于 22 端口
filter = sshd
logpath = /var/log/auth.log  # SSH 日志默认路径
maxretry = 3  # 3 次密码错误就封禁
bantime = 86400  # 封禁 24 小时
findtime = 900  # 15 分钟内统计失败次数
ignoreip = 127.0.0.1 192.168.1.0/24  # 白名单:本地+内网

# 高级配置:启用邮件告警(需先安装 postfix)
action = %(action_mw)s  # action_mw = 封禁 IP + 发送邮件(含日志)
sender = fail2ban@your-server.com  # 发件人邮箱
destemail = your-email@xxx.com  # 收件人邮箱
mta = sendmail  # 邮件代理,Ubuntu 用 sendmail 即可

2. 安装邮件服务(可选,用于告警)

bash

运行

复制代码
# 安装 sendmail
sudo apt install sendmail -y

# 重启 Fail2Ban 使配置生效
sudo systemctl restart fail2ban

3. 验证 SSH 防护是否生效

bash

运行

复制代码
# 查看 sshd 规则状态(会显示已封禁 IP 列表)
sudo fail2ban-client status sshd

# 测试:故意输错 3 次 SSH 密码,再查看状态,会看到自己的 IP 被封禁

五、实战配置 2:Web 服务防护(Apache/Nginx)

针对 Web 服务的密码爆破、恶意扫描、SQL 注入探测等行为,配置 Fail2Ban 防护:

1. Apache 防护配置

bash

运行

复制代码
sudo nano /etc/fail2ban/jail.d/apache.conf

粘贴以下内容,包含 3 个防护场景:

ini

复制代码
# 场景1:Apache 登录认证失败(如后台登录密码错误)
[apache-auth]
enabled = true
port = http,https
filter = apache-auth
logpath = /var/log/apache2/*error.log
maxretry = 3
bantime = 3600
findtime = 600

# 场景2:Apache 恶意爬虫/扫描(如频繁 404 请求)
[apache-badbots]
enabled = true
port = http,https
filter = apache-badbots
logpath = /var/log/apache2/*access.log
maxretry = 1  # 只要匹配到恶意爬虫就封禁
bantime = 86400
ignoreip = 127.0.0.1 192.168.1.0/24

# 场景3:Apache SQL 注入探测(匹配日志中的 union/select 等关键词)
[apache-sql]
enabled = true
port = http,https
filter = apache-sql  # 这个过滤规则需要自己新建
logpath = /var/log/apache2/*access.log
maxretry = 1
bantime = 86400

2. 自定义 SQL 注入过滤规则

上面的 apache-sql 过滤规则是自定义的,需要在 filter.d 目录新建文件:

bash

运行

复制代码
sudo nano /etc/fail2ban/filter.d/apache-sql.conf

粘贴正则规则(匹配常见 SQL 注入关键词):

ini

复制代码
[Definition]
# 正则匹配日志中包含 union/select/insert 等关键词的请求
failregex = ^<HOST> -.*"(GET|POST).*(union|select|insert|delete|drop).*"
ignoreregex =  # 忽略的正则,留空即可

3. Nginx 防护配置(替换 Apache 即可)

Nginx 的配置和 Apache 类似,只需修改 filterlogpath

ini

复制代码
[nginx-auth]
enabled = true
port = http,https
filter = nginx-auth
logpath = /var/log/nginx/*error.log
maxretry = 3
bantime = 3600

六、Fail2Ban 常用命令(运维必备)

功能 命令
查看所有启用的规则 sudo fail2ban-client status
查看单个规则详情(如 sshd) sudo fail2ban-client status sshd
手动封禁 IP(针对 sshd 规则) sudo fail2ban-client set sshd banip 192.168.1.100
手动解封 IP sudo fail2ban-client set sshd unbanip 192.168.1.100
重载配置(无需重启服务) sudo fail2ban-client reload
测试过滤规则是否匹配日志 sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf

七、常见问题与排错指南

  1. 问题 1:Fail2Ban 启动失败

    • 排查方法:查看日志 sudo tail -f /var/log/fail2ban.log,通常是配置文件语法错误(如少逗号、括号)。
    • 解决:检查 jail.d 目录下的 .conf 文件,确保参数格式正确。
  2. 问题 2:封禁后 IP 仍能访问

    • 原因:防火墙未启动,或 Fail2Ban 动作与防火墙不兼容。
    • 解决:启动 ufw 防火墙 sudo ufw enable,并确保 action 使用 iptables-multiport
  3. 问题 3:误封自己的 IP

    • 解决:立即解封 sudo fail2ban-client set sshd unbanip 你的IP,并将 IP 添加到 ignoreip 白名单。
  4. 问题 4:邮件告警不生效

    • 原因:未安装 sendmail,或邮箱配置错误。
    • 解决:安装 sendmail sudo apt install sendmail -y,并检查 senderdestemail 参数。

八、进阶技巧:永久封禁恶意 IP

如果想对频繁攻击的 IP 永久封禁,只需将 bantime = -1,并配合 fail2ban 的持久化配置:

相关推荐
黑客思维者5 小时前
为什么Linux常被提权操作?
linux·网络·安全
阿阿越5 小时前
Linux系统编程 -- 进程优先级、切换和调度
linux·运维·服务器
Hey小孩5 小时前
Linux审计组件:auditd
linux·运维
逑之5 小时前
学习使用typora
学习
老兵发新帖5 小时前
ubuntu网络管理功能分析
数据库·ubuntu·php
水天需0105 小时前
Vim 标签页(Tab)操作详解
linux
走在路上的菜鸟6 小时前
Android学Dart学习笔记第十三节 注解
android·笔记·学习·flutter
DeeplyMind6 小时前
第5章:并发与竞态条件-15:Atomic Variables
linux·驱动开发·ldd
sszdlbw6 小时前
后端springboot框架入门学习--第一篇
java·spring boot·学习