一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban

news2025/7/26 8:28:23

title: 一次借助ChatGPT抵御恶意攻击的经历,为个人服务器添加自动防御系统Fail2ban
tags:

  • 个人成长
    categories:
  • 杂谈

我有一台个人服务器,托管着自己的WordPress网站,也放了RustDesk这种私有化的远程桌面工具,最近我发现RustDesk特别卡,登录服务器才发现WordPress消耗了大量的资源和带宽

Uploaded image

然后我把现象丢给了GPT4o, GPT4o要求查看我的Nginx日志

image-20250602134232283

sudo tail -f /var/log/nginx/access.log

我将日志贴给gpt后,gpt快速分析了问题

image-20250602134331920

一、 使用 Nginx 限速保护登录接口

为了避免保留破解,我们需要对wp-login.php进行限流

1.1 编辑 nginx.conf,添加限流配置

image-20250602151208740

http {} 区块中添加以下内容:

limit_req_zone $binary_remote_addr zone=login_zone:10m rate=5r/m;

解释如下:

  • $binary_remote_addr:按 IP 建立限流;
  • login_zone:10m:设置一个 10MB 内存的限流区域;
  • rate=5r/m:每个 IP 每分钟最多允许 5 次请求。

📌 注意:必须写在 http {} 块中!

1.2 修改虚拟主机配置,启用登录页限速

location = /wp-login.php {
    limit_req zone=login_zone burst=3 nodelay;
    include fastcgi_params;
    fastcgi_pass unix:/run/php/php8.2-fpm.sock;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
参数说明:
  • burst=3:最多允许 3 个突发请求;

  • nodelay:超出限额立即拒绝;

  • 其余参数为 PHP-FPM 常规配置。

二、完整的 Nginx 配置示例(v2fy.com.conf)

为方便参考,这是一份包含 HTTPS、限流、防注入、静态缓存等功能的完整 Nginx 配置 v2fy.com.conf

# 监听 HTTP 端口,将所有请求重定向到 HTTPS
server {
    listen 80;
    server_name v2fy.com;

    location / {
        return 301 https://$host$request_uri;  # 永久重定向到 HTTPS
    }
}

# 主站点的 HTTPS 配置
server {
    listen 443 ssl;
    server_name v2fy.com;

    # 网站根目录
    root /usr/share/nginx/v2fy.com;
    index index.php index.html index.htm;

    # SSL 证书配置(路径根据你实际证书文件填写)
    ssl_certificate /etc/nginx/ssl/v2fy.com/fullchain.cer;
    ssl_certificate_key /etc/nginx/ssl/v2fy.com/v2fy.com.key;

    # 安全相关的 SSL 设置
    ssl_session_timeout 5m;                 # 会话缓存时间
    ssl_protocols TLSv1.2 TLSv1.3;          # 禁用不安全的 TLSv1 和 TLSv1.1
    ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-AES128-GCM-SHA256';
    ssl_prefer_server_ciphers on;

    # 启用 gzip 压缩,提高页面加载速度
    gzip on;
    gzip_min_length 1k;
    gzip_buffers 4 16k;
    gzip_comp_level 8;
    gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php;
    gzip_vary off;

    # 防护 XMLRPC 接口(攻击频发)
    location = /xmlrpc.php {
        limit_req zone=xmlrpc_zone burst=5 nodelay;  # 启用速率限制(需在 http{} 中定义 xmlrpc_zone)
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;  # PHP-FPM socket 路径
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        # access_log 默认为开启,Fail2Ban 可以监控
    }

    # 登录页限速,保护登录暴力破解
    location = /wp-login.php {
        limit_req zone=login_zone burst=3 nodelay;
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # Feed 接口限速,防止爬虫滥用
    location = /feed {
        limit_req zone=feed_zone burst=3 nodelay;
    }

    # 屏蔽伪 WordPress UA 发起的 cron 请求
    location = /wp-cron.php {
        if ($http_user_agent ~* "WordPress/") {
            return 403;
        }
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # 优化 favicon 请求(避免 404 日志)
    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    # 允许 robots.txt 被搜索引擎访问
    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

    # 缓存常见静态资源,减少带宽和服务器压力
    location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
        expires max;            # 浏览器缓存时间最长
        log_not_found off;
        access_log off;
    }

    # 网站主页及所有 URL 路由处理(WordPress rewrite)
    location / {
        try_files $uri $uri/ /index.php?$args;
    }

    # PHP 文件处理规则(fastcgi)
    location ~ \.php$ {
        try_files $uri =404;    # 不存在的文件直接返回 404
        include fastcgi_params;
        fastcgi_pass unix:/run/php/php8.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    }

    # 反向代理某个接口(如 /wemessage/)
    location /wemessage/ {
        proxy_pass http://127.0.0.1:3600;  # 反代本地端口
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    # 防止攻击者构造特定路径发起请求
    if ($request_uri ~* "(appendChild|postLinks|defer|actionURL)") {
        return 403;
    }

    # 拦截含有特殊符号的异常路径(常用于注入、攻击等)
    if ($request_uri ~* "[\[\]\!\=\,\{\}%]") {
        return 403;
    }
}

我们将配置丢给ChatGPT ,继续进行安全增强。

image-20250602140620846

三、进一步强化:启用 Fail2Ban 拉黑恶意 IP

目前,我们已经可以对恶意请求进行限速,限速可以缓解攻击,但无法彻底拦截持续扫描的恶意 IP。此时可借助 Fail2Ban 实现自动封禁。

3.1 什么是 Fail2ban ?

fail2ban 是一个非常实用的开源安全工具,主要功能是自动检测系统日志中的可疑行为(如暴力破解、恶意请求)并临时封禁攻击者的 IP 地址,从而提高服务器的安全性。

功能说明
防止 SSH 暴力破解如果某个 IP 多次尝试登录 SSH 密码失败,会被封禁。
封禁 Nginx/Web 攻击者分析访问日志,如发现频繁 403/404 请求或恶意 URL,就封禁对应 IP。
灵活可配置可自定义规则、封禁时长、阈值、监控哪些日志文件等。
自动解封支持设置封禁时间,比如封 10 分钟后自动解封。

3.2 Fail2ban工作原理(简化流程):

  1. 监控日志文件(如 /var/log/nginx/access.log/var/log/auth.log
  2. 匹配特定的行为(比如 5 分钟内失败登录 5 次、访问特定恶意路径等)
  3. 执行动作:默认是 iptables 封 IP,也可发邮件或执行你自定义的命令

四:配置 Fail2Ban 保护 Nginx

4.1 安装Fail2ban

# 更换国内镜像源(可选)
sudo sed -i 's|http://archive.ubuntu.com/ubuntu|https://mirrors.tuna.tsinghua.edu.cn/ubuntu|g' /etc/apt/sources.list
# 更新软件包索引并安装
sudo apt update
sudo apt install fail2ban -y

4.2 查看fail2ban工作状态

sudo systemctl status fail2ban

4.3 基于默认配置文件,新建本地配置文件

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

在配置文件/etc/fail2ban/jail.local末尾添加以下内容

[nginx-bad-requests]
enabled = true
port    = http,https
filter  = nginx-bad-requests
logpath = /var/log/nginx/access.log
maxretry = 5
findtime = 600
bantime = 3600
  • maxretry = 5:10 分钟内出现 5 次匹配就封禁
  • bantime = 3600:封禁 1 小时
  • logpath:你的 nginx 日志路径,可以根据实际调整

4.4 创建过滤器规则

sudo vim /etc/fail2ban/filter.d/nginx-bad-requests.conf

在文件中加入以下内容

[Definition]
failregex = <HOST> -.*"(GET|POST).*?(appendChild|postLinks|defer|actionURL).*HTTP.*"
ignoreregex =

4.5 重启Fail2ban

sudo systemctl restart fail2ban

查看 nginx-bad-requests 规则封禁了多少IP

sudo fail2ban-client status nginx-bad-requests

image-20250602143447680

我们拉长时间段,发现被ban的IP在逐渐增加(从19个IP增加到了33个)

image-20250602154654662

服务器的状态也回归到了正常的水平

image-20250602154840553

总结

本文借助 ChatGPT 的建议,我们快速诊断 Nginx 日志中的恶意请求;利用 Nginx 配置实现接口限速;引入 Fail2Ban 实现动态封禁了33个恶意IP,让个人服务器恢复正常。

借助 AI 和自动化工具,我们可以用更低的成本,保证服务器的安全,优秀的运维工程师,也是善用各类工具,提升服务器的稳定性,AI技术的进步,让并不专精的运维的开发者,也能快速找到合适工具,加固个人服务器,避免不必要的流量和算力浪费。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(九)深度学习---自然语言处理基础

分类问题回归问题聚类问题各种复杂问题决策树√线性回归√K-means√神经网络√逻辑回归√岭回归密度聚类深度学习√集成学习√Lasso回归谱聚类条件随机场贝叶斯层次聚类隐马尔可夫模型支持向量机高斯混合聚类LDA主题模型 一.文本数据的表示方法 二.神经网络文本情感分析案例 三…

【Java Web】速通Tomcat

参考笔记:JavaWeb 速通Tomcat_tomcat部署java项目-CSDN博客 目录 一、Tomcat服务 1. 下载和安装 2. 启动Tomcat服务 3. 启动Tomcat服务的注意事项 4. 关闭Tomcat服务 二、Tomcat的目录结构 1. bin 🌟 2. conf 🌟 3. lib 4. logs 5. temp 6. webapps 7. work 三、Web项目…

Docker快速部署数据同步工具DataX-Web

笔者最近有需求需要进行数据同步&#xff0c;目前确认DataX-Web适合快速搭建使用&#xff0c;满足基本需求。以此记录搭建Datax-Web过程和解决的坑。 一、启动MySQL容器 &#xff08;1&#xff09;首先&#xff0c;我们运行一个支撑DataX-Web运行的MySQL容器。 docker run --…

从零开始的云计算生活——第十四天,困难重重,安全管理。

一故事背景 在前面的基本无操作内容后&#xff0c;来到了大头内容&#xff0c;安全管理&#xff01;其中的防火墙相关的内容更是重中之重&#xff0c;要好好掌握&#xff0c;熟练运用。 二SELinux安全上下文 1SELinux 简介 a. SELinux&#xff08;Security-Enhanced Linux&…

【设计模式-4.6】行为型——状态模式

说明&#xff1a;本文介绍行为型设计模式之一的状态模式 定义 状态模式&#xff08;State Pattern&#xff09;也叫作状态机模式&#xff08;State Machine Pattern&#xff09;&#xff0c;允许对象在内部状态发生改变时改变它的行为&#xff0c;对象看起来好像修改了它的类…

换ip是换网络的意思吗?怎么换ip地址

在数字化时代&#xff0c;IP地址作为我们在网络世界的"身份证"&#xff0c;其重要性不言而喻。许多人常将"换IP"与"换网络"混为一谈&#xff0c;实际上两者虽有联系却存在本质区别。本文将澄清这一概念误区&#xff0c;并详细介绍多种更换IP地址…

手机归属地查询接口如何用Java调用?

一、什么是手机归属地查询接口&#xff1f; 是一种便捷、高效的工具&#xff0c;操作简单&#xff0c;请求速度快。它不仅能够提高用户填写地址的效率&#xff0c;还能帮助企业更好地了解客户需求&#xff0c;制定个性化的营销策略&#xff0c;降低风险。随着移动互联网的发展…

随笔20250530 C# 整合 IC卡读写技术解析与实现

以下是一个完整、最简化的 FeliCa 读取整合示例&#xff08;无需 SDK&#xff0c;基于 PCSC NuGet 包&#xff09;&#xff0c;你可以直接运行这个控制台程序&#xff0c;验证能否识别 RC-S300 并读取卡片 UID&#xff1a; &#x1f9ea; 示例说明 &#x1f4e6; 使用 NuGet 包…

基于爬取的典籍数据重新设计前端界面

1.BooksView(书籍列表页) 2.ClassicsView&#xff08;目录页&#xff09; 3.管理员端

揭秘 NextJS Script 组件

揭秘 NextJS Script 组件 Next.js 的 Script 组件是对原生 <script> 标签的增强封装&#xff0c;主要区别和优势如下&#xff1a; 自动优化加载策略&#xff08;支持按需/延迟加载&#xff09;避免重复加载内置性能优化&#xff08;如预加载、回调钩子&#xff09;简化…

【C++/Linux】TinyWebServer前置知识之IP协议详解

目录 IPv4地址 分类 IP数据报分片 IP 协议在传输数据报时&#xff0c;将数据报分为若干分片&#xff08;小数据报&#xff09;后进行传输&#xff0c;并在目的系统中进行重组&#xff0c;这一过程称为分片&#xff08;Fragmentation&#xff09;。 IP模块工作流程​编辑 I…

Codeforces Round 1028 (Div. 2)(A-D)

题面链接&#xff1a;Dashboard - Codeforces Round 1028 (Div. 2) - Codeforces A. Gellyfish and Tricolor Pansy 思路 要知道骑士如果没了那么这个人就失去了攻击手段&#xff0c;贪心的来说我们只需要攻击血量少的即可&#xff0c;那么取min比较一下即可 代码 void so…

记录一个梦,借助大语言模型图片生成

梦见家门口有一条大河&#xff0c;但大河和其它景物都是灰暗没有鲜艳色彩很普通的梦中场景。大河似乎是长江的支流&#xff0c;但也可能有一个响亮的名字似乎是金沙江。 突然看到一条金红色的龙在快速游动&#xff0c;不敢相信自己的眼睛&#xff0c;因为一直不相信有这种生物…

android binder(二)应用层编程实例

一、binder驱动浅析 从上图看出&#xff0c;binder的通讯主要涉及三个步骤。 在 Binder Server 端定义好服务&#xff0c;然后向 ServiceManager 注册服务在 Binder Client 中向 ServiceManager 获取到服务发起远程调用&#xff0c;调用 Binder Server 中定义好的服务 整个流…

【深度学习】17. 深度生成模型:DCGAN与Wasserstein GAN公式深度推导

深度生成模型:DCGAN与Wasserstein GAN公式深度推导 深度卷积生成对抗网络 DCGAN 在原始 GAN 框架中&#xff0c;生成器和判别器通常使用全连接层构建&#xff0c;这限制了模型处理图像的能力。为此&#xff0c;Radford 等人在 2016 年提出了 DCGAN&#xff08;Deep Convoluti…

设计模式——命令设计模式(行为型)

摘要 本文介绍了命令设计模式&#xff0c;这是一种行为型设计模式&#xff0c;用于将请求封装为对象&#xff0c;实现请求的解耦和灵活控制。它包含命令接口、具体命令、接收者、调用者和客户端等角色&#xff0c;优点是解耦请求发送者与接收者&#xff0c;支持命令的排队、记…

03 APP 自动化-定位元素工具元素定位

文章目录 一、Appium常用元素定位工具1、U IAutomator View Android SDK 自带的定位工具2、Appium Desktop Inspector3、Weditor安装&#xff1a;Weditor工具的使用 4、uiautodev通过定位工具获取app页面元素有哪些属性 二、app 元素定位方法 一、Appium常用元素定位工具 1、U…

PABD 2025:大数据与智慧城市管理的融合之道

会议简介 2025年公共管理与大数据国际会议&#xff08;ICPMBD 2025&#xff09;确实在海口举办。本次会议将围绕公共管理与大数据的深度融合、数据分析在公共管理中的应用、大数据驱动的政策制定与优化等议题展开深入研讨。参会者将有机会聆听前沿学术报告&#xff0c;分享研究…

Golang持续集成与自动化测试和部署

概述 Golang是一门性能优异的静态类型语言&#xff0c;但因其奇快的编译速度&#xff0c;结合DevOps, 使得它也非常适合快速开发和迭代。 本文讲述如何使用Golang, 进行持续集成与自动化测试和部署。主要使用了以下相关技术&#xff1a; dep&#xff1a; 进行包的依赖管理gin…

mysql离线安装教程

1.下载地址: https://downloads.mysql.com/archives/community/ 2.上传安装包到系统目录,并解压 tar -xvf mysql-8.0.34-1.el7.x86_64.rpm-bundle.tar3.检查系统中是否存在mariadb的rpm包 rpm -qa|grep mariadb存在则删除 rpm -e xxx4.解压完后执行如下命令安装 sudo rpm -iv…