正在加载内容

LUNARIS / ARTICLE
New-API-防刷防护部署报告
🛡️ New API 防刷防护部署报告
部署日期:2026-07-24 服务器:RainYun-VTkwyvUc (Ubuntu 24.04.4 LTS) 域名:apizxz.xyz 模式:直连(不使用 Cloudflare 橙色云代理)
一、架构概述
当前架构
Internet (真实客户端 IP)
│
▼
┌──────────────────────────────────────┐
│ Nginx (:80 / :443) │
│ ├─ 3 级速率限流 │
│ ├─ 漏洞扫描拦截 │
│ ├─ 安全响应头 │
│ ├─ 连接数限制 │
│ └─ 版本号隐藏 │
└──────────┬───────────────────────────┘
│
┌──────┴──────┐
│ │
▼ ▼
127.0.0.1:3000 127.0.0.1:5212
┌─────────┐ ┌─────────┐
│ new-api │ │cloudreve│
│ Docker │ │ Docker │
└─────────┘ └─────────┘
│
┌──────┴──────┐
│ Fail2ban │ ← 监控访问日志实时封禁
│ 5 个 Jail │
└─────────────┘
子域名
| 域名 | 服务 | SSL |
|---|---|---|
apizxz.xyz | New API | ✅ Let's Encrypt |
drive.apizxz.xyz | Cloudreve 云盘 | ✅ Let's Encrypt |
dev.apizxz.xyz | FRP 开发 | ✅ Let's Encrypt |
vpn.apizxz.xyz | X-UI 面板 | ✅ Let's Encrypt |
二、发现的风险与修复状态
| # | 风险 | 严重程度 | 状态 |
|---|---|---|---|
| 1 | Docker 端口 0.0.0.0:3000 直接暴露 | 🔴 严重 | ✅ 已修复 → 127.0.0.1:3000 |
| 2 | Cloudreve 端口 0.0.0.0:5212 暴露 | 🔴 严重 | ✅ 已修复 → 127.0.0.1:5212 |
| 3 | SSH 暴力破解持续攻击 | 🔴 严重 | ✅ Fail2ban 已有(已封 1086 个 IP) |
| 4 | Nginx 无限流防护 | 🟡 中等 | ✅ 已部署 3 级限流 |
| 5 | Nginx 版本号泄露 | 🟡 中等 | ✅ 已隐藏 |
| 6 | 漏洞扫描无拦截 | 🟡 中等 | ✅ 已拦截 wp-admin/.env/.git 等 |
| 7 | 登录接口无防爆破 | 🟡 中等 | ✅ 已限制 1r/s |
| 8 | API 接口无频率限制 | 🟡 中等 | ✅ 已限制 5r/s |
| 9 | 安全响应头缺失 | 🟢 低 | ✅ 已添加 |
三、Nginx 限流策略
3 级分层限流
| 级别 | 适用路径 | 频率限制 | 突发容忍 | 说明 |
|---|---|---|---|---|
| 严格 | /login, /api/user/login, /api/login, /api/user/register | 1 req/s | burst 3 | 防密码爆破 |
| 中等 | /v1/, /api/v1/, /api/token, /api/redemption | 5 req/s | burst 10 | 防 API Key 被刷 |
| 普通 | / 其余所有路径 | 10 req/s | burst 20 | 普通浏览 |
连接数限制
- 单 IP 最大并发连接:20 个
- 登录路径单 IP 最大并发:5 个
超出限流返回
HTTP 429 Too Many Requests
{
"error": {
"message": "Too Many Requests - Rate limit exceeded. Please slow down.",
"type": "rate_limit_error"
},
"code": 429
}
四、漏洞扫描拦截
以下请求路径会被直接断开连接(返回 444,无响应体):
/wp-admin WordPress 后台扫描
/wp-login WordPress 登录扫描
/xmlrpc.php WordPress XML-RPC 攻击
/wp-config WordPress 配置文件探测
/.env 环境变量文件探测
/.git Git 仓库探测
/.hg Mercurial 仓库探测
/.svn SVN 仓库探测
/.DS_Store macOS 文件探测
/.* 所有隐藏文件
五、安全响应头
所有响应包含以下安全头:
Server: nginx ← 版本号已隐藏
X-Frame-Options: SAMEORIGIN ← 防点击劫持
X-Content-Type-Options: nosniff ← 防 MIME 嗅探
X-XSS-Protection: 1; mode=block ← 防 XSS
Referrer-Policy: strict-origin-when-cross-origin
Permissions-Policy: geolocation=(), microphone=(), camera=()
其他安全设置:
| 参数 | 值 | 用途 |
|---|---|---|
client_max_body_size | 20m | 限制上传大小 |
client_body_timeout | 10s | 防慢速攻击 |
client_header_timeout | 10s | 防慢速攻击 |
client_body_buffer_size | 128k | Slowloris 防护 |
六、Fail2ban 自动封禁
Jail 一览
| Jail | 监控日志 | 触发条件 | 封禁时间 |
|---|---|---|---|
sshd | systemd journal | SSH 认证失败 | 默认 |
3x-ipl | /var/log/x-ui/3xipl.log | X-UI IP 限制 | 30 min |
nginx-ratelimit | /var/log/nginx/access.log | 60 秒内 10 次 429/444 | 10 min |
nginx-404 | /var/log/nginx/access.log | 60 秒内 20 次 404 | 30 min |
nginx-login | /var/log/nginx/access.log | 60 秒内 5 次 POST 登录 | 30 min |
常用命令
# 查看所有 Jail 状态
fail2ban-client status
# 查看某个 Jail 详情
fail2ban-client status nginx-ratelimit
# 手动封禁一个 IP
fail2ban-client set nginx-ratelimit banip <IP地址>
# 手动解封一个 IP
fail2ban-client set nginx-ratelimit unbanip <IP地址>
# 重启 Fail2ban
systemctl restart fail2ban
七、Docker 安全
端口绑定修复
修复前(危险):
# /opt/docker/new-api/docker-compose.yml
ports:
- "3000:3000" # ⚠️ 0.0.0.0 全网暴露
修复后(安全):
# /opt/docker/new-api/docker-compose.yml
ports:
- "127.0.0.1:3000:3000" # ✅ 仅本地回环
两个容器均已修复:
new-api→127.0.0.1:3000cloudreve→127.0.0.1:5212
八、不开启 Cloudflare 的原因与影响
原因
Cloudflare 免费版 HTTP 代理有 100 秒超时限制,AI 模型长时间推理(如思考超过 2 分钟)会被 Cloudflare 断开连接。因此使用直连模式。
影响
| 项目 | 影响 |
|---|---|
| 源站 IP 暴露 | 23.141.172.222 可通过 DNS 解析获得 |
| CF WAF 不可用 | Nginx 层已有等效防护替代 |
| CF DDoS 防护不可用 | 依靠 Nginx + Fail2ban 自身防御 |
| CF CDN 加速不可用 | 直连速度取决于服务器带宽 |
| AI 模型推理 | ✅ 无超时限制,长推理不断连 |
九、配置文件清单
Nginx
/etc/nginx/
├── nginx.conf # server_tokens off; include conf.d/*
├── conf.d/
│ ├── security.conf # 安全头 + 请求大小/超时限制
│ └── rate-limit.conf # 全局限流 zone 定义(备用)
└── sites-available/
├── new-api # apizxz.xyz 主站(3 级限流)
├── cloudreve # drive.apizxz.xyz
├── vpn # vpn.apizxz.xyz
└── frp-dev # dev.apizxz.xyz
Fail2ban
/etc/fail2ban/
├── filter.d/
│ ├── nginx-ratelimit.conf # 429/444 检测
│ ├── nginx-404.conf # 404 扫描检测
│ └── nginx-login.conf # 登录检测
└── jail.d/
└── nginx.conf # 3 个 Web Jail
Docker
/opt/docker/new-api/docker-compose.yml # ports: 127.0.0.1:3000:3000
/opt/cloudreve/docker-compose.yml # ports: 127.0.0.1:5212:5212
十、测试验证结果
| 测试项目 | 预期 | 实际 | 状态 |
|---|---|---|---|
| 正常访问首页 | HTTP 200 | HTTP 200 | ✅ |
| 登录页面 | HTTP 200 | HTTP 200 | ✅ |
| API 状态接口 | HTTP 200 | HTTP 200 | ✅ |
| Cloudreve 子域名 | HTTP 200 | HTTP 200 | ✅ |
| wp-admin 扫描 | 拒绝 | HTTP 000 | ✅ |
| .env 探测 | 拒绝 | HTTP 000 | ✅ |
| .git 探测 | 拒绝 | HTTP 000 | ✅ |
| 登录接口高频请求 | 429 | 前 4 次通过,第 5 次起 429 | ✅ |
| 外部直接访问端口 3000 | 不可达 | HTTP 000 | ✅ |
| 安全响应头 | 全部存在 | 5 个头全部返回 | ✅ |
| 服务器版本隐藏 | 无版本号 | Server: nginx | ✅ |
| Fail2ban 5 个 Jail | 全部运行 | 5 个 Active | ✅ |
十一、运维参考
日常监控
# 查看今日 429(被限流)请求数
grep " 429 " /var/log/nginx/access.log | wc -l
# 查看今日被拦截的扫描请求(444)
grep " 444 " /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn
# 查看实时访问日志
tail -f /var/log/nginx/access.log
# 查看 Nginx 错误日志
tail -f /var/log/nginx/error.log
# 查看当前被封禁的 IP
fail2ban-client status nginx-ratelimit
fail2ban-client status nginx-404
fail2ban-client status nginx-login
# 查看 docker 容器状态
docker ps
如需恢复配置
# 原始配置备份位置
ls /root/backup_before_protection_20260724_201504/
# 恢复方式(示例)
cp /root/backup_before_protection_20260724_201504/nginx_backup/sites-available/new-api \
/etc/nginx/sites-available/new-api
systemctl reload nginx
如需调整限流参数
编辑对应站点的配置文件:
vim /etc/nginx/sites-available/new-api
关键参数说明:
| 参数 | 含义 | 调大 | 调小 |
|---|---|---|---|
rate=10r/s | 每秒允许请求数 | 放宽限制 | 更严格 |
burst=20 | 突发请求容忍数 | 允许更多排队 | 更少排队 |
limit_conn conn_apizxz 20 | 最大并发连接 | 允许更多连接 | 更少连接 |
nodelay | 突发立即处理 | 去掉则排队等待 | - |
修改后记得测试并重载:
nginx -t && systemctl reload nginx
十二、防御层级总结
┌──────────────────────────────────────────┐
│ Layer 1: Nginx 请求限流 (limit_req) │
│ 3 级分层:登录 1r/s | API 5r/s | 普通 10r/s │
├──────────────────────────────────────────┤
│ Layer 2: Nginx 连接限制 (limit_conn) │
│ 单 IP 最大 20 并发连接 │
├──────────────────────────────────────────┤
│ Layer 3: Nginx 漏洞拦截 │
│ wp-admin / .env / .git / 隐藏文件 等 │
├──────────────────────────────────────────┤
│ Layer 4: Nginx 安全头 + 参数限制 │
│ XSS/Frame/嗅探防护 + body/header 超时 │
├──────────────────────────────────────────┤
│ Layer 5: Fail2ban 自动封禁 │
│ 3 个 Web Jail 监控 429/404/登录 │
├──────────────────────────────────────────┤
│ Layer 6: Docker 端口绑定 │
│ 应用端口仅监听 127.0.0.1,不对外暴露 │
├──────────────────────────────────────────┤
│ Layer 7: SSH 防爆破 │
│ Fail2ban sshd Jail 持续运行 │
└──────────────────────────────────────────┘
状态:✅ 全部防护已部署并验证通过 备份:
/root/backup_before_protection_20260724_201504/你的正常使用不受影响