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


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

tags:

  • 个人成长
    categories:
  • 杂谈

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

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

复制代码
sudo tail -f /var/log/nginx/access.log

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

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

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

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

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 ,继续进行安全增强。

三、进一步强化:启用 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

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

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

总结

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

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

相关推荐
m0_661316234 分钟前
modbus_tcp和modbus_rtu对比&移植AT-socket,modbus_tcp&杂记
服务器·网络·tcp/ip
IT成长日记24 分钟前
【Linux基础】Linux系统管理:GPT分区实践详细操作指南
linux·运维·服务器·gpt·parted·磁盘分区·fdisk
爱喝水的鱼丶44 分钟前
SAP-ABAP: ABAP ASSIGN COMPONENT 语句详解:动态字段符号的利器作用用法示例详解
运维·开发语言·sap·abap·开发经验·动态字段符号
清寒敲代码1 小时前
k8s核心技术-Helm
运维·容器·kubernetes
quqi991 小时前
Enable FIPS in ubuntu (by quqi99)
linux·运维·ubuntu
人工智能训练师1 小时前
在Ubuntu中如何使用PM2来运行一个编译好的Vue项目
linux·运维·服务器·vue.js·ubuntu·容器
往事如yan1 小时前
ChatGPT下的相关聊天提示词
chatgpt
程序媛Dev1 小时前
50.4k Star!我用这个神器,在五分钟内搭建了一个私有 Git 服务器!
运维·服务器·git
蔡俊锋1 小时前
【无标题】
人工智能·chatgpt
Lynnxiaowen2 小时前
今天继续学习shell脚本
linux·运维·学习·云计算·bash