🛡️ 前端也要有“防火墙”!Nginx + Fail2Ban 打造汇丰级 API 安全防御系统

163 阅读3分钟

🛡️ 前端也要有“防火墙”!Nginx + Fail2Ban 打造汇丰级 API 安全防御系统

客户端黑产狂轰 API?
爬虫一秒钟 300 次拉接口?
登录接口被暴力撞库?

别怕,让我们用 Nginx + Fail2Ban 打造一套“银行级防火墙”,挡住黑客、爬虫、内鬼,保你前端后台高枕无忧!


✅ 为什么你一定要学这招?

在汇丰内部系统中,前端项目背后的 API 层每天都遭受数以万计的非法请求。Nginx 限速 + Fail2Ban 动态封 IP是必备的组合拳:

  • 🧱 Nginx 限速:让对方访问慢下来,爬虫直接抓瞎
  • ⛓️ Fail2Ban:检测恶意日志,自动封禁 IP
  • 🚫 黑名单机制:让内鬼 IP 永远进不了门

📌 场景还原:防“登录接口暴力攻击”

一个爬虫/脚本死命 POST /api/login,你后端不一定炸,但日志炸了,DB 撞库风险拉满!

汇丰的做法:只要你短时间尝试失败多次 → 直接封你 IP!


🧰 技术栈

工具用途
Nginx设置限速、记录日志
Fail2Ban读取日志并自动封禁攻击者 IP
iptables(系统级)IP 层防护

💻 一步步实战配置


🔧 Step 1:设置 Nginx 日志 & 接口限速

nginx.conf 增加限速配置
http {
  # 每秒最多处理1个请求,突发最多允许5个
  limit_req_zone $binary_remote_addr zone=login_limit:10m rate=1r/s;

  server {
    listen 80;
    server_name hsbc-api.com;

    location /api/login {
      limit_req zone=login_limit burst=5 nodelay;
      access_log /var/log/nginx/login_hsbc.log;
      proxy_pass http://127.0.0.1:3000;
    }
  }
}

✅ 效果:

  • 正常人类访问秒级不卡
  • 爆刷脚本?直接变龟速!

🔧 Step 2:安装 Fail2Ban(Ubuntu)

sudo apt update && sudo apt install fail2ban -y

🔧 Step 3:配置 Fail2Ban 监控登录接口日志

创建过滤器 /etc/fail2ban/filter.d/nginx-login.conf
[Definition]
failregex = ^<HOST> -.*POST /api/login.*HTTP.* 401
ignoreregex =
配置 Jail /etc/fail2ban/jail.local
[nginx-login]
enabled = true
port = http,https
filter = nginx-login
logpath = /var/log/nginx/login_hsbc.log
maxretry = 5
findtime = 60
bantime = 600

🔁 启动并测试

sudo systemctl restart fail2ban
sudo fail2ban-client status nginx-login

✅ 每次失败登录(状态码 401)都会被记录
⛔ 连续失败 5 次 → IP 自动封禁 10 分钟!


🖥️ 日志 + 封禁效果演示

tail -f /var/log/nginx/login_hsbc.log

# 模拟爆刷接口
for i in {1..10}; do curl -X POST http://hsbc-api.com/api/login -d 'xxx'; done
sudo fail2ban-client status nginx-login

# 显示封禁的 IP 列表:
Banned IP list: 192.168.1.99

⚠️ 易错点总结

错误点描述
❌ 日志路径错了Fail2Ban 检测不到行为
❌ 没设置日志级别Nginx 默认不会记录 401,需要设定
❌ IP 被误封建议白名单机制 + 邮件通知 DevOps

✅ 推荐优化:

  • 接入 Slack / 飞书报警通知
  • 将被封 IP 写入 Redis 共享黑名单
  • 定期清除历史记录,防止误伤测试 IP

🎯 总结

  • 复刻了汇丰防御暴力请求的核心机制
  • Nginx 限速 + Fail2Ban 封 IP = 强力“前端盾牌”
  • 适用于任何敏感接口如 /login/reset/api/token

下一篇将回归前端体验优化主题:
🧠 《React + TypeScript 构建“能自我学习”的客户信息录入系统》