我的论坛
登录

fail2ban 基础教程

111
  • uvim
    管理员

    Fail2ban 是一款入侵防御软件,通过监控系统日志(如 /var/log/auth.log 或 journalctl),自动识别多次尝试密码失败的恶意 IP,并通过防火墙(如 iptables、nftables、UFW)将该 IP 封禁。


    1. 安装 Fail2ban:
    根据使用的 Linux 发行版选择对应的命令安装:

    * Ubuntu / Debian:

    sudo apt update && sudo apt install fail2ban -y

    * CentOS / RHEL / Rocky Linux:

    sudo dnf install epel-release -y
    sudo dnf install fail2ban -y

    2. 创建本地配置文件 jail.local:
    Fail2ban 的默认配置文件是 /etc/fail2ban/jail.conf,但系统更新时可能被覆盖。**永远不要直接修改 jail.conf**,而是创建一个 jail.local 副本:

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

    3. 配置 SSH 防护规则:
    编辑 /etc/fail2ban/jail.local 文件:

    sudo nano /etc/fail2ban/jail.local

    找到或添加以下关键配置项:

    [DEFAULT]
    # 忽略的 IP(白名单),多个用空格隔开(如本机、管理员 IP)
    ignoreip = 127.0.0.1/8 ::1 192.168.1.100
    
    # 封禁时长(默认单位:秒),1h 表示 1 小时,1d 表示 1 天
    bantime  = 1h
    
    # 统计时间窗口:在这个时间内达到 maxretry 就会被封禁
    findtime = 10m
    
    # 允许的最大失败次数
    maxretry = 5
    
    # SSH 防护设置
    [sshd]
    enabled = true
    port    = ssh
    logpath = %(sshd_log)s
    backend = %(sshd_backend)s

    4. 启动并设置开机自启:
    启动 Fail2ban 服务并设置为开机自启:

    sudo systemctl start fail2ban
    sudo systemctl enable fail2ban

    常用管理命令

    常用操作命令
    查看服务运行状态sudo fail2ban-client status
    查看指定规则状态(如 SSH)sudo fail2ban-client status sshd
    解封指定 IPsudo fail2ban-client set sshd unbanip <IP_ADDRESS>
    手动封禁 IPsudo fail2ban-client set sshd banip <IP_ADDRESS>
    重启 Fail2bansudo systemctl restart fail2ban
    查看 Fail2ban 日志sudo tail -f /var/log/fail2ban.log
  • uvim
    管理员
    #1

    在掌握 Fail2ban 的基础配置后,进阶应用的核心在于:自定义规则(防护 Web API/暴破)、多级/永久封禁(Recidive)、动态更新白名单以及与复杂防火墙(如 UFW/nftables)配合。


    1. 永久/累犯封禁(Recidive Jail)

    如果某个攻击者在被封禁 1 小时解封后立刻继续暴破,可以通过启用 recidive 规则对这类“屡教不改”的 IP 执行长达数月甚至永久的封禁。

    编辑 /etc/fail2ban/jail.local:

    [recidive]
    enabled  = true
    logpath  = /var/log/fail2ban.log
    banaction = %(banaction_allports)s
    # 在 1 天内如果被 Fail2ban 封禁过 2 次
    findtime = 1d
    maxretry = 2
    # 则直接封禁 1 周(甚至可设为 -1 表示永久封禁)
    bantime  = 1w

    2. 自定义 Filter(以 Nginx 防刷/防暴破为例)

    Fail2ban 自带了常见服务的规则,但对于自定义 Web 应用或特定的恶意 HTTP 行为,需要编写自定义 Filter。

    1. 创建自定义 Filter 规则:
    在 /etc/fail2ban/filter.d/ 目录下创建 nginx-cc.conf:

    [Definition]
    # 匹配日志中频繁请求特定 API 或返回 401/403/404 的恶意行为
    failregex = ^<HOST> -.*"(GET|POST) /api/v1/auth/login HTTP/.*" (401|403)
    ignoreregex =

    2. 验证正则匹配效果: 非常重要.
    在启用规则前,使用 fail2ban-regex 测试正则表达式是否能正确解析日志:

    sudo fail2ban-regex /var/var/log/nginx/access.log /etc/fail2ban/filter.d/nginx-cc.conf

    验证:看输出结果中的 Failures 统计数字是否大于 0。

    3. 在 jail.local 中启用自定义 Jail:
    编辑 /etc/fail2ban/jail.local 引入该规则:

    [nginx-cc]
    enabled  = true
    port     = http,https
    filter   = nginx-cc
    logpath  = /var/log/nginx/access.log
    maxretry = 20
    findtime = 1m
    bantime  = 1d

    3. 配置防火墙 Action(UFW / Nftables / Cloudflare)

    Fail2ban 默认通过修改底层的 iptables 实现封禁,但在特定环境中可配置更高级的 Action。

    配合 UFW 使用

    若服务器启用了 UFW,建议将默认 banaction 改为 ufw,避免 iptables 规则冲突:

    [DEFAULT]
    banaction = ufw

    配合 Cloudflare 封禁(适用于 Web 服务)

    如果 Web 服务开启了 Cloudflare CDN,攻击者的真实 IP 在 HTTP Header 中(X-Forwarded-For),且传统的本地 iptables 无法拦截边缘节点的请求。可以通过 Cloudflare API 自动将 IP 加入 Cloudflare 网页防火墙:

    1. 编辑 /etc/fail2ban/jail.local:

    [nginx-cc]
    enabled   = true
    action    = cloudflare[cfuser="[email protected]", cftoken="your_cloudflare_api_token"]

    2. 当触发规则时,Fail2ban 会直接在 Cloudflare 边缘节点封禁该 IP。


    4. 动态白名单与 Cloudflare/DDNS

    如果你的管理员 IP 是动态分配的(如家用的宽带),为了防止自己被意外误封:

    [DEFAULT]
    # 忽略本地 IP,并可通过域名指定白名单(Fail2ban 会自动解析 DNS)
    ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24 my-admin-home.ddns.net

    5. 进阶调试与排查

    需求命令
    测试单个 Filter 正则fail2ban-regex <日志路径> <Filter配置文件或正则>
    查看特定 Jail 封禁的 IP 列表sudo fail2ban-client status sshd
    实时监控 Fail2ban 封禁动作sudo tail -f /var/log/fail2ban.log | grep "Ban"
    清空指定 Jail 中的所有封禁记录sudo fail2ban-client unban --all

发表回复

登录后回复