搭建自己的WEB应用防火墙

之前给客户搭建的网站服务近期频繁遭受恶意扫描、暴力破解攻击,日志里记录着各种奇葩的请求地址,导致Tomcat线程资源耗尽,最终nginx报504(网关超时),在服务器上curl本地请求依然卡死,即让网站无法正常访问,也存在着巨大的安全隐患。奈何没米买WAF防火墙,咱只能发挥老一辈精神撸起袖子自己干,我决定在服务器上搭建 fail2ban 安全工具!!!

名称版本备注
操作系统CentOS 7.9
fail2ban0.10.2一个用于阻止暴力破解攻击的安全工具
nginx1.6.3代理访问服务,域名端口转发、静态资源和证书等
tomcat8.0.53网站实际部署的应用服务器

一、安装 fail2ban

  1. 安装 EPEL 源

    sudo yum install epel-release -y
    

    fail2ban 在 CentOS 默认源中不包含,需要添加 EPEL 源。

  2. 安装 fail2ban

    sudo yum install fail2ban -y
    

    安装很简单,完成后系统会自动启动和添加 fail2ban 相关服务及配置文件。

二、配置监控策略和过滤器

  1. 复制配置文件模板
    安装后有默认主配置文件 /etc/fail2ban/jail.conf,复制一份到 jail.local,避免直接修改官方配置文件,便于后续更新。

    sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
    
  2. 配置 jail.local 文件

    sudo vi /etc/fail2ban/jail.local
    

    jail.local作为用户自定义的本地配置文件,用来覆盖jail.conf的设置。Faile2ban会优先读取并保留这个文件,Fail2ban升级时也不会被覆盖。
    示例,我希望监控Tomcat服务,配置如下:

    [tomcat-access]
    enabled = true
    filter = tomcat-access
    logpath = /opt/tomcat/logs/localhost_access_log.*.txt
    maxretry = 5
    findtime = 300
    bantime = 3600
    backend = auto
    action = iptables-multiport[name=tomcat, port="80,443", protocol=tcp]
    

    参数说明:

    属性说明
    enabled启用该规则,true启用,false禁用或者注释该属性。
    filter指定使用哪个过滤器定义文件,对应文件名前缀。
    logpath指定需要监控的日志路径,可以使用通配符(例如按日期命名的日志文件)。Fail2Ban 会自动扫描这些文件并实时读取新增日志。
    maxretry在 findtime 指定的时间段内(例如 5 分钟),同一个 IP 如果触发了 failregex 规则 5 次,就会被封禁。
    findtime监控时间窗口,单位为秒。表示 Fail2Ban 会在过去 300 秒(即 5 分钟)内累计每个 IP 的违规次数。
    bantime封禁时间,单位为秒(这里是 1 小时)。一个 IP 被封后,在 bantime 时间结束前不能再次访问。可设置为:-1 永久封禁;0 不封 IP,但会执行其他 action(如发邮件)。
    action指定封禁方式和封禁哪些端口及协议。iptables-multiport 是 Fail2Ban 提供的一个内置 action 模板,表示用 iptables 拒绝多个端口的访问。
  3. 配置拦截器filter

    sudo vi /etc/fail2ban/filter.d/tomcat-access.conf
    

    前面介绍的jail.local是用来配置应用场景,而filter是用来定义拦截规则。可以理解为:

    • Filter = 你想拦截什么?(匹配什么日志内容)
    • Jail = 你在哪儿拦截?多久内拦截?封多久?怎么封?
      两者配合使用,才能让 Fail2Ban 正常工作。
      示例,我希望拦截非法访问(匹配404、尝试非法路径、异常请求等等):
    [Definition]
    failregex = ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 404^<HOST> -.*"(GET|POST).*wp-login.php.*HTTP.*"^<HOST> -.*"(GET|POST).*\.env.*HTTP.*"^<HOST> -.*"(GET|POST).*\.git.*HTTP.*"
    ignoreregex =
    

    参数说明:

    属性说明
    Definition这是 Fail2Ban 规则文件的标准节名,表示你要定义一个“过滤器规则”。
    failregex核心正则表达式,用于匹配目标日志文件中可疑/恶意行为的日志行。每行一个正则表达式;关键是识别出 IP 地址(用 占位);一旦匹配,就会记录这个 IP 的一次“违规行为”;如果同一个 IP 在 jail 设定的 findtime 时间内达到 maxretry 次数,就触发封禁。
    ignoreregex这里你可以写入要排除的正则表达式。如果某些请求虽然匹配 failregex,但你认为是“白名单”,可以写在这里;它会被优先执行;通常为空即可。

    failregex正则表达式详解,以上面示例说明如下:

    ^<HOST> -.*"(GET|POST|HEAD).*HTTP.*" 404
    

    匹配如:
    192.168.1.100 - - [时间] “GET /test.php HTTP/1.1” 404,表示这个 IP 请求了一个不存在的路径(404)。

    ^<HOST> -.*"(GET|POST).*wp-login.php.*HTTP.*"
    

    匹配 WordPress 登录页面攻击(即使你不用 WordPress,也有很多扫描器会试图访问)。

    	^<HOST> -.*"(GET|POST).*\.env.*HTTP.*"
    

    .env 文件包含敏感环境变量,攻击者扫描时常用路径。

    ^<HOST> -.*"(GET|POST).*\.git.*HTTP.*"
    

    .git 被误暴露时会泄露源码,扫描器会尝试访问。

    <HOST>
    

    这是 Fail2Ban 特定的占位符,代表被拦截 IP 的位置。它告诉 Fail2Ban “从这部分提取 IP 地址”,并用于计数和封禁。

    例如日志文件内容如下:

    192.168.1.10 - - [24/Jun/2025:11:03:01 +0800] "GET /.env HTTP/1.1" 404 987
    

    Fail2Ban会提取 192.168.1.10,作为封禁目标。

    这里只是举了一个简单示例,还有很多拦截器配置内容,大家可以根据需要防护的内容去配置,具体配置内容可以搜索或AI询问即可。

三、配置 SSH 防护

  1. 启用 SSH 保护
    在 jail.local 文件中找到 [sshd] 部分,设置 enabled = true
  2. 自定义 SSH 端口防护(如果更改默认端口)
    若服务器 SSH 端口非默认 22,需添加以下内容:
    [sshd]
    port = 2222
    
    将 2222 替换为实际端口号。

四、启动与管理

  1. 启动 fail2ban

    sudo systemctl start fail2ban
    

    安装完成系统已经自动启动。

  2. 设置开机自启

    sudo systemctl enable fail2ban
    
  3. 重启服务

     sudo systemctl restart fail2ban
    

    每次修改配置后需要重启生效。

  4. 查看状态

    sudo fail2ban-client status
    

    可以查看当前防护拦截器的列表。

  5. 查看拦截日志

    sudo fail2ban-client status [拦截器名称]
    

    例如:

    sudo fail2ban-client status tomcat-access
    

    返回结果如下:

    Status for the jail: tomcat-access
    |- Filter
    |  |- Currently failed:	0
    |  |- Total failed:	0
    |  `- File list:	/opt/tomcat/logs/localhost_access_log.2024-08-23.txt /opt/tomcat/logs/localhost_access_log.2025-06-02.txt 此处省略掉若干文件名称......
    `- Actions|- Currently banned:	0|- Total banned:	0`- Banned IP list:	
    

    参数说明:

    属性说明
    Status for the jail显示当前你查看的是名为 tomcat-access 的 jail(监控规则块)。
    Currently failed当前时间窗口(findtime,如 300 秒)内,有“多少个 IP 正在违反规则”。这表示当前没有 IP 正在被 Fail2Ban 判断为恶意(匹配到 failregex)。
    Total failed自 Fail2Ban 启动以来,这个 jail 触发过多少次 failregex。为 0 表示从未匹配成功,注意检查:1.failregex 正则没匹配到日志内容;2.日志路径不对;3.日志格式与正则不符;4.服务本身没有被攻击。
    File listFail2Ban 正在读取并监控的日志文件列表。在你的配置中,它包括多个 localhost_access_log.YYYY-MM-DD.txt 文件(Tomcat 的访问日志),用于分析是否存在异常访问行为。
    Currently failed当前时间窗口(findtime,如 300 秒)内,有“多少个 IP 正在违反规则”。这表示当前没有 IP 正在被 Fail2Ban 判断为恶意(匹配到 failregex)。
    Currently banned当前被封禁的 IP 数量为 0。说明没有 IP 正在被防火墙屏蔽。
    Total banned历史上这个 jail 封过多少 IP。0 表示你这条规则还没有成功拦过任何人。
    Banned IP list当前封禁列表。为空表示没有 IP 被 ban。

五、进阶配置

  1. 配置邮件报警
    编辑 jail.local 文件,添加以下内容:

    destemail = your_email@example.com
    sender = fail2ban@example.com
    mta = sendmail
    action = %(action_mwl)s
    

    替换为实际邮箱地址,并确保邮件服务正常运行。

  2. 添加自定义过滤规则
    /etc/fail2ban/filter.d/ 目录下创建自定义过滤文件,如 custom-sshd.conf,编写正则表达式匹配日志中的攻击行为。

六、注意事项与难点

  1. 文件权限
    配置文件权限不要过于开放,建议保持默认权限,避免安全风险。
  2. 日志路径准确性
    确保 fail2ban 配置的日志路径与实际服务日志路径一致,否则无法正确识别攻击。
  3. 误封问题
    合理设置参数,避免因网络波动等正常情况导致自己被误封,可设置白名单:
    [sshd]
    ignoreip = 192.168.1.100 10.0.0.0/24
    

七、下一步思考

目前配置已有效抵御暴力破解攻击,但还可以进一步完善:

  1. 集成更多服务防护规则,如 Apache、Nginx 等 Web 服务。
  2. 探索与云防火墙联动,实现更高级的防护策略。
  3. 定期分析 fail2ban 日志,优化过滤规则,提升防护精准度。

通过在 CentOS 7 上部署 fail2ban,服务器的安全防线得到了显著加强,恶意攻击行为得到了有效遏制。后续会持续优化配置,构建更稳固的安全体系。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86888.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86888.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86888.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:CRUD操作

目录 XML模版一、结果返回集二、查询三、查询详情四、新增4.1 不含逗号4.1 含逗号 五、修改5.1 不含逗号5.2 含逗号 六、删除 XML模版 xml <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3…

智慧园区综合管理平台:提升园区运营效能的核心利器

在数字化浪潮席卷各个领域的当下&#xff0c;智慧园区的建设成为了推动产业升级、提升管理效率和服务质量的关键举措。而综合管理平台作为智慧园区的 “大脑”&#xff0c;整合了园区运营的各类功能&#xff0c;为园区管理者和企业提供了全方位的支持。本文将基于一份智慧园区功…

碰一碰发视频源码搭建,支持OEM

在数字化生活日益普及的今天&#xff0c;便捷的信息传输方式成为用户的迫切需求。“碰一碰发视频” 功能凭借其新颖的交互体验和高效的数据传输特性&#xff0c;在社交分享、文件传输等场景中备受青睐。本文将深入探讨碰一碰发视频源码搭建的定制化开发流程&#xff0c;涵盖核心…

Walrus为数据存储带来可编程性

要点总结 Walrus 是下一代去中心化存储协议&#xff0c;旨在突破传统中心化云存储的局限&#xff0c;如高昂成本、单点故障、审查和隐私风险等&#xff0c;同时相较于其他去中心化存储系统也做出了诸多创新&#xff0c;尤其是在可编程性与性能上的提升。“blob” 即 Binary La…

React:利用计算属性名特点更新表单值

需求&#xff1a;三个input框&#xff0c;在input框输入时候&#xff0c;获取最新值&#xff0c;进行数据更新 思路&#xff1a;name属性的变量设置的和表单的变量一样&#xff0c;方便通过name属性更新值 function TenantManage() {const [formData, setFormData] useState…

【软考高项论文】论信息系统项目的范围管理

摘要 在信息系统项目管理里&#xff0c;范围管理极为关键。有效的范围管理可保障项目按时、按质、按量完成&#xff0c;避免变更带来的混乱与成本超支。本文结合作者参与的一个 2024 年 3 月启动的信息系统项目&#xff0c;详细阐述项目范围管理的过程&#xff0c;包括范围规划…

盖雅工场 2025 香港 SAP NOW 大会深度解析:AI 重构亚太劳动力管理数字化生态

一、前沿技术亮相&#xff1a;AI 驱动人力资源数字化转型全景展示 在 6 月 13 日举办的 2025 香港 SAP NOW 大会上&#xff0c;亚太劳动力管理领军企业盖雅工场&#xff08;GaiaWorks&#xff09;以「AI 劳动力管理」为核心&#xff0c;通过主题演讲与沉浸式展台演示&#xf…

Latent Diffusion中VAE损失函数源码解读及对损失函数的理解

最近因为工作需求&#xff0c;接触了Latent Diffusion中VAE训练的相关代码&#xff0c;其中损失函数是由名为LPIPSWithDiscriminator的类进行计算的&#xff0c;包括像素级别的重建损失&#xff08;rec_loss&#xff09;、感知损失&#xff08;p_loss&#xff09;和基于判别器&…

MIT 6.824学习心得(1) 浅谈分布式系统概论与MapReduce

一个月前机缘巧合&#xff0c;有朋友向我推荐了麻省理工学院非常著名的分布式系统课程MIT 6.824&#xff0c;是由世界五大黑客之一&#xff0c;蠕虫病毒之父Robert Morris教授进行授课。由于我自己也在做基于分布式微服务架构的业务项目&#xff0c;所以对构建分布式系统这个课…

PCL点云库入门(第21讲)——PCL库点云特征之RSD特征描述Radius-based Surface Descriptor(RSD)

一、算法原理 RSD: Radius-based Surface Descriptor由 Marton Zsolt et al. 于 2010 年提出&#xff0c;主要用于 点云中物体的几何形状识别&#xff08;如球形、柱面、平面等&#xff09;&#xff0c;广泛用于机器人抓取、点云分割和物体识别等任务中。 1.1、RSD 特征的核心…

zookeeper Curator(4):分布式锁

文章目录 分布式锁分布式锁的实现zookeeper 分布式锁原理Curator 实现分布式锁API1. InterProcessMutex&#xff08;分布式可重入互斥锁&#xff09;2. InterProcessSemaphoreMutex&#xff08;分布式非可重入互斥锁&#xff09;3. InterProcessReadWriteLock&#xff08;分布式…

设置方法区内存的大小

方法区内存配置 方法区&#xff08;Method Area&#xff09;是JVM内存模型的一部分&#xff0c;用于存储类信息、常量、静态变量等数据。在HotSpot虚拟机中&#xff0c;方法区的具体实现为永久代&#xff08;PermGen&#xff09;或元空间&#xff08;Metaspace&#xff09;&am…

用Flink打造实时数仓:生产环境中的“坑”与“解药”

目录 一、实时数仓的“野心”与“现实” 二、数据采集与接入:别让“源头”卡脖子 2.1 问题1:Kafka数据乱序与延迟 2.2 问题2:MySQL CDC数据同步异常 三、数据处理与计算:别让“算力”成瓶颈 3.1 问题3:多表Join性能低下 3.2 问题4:窗口计算触发延迟 四、状态管理与…

linux 下 Doris 单点部署

目录 1. Doris 下载 2. 环境准备 2.1 Linux 操作系统版本需求 2.2 部署依赖 3. Doris 部署 3.1 修改系统配置 3.1.1 修改系统句柄数 3.1.2 关闭swap分区 3.1.3 修改最大内存映射区域数量 3.2 开放端口 3.3 fe 部署 3.4 be 部署 3.5 be添加到Doris集群 4 验证 4.…

mysql 小版本升级实战分享

环境说明 当前版本:5.6.51 升级目标版本 mysql 5.7.41 服务启停通过systemd管理 升级准备&#xff1a; 环境检查 首先查看当前MySQL的版本信息&#xff0c;执行命令mysql -V&#xff0c;如图&#xff1a; 备份数据 备份所有数据库&#xff1a; 当数据量不是特别大的时候…

Python Ai语音识别教程

语音识别是将人类语音转换为文本的技术&#xff0c;在现代应用中非常有用。本教程将介绍如何使用Python实现基本的AI语音识别功能。 一、文字转语音 #文字转语音 #安装第三方库 pip install pyttsx3 #导包 &#xff1a; import pyttsx3import pyttsx3#创建语音引擎 a1 pytts…

Day11 制作窗口

文章目录 1. 显示窗口&#xff08;harib08d&#xff09;2. 消除闪烁1&#xff08;harib08g&#xff09;3. 消除闪烁2&#xff08;harib08h&#xff09; 本章的前三节做了如下修改&#xff1a; 解决了鼠标无法隐藏在屏幕右侧和下侧的问题。当鼠标隐藏在右侧时会在屏幕最左侧产生…

python+uniapp基于微信小程序蜀味道江湖餐饮管理系统nodejs+java

文章目录 具体实现截图本项目支持的技术路线源码获取详细视频演示&#xff1a;文章底部获取博主联系方式&#xff01;&#xff01;&#xff01;&#xff01;本系统开发思路进度安排及各阶段主要任务java类核心代码部分展示主要参考文献&#xff1a;源码获取/详细视频演示 ##项目…

postgresql增量备份系列二 pg_probackup

已经很久没有发文章了,主要是最近工作上的内容都不适合发文章公开。可能往后文章发表也不这么频繁了,不过大家有问题我们可以交流。之前有写过PG增量备份的其他工具使用方法,pg_probackup也是应用比较多的PG备份工具。 一. pg_probackup pg_probackup 是一个用于管理 Postg…

云手机主要是指什么?

云手机是指一种可以运行在云服务器中的手机&#xff0c;主要是将云计算技术运用于网络终端服务&#xff0c;通过云服务器来实现云服务的手机&#xff0c;也是一款深度结合了网络服务的手机&#xff0c;通过自带的系统和网络终端可以通过网络实现众多功能。 那么&#xff0c;下面…