Fail2ban 详解与配置指南

说明:fail2ban通过与iptables的联动来阻止恶意扫描和密码猜测等恶意攻击行为从CentOS7开始,官方的标准防火墙设置软件从iptables变更为firewalld。 为了使Fail2ban与iptables联动,需禁用自带的firewalld服务,同时安装iptables服务。

一、Fail2ban理论

1.1、关于 Fail2ban

Fail2ban 是一款开源的入侵防御工具,通过监视系统日志文件,识别并响应恶意行为(如暴力破解密码、端口扫描等)。当检测到来自某个 IP 地址的多次失败尝试后,它会自动调用防火墙(如 iptables)将该 IP 地址暂时或永久封禁,并可发送邮件通知管理员。

  • 核心价值:自动化抵御暴力攻击,减少服务器被非法入侵的风险,减轻管理员负担。
  • 开发语言:Python。
  • 依赖组件:与 iptables、tcp-wrapper 等防火墙工具联动,可与 postfix 或 sendmail 集成实现邮件告警。
  • 适用场景:对外提供 SSH、FTP、Web、数据库等服务的服务器,尤其在公网环境下非常必要。

1.2、工作原理

  1. 监控日志:Fail2ban 后台进程持续监控指定的系统日志文件(如 /var/log/auth.log, /var/log/nginx/access.log)。
  2. 规则匹配:通过预定义的过滤规则(Filter),使用正则表达式匹配日志中的失败事件(如 “Failed password”, “404 Not Found”)。
  3. 触发阈值:当某个 IP 地址在特定时间窗口(findtime)内触发的失败事件达到预设次数(maxretry),则认为该 IP 存在恶意行为。
  4. 执行动作:触发阈值后,Fail2ban 会执行预设的动作(Action),最常见的动作是调用 iptables 防火墙将该 IP 地址封禁一段时间(bantime)。
  5. 自动解封:在封禁时长到期后,Fail2ban 会自动将 IP 从防火墙规则中移除,恢复其访问权限。

二、Fail2ban安装配置

官网下载

  • 依赖说明

    Required:
    Python >= 3.5 or PyPy3
    pyinotify >= 0.8.3
    dnspython
    
    # 需要用到python3, 直接用yum安装就行
    
    [root@localhost ~]# yum list all python3
    python3.x86_64                3.6.8-21.el7_9                updates
    [root@localhost ~]# yum -y install python3
    [root@localhost ~]# pip3 install pyinotify  -i https://mirrors.aliyun.com/pypi/simple/
    
  • 开始安装

    # 1. 安装依赖工具
    yum -y install wget iptables-services
    
    # 2. 禁用 firewalld 并启用 iptables
    systemctl stop firewalld
    systemctl disable firewalld
    systemctl start iptables
    systemctl enable iptables
    
    # 3. 下载、解压并安装 Fail2ban (示例版本为 1.1.0)
    yum install -y fail2ban fail2ban-systemd
    # fail2ban 			noarch  0.11.2-3.el7    epel  16 k
    # fail2ban-systemd   noarch  0.11.2-3.el7    epel  16 k
    
    # 4. 配置 systemd 服务并设置开机自启
    systemctl daemon-reload
    systemctl enable fail2ban
    systemctl start fail2ban
    
    # 5. 验证安装是否成功
    systemctl status fail2ban
    

2.1、Fail2ban 常用命令

功能说明 命令
启动服务 systemctl start fail2ban
停止服务 systemctl stop fail2ban
重启服务 (用于应用新配置) systemctl restart fail2ban
查看服务状态 systemctl status fail2ban
查看当前所有启用的 Jail 状态 fail2ban-client status
查看指定 Jail (如 sshd) 的详细状态 fail2ban-client status sshd
手动封禁一个 IP fail2ban-client set <JAIL_NAME> banip <IP_ADDRESS>
手动解封一个 IP fail2ban-client set <JAIL_NAME> unbanip <IP_ADDRESS>
查看防火墙规则 (确认封禁) iptables -L -n (查看所有链) 或 iptables -L f2b-sshd -n (查看特定链)
添加 IP 到白名单 (永久忽略) fail2ban-client set <JAIL_NAME> addignoreip <IP_ADDRESS>
从白名单中移除 IP fail2ban-client set <JAIL_NAME> delignoreip <IP_ADDRESS>

2.2、核心配置文件

安装完成后,Fail2ban 的主要配置文件位于 /etc/fail2ban/ 目录下。

  • 目录文件

    [root@localhost fail2ban]# ls /etc/fail2ban
    action.d  fail2ban.conf  fail2ban.d  filter.d  jail.conf  jail.d  paths-common.conf  paths-fedora.conf
    
  • 配置说明

    • jail.conf: 主配置文件,定义了全局默认参数和各种服务的防护规则(Jail)。不建议直接修改此文件,因为在软件升级时可能会被覆盖。
    • jail.local: 自定义配置文件,用于覆盖 jail.conf 中的设置。这是推荐的配置方式。如果文件不存在,可以手动创建。
    • filter.d/: 此目录包含各种服务的过滤规则文件(如 sshd.conf, nginx-http-auth.conf)。这些文件定义了如何从日志中识别失败尝试。
    • action.d/: 此目录包含各种动作脚本(如 iptables.conf, sendmail.conf)。这些文件定义了触发阈值后要执行的具体操作。
  • 最佳实践

    • 复制 jail.confjail.localcp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    • 所有自定义配置都在 jail.local 中进行。
    • 如需修改特定服务的过滤规则,可在 filter.d/ 目录下创建相应的 .local 文件进行覆盖。

2.3、基础配置模板 (jail.local)

  • 核心配置参数说明

    参数组 参数名 作用 示例 说明
    【全局默认设置】 bantime IP 被封禁的时长 bantime = 1h 可以使用 s(秒), m(分), h(时), d(天) 作为单位。
    findtime 统计失败次数的时间窗口 findtime = 10m 在这个时间范围内的失败次数会被累计。
    maxretry 触发封禁的最大失败次数 maxretry = 5 当失败次数在 findtime 内达到此值,触发 action
    ignoreip 忽略的 IP 地址列表 ignoreip = 127.0.0.1/8 192.168.1.0/24 白名单,不会被封禁的 IP 或 IP 段,用空格分隔。
    action 默认执行的动作 action = %(action_)s 定义了触发阈值后默认做什么,如仅封禁、发送邮件等。
    【单个 Jail 设置】 enabled 是否启用当前 Jail enabled = true true 为启用,false 为禁用。
    port 防护的端口 port = sshport = 80,443 可以是服务名或端口号,多个端口用逗号分隔。
    filter 使用的过滤器 filter = sshd 对应 /etc/fail2ban/filter.d/ 目录下的 .conf 文件。
    logpath 监控的日志文件路径 logpath = /var/log/auth.log Fail2ban 会从这个文件中读取日志进行分析。
    【邮件通知设置】 destemail 接收告警邮件的地址 destemail = admin@example.com 当触发 action_mwaction_mwl 时发送邮件。
    sender 邮件发送者地址 sender = fail2ban@example.com 邮件的 From 字段。
    mta 邮件传输代理 mta = sendmail 系统使用的邮件服务,如 sendmailpostfix
    【动作别名】 action_ 仅封禁 IP action = %(action_)s 调用防火墙封禁 IP,不发送邮件。
    action_mw 封禁并发送邮件 action = %(action_mw)s 封禁 IP,并发送包含基本信息的邮件通知。
    action_mwl 封禁、发邮件并附带日志 action = %(action_mwl)s 封禁 IP,发送邮件,并附上相关的日志片段。
  • 创建配置文件

    vim /etc/fail2ban/jail.local
    
    [DEFAULT]
    # 全局设置
    bantime  = 1h
    findtime  = 10m
    maxretry = 5
    ignoreip = 127.0.0.1/8 192.168.1.100 192.168.1.101
    action = %(action_)s  # 默认只封禁,不发邮件
    
    # 邮件通知配置 (如果需要使用 action_mw 或 action_mwl)
    destemail = your_admin@example.com
    sender = fail2ban@your-server.com
    mta = sendmail
    
    [sshd]
    enabled  = true   # 启用该防护规则
    port     = ssh    # 目标端口(SSH默认22)
    filter   = sshd   # 匹配规则(使用sshd过滤器)
    logpath  = /var/log/auth.log  # 监控的日志文件
    maxretry = 3      # 最大失败次数:3次
    findtime = 5m     # 查找时间窗口:5分钟
    bantime  = 24h    # 封禁时长:24小时
    action   = %(action_mw)s  # 动作:封禁+发送邮件通知
    
  • 配置说明

    • 全局:大部分服务的防护策略是 10 分钟内失败 5 次,封禁 1 小时。本地 IP 和管理员 IP 被设为白名单。
    • SSH:策略更严格,5 分钟内失败 3 次,就封禁 24 小时。

三、其它示例

  • 防止SSH密码爆破

    # 先备份一下原 jail.conf
    ]# cp /etc/fail2ban/jail.conf{,.bak}
    
    [ssh-iptables]模块的配置修改如下。其中,port应按照实际情况填写。
    ]# vim /etc/fail2ban/jail.conf
    [ssh-iptables]  # 这个名称在通过 fail2ban-client时会使用到
    enabled = true
    filter = sshd
    action = iptables[name=SSH, port=22, protocol=tcp]
    logpath = /var/log/secure
    maxretry = 5
    findtime = 300
    
    # 随便找一个机器 连接试五次
    ]# fail2ban-client status ssh-iptables
    Status for the jail: ssh-iptables
    |- Filter
    |  |- Currently failed:	0
    |  |- Total failed:	5
    |  `- File list:	/var/log/secure
    `- Actions
       |- Currently banned:	0
       |- Total banned:	1
       `- Banned IP list:	x.x.x.x    
    # 连续五次就会失败了
    
  • 封禁NGINX

    ]# vim /etc/fail2ban/jail.conf
    [nginx-search]
    enabled = true
    port = http,https
    filter = nginx-seach
    action = iptables-multiport[name=ModsecWaf, port="http,https", protocol=tcp]
    logpath = /etc/nginx/logs/xx.access.log
    # 半小时内访问50次就封了它
    maxretry = 50
    findtime = 600
    bantime = 172800
    ignoreip = 192.168.1.1 127.0.0.1
    
    # 配置 过滤 fileter配置文件
    vim /etc/fail2ban/filter.d/nginx-seach.conf
    [Definition]
    failregex = <HOST> [0-9]{1,5}.[0-9]{1,5} - - .* HTTP/1.*\" (404|403|200) [0-9]{1,10} .* \"Mozilla/(4|5)
    ignoreregex =
    
    # 过滤的格式为:  恶意的访问地址
    # 122.238.187.34 0.000 - - [26/Aug/2025:17:38:30 +0800] "GET /css/2xiaomei.php?a6p%2Ftydw.html HTTP/1.1" 404 47 "-" "Mozilla/5.0 (Linux; .... NetType/WIFI Language/zh_CN" "-"
    
    # 检查格式   fail2ban-regex -v 可以看到详细的地址信息
    ]# fail2ban-regex /etc/nginx/logs/xx.access.log /etc/fail2ban/filter.d/nginx-seach.conf 
    
    #  --print-all-missed  可以看到没有匹配到的访问
    
    # 通过  tailf /var/log/message可以看到匹配到的IP地址信息,或者 /var/log/fail2ban.log
    
  • 删除黑名单中的IP地址

    # 查看被禁止的地址,想要删除 
    ]# iptbales -L -n  
    Chain f2b-SSH (1 references)
    target     prot opt source               destination         
    REJECT     all  --  192.168.9.x          0.0.0.0/0            reject-with icmp-port-unreachable
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
    
    # 删除地址, 只需要一行
    ]# fail2ban-client set ssh-iptables unbanip 192.168.9.x
    
    # 查看
    ]# fail2ban-client status ssh-iptables
    Status for the jail: ssh-iptables
    |- Filter
    |  |- Currently failed:	0
    |  |- Total failed:	5
    |  `- File list:	/var/log/secure
    `- Actions
       |- Currently banned:	0
       |- Total banned:	1
       `- Banned IP list:	
    
    # 在查看iptables
    ]# iptables -L -n 
    Chain f2b-SSH (1 references)
    target     prot opt source               destination         
    RETURN     all  --  0.0.0.0/0            0.0.0.0/0           
    
    # 封禁IP
    ]# fail2ban-client set ssh-iptables banip x.0.0.x
    
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐