一次借助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.1ssl_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; # 不存在的文件直接返回 404include 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工作原理(简化流程):
- 监控日志文件(如
/var/log/nginx/access.log
或/var/log/auth.log
) - 匹配特定的行为(比如 5 分钟内失败登录 5 次、访问特定恶意路径等)
- 执行动作:默认是
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技术的进步,让并不专精的运维的开发者,也能快速找到合适工具,加固个人服务器,避免不必要的流量和算力浪费。