linux服务-Fail2ban 详解与配置
说明:fail2ban通过与iptables的联动来阻止恶意扫描和密码猜测等恶意攻击行为从CentOS7开始,官方的标准防火墙设置软件从iptables变更为firewalld。为了使Fail2ban与iptables联动,需禁用自带的firewalld服务,同时安装iptables服务。
·
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、工作原理
- 监控日志:Fail2ban 后台进程持续监控指定的系统日志文件(如
/var/log/auth.log,/var/log/nginx/access.log)。 - 规则匹配:通过预定义的过滤规则(Filter),使用正则表达式匹配日志中的失败事件(如 “Failed password”, “404 Not Found”)。
- 触发阈值:当某个 IP 地址在特定时间窗口(
findtime)内触发的失败事件达到预设次数(maxretry),则认为该 IP 存在恶意行为。 - 执行动作:触发阈值后,Fail2ban 会执行预设的动作(Action),最常见的动作是调用 iptables 防火墙将该 IP 地址封禁一段时间(
bantime)。 - 自动解封:在封禁时长到期后,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.conf为jail.local:cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local - 所有自定义配置都在
jail.local中进行。 - 如需修改特定服务的过滤规则,可在
filter.d/目录下创建相应的.local文件进行覆盖。
- 复制
2.3、基础配置模板 (jail.local)
-
核心配置参数说明
参数组 参数名 作用 示例 说明 【全局默认设置】 bantimeIP 被封禁的时长 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 = truetrue为启用,false为禁用。port防护的端口 port = ssh或port = 80,443可以是服务名或端口号,多个端口用逗号分隔。 filter使用的过滤器 filter = sshd对应 /etc/fail2ban/filter.d/目录下的.conf文件。logpath监控的日志文件路径 logpath = /var/log/auth.logFail2ban 会从这个文件中读取日志进行分析。 【邮件通知设置】 destemail接收告警邮件的地址 destemail = admin@example.com当触发 action_mw或action_mwl时发送邮件。sender邮件发送者地址 sender = fail2ban@example.com邮件的 From字段。mta邮件传输代理 mta = sendmail系统使用的邮件服务,如 sendmail或postfix。【动作别名】 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
更多推荐



所有评论(0)