自建AI中转站WAF拦截恶意扫描请求实操教程
为什么AI中转站容易被恶意扫描
自建AI中转站暴露在公网后,很快会收到大量恶意扫描请求:有人尝试遍历API路径、测试密钥、发起高频调用试图消耗资源。
如果不加防护,不仅浪费带宽,还可能被刷爆额度。
配置WAF(Web应用防火墙)是最直接的防护手段,本文教你用宝塔面板或Nginx自带的规则来实现拦截。
准备工作
- 一台已安装宝塔面板或支持Nginx的Linux服务器。
- 你的AI中转站已正常运行(例如基于One API或New API搭建)。
- 能够通过SSH登录服务器,或直接在宝塔面板操作。
如果你还没搭建中转站,建议先完成搭建再回来配置WAF。
操作步骤:两种方式配置WAF拦截
方式一:使用宝塔面板的防火墙功能
- 登录宝塔面板,进入“软件商店”安装“Nginx防火墙”插件(免费版即可)。
- 安装后点击网站设置,找到“防火墙”→“全局设置”。
- 开启“屏蔽恶意扫描”开关,并勾选“User-Agent过滤”。默认规则已包含常见扫描器特征(如
sqlmap、nmap、python-requests等)。 - 返回“防火墙规则”,可添加自定义规则:
- 规则名称:拦截空UA
- 匹配字段:
User-Agent - 匹配规则:
为空 - 动作:拒绝
- 保存后,所有没有User-Agent头的请求将被直接拦截。
方式二:手动修改Nginx配置文件(适合未使用宝塔的场景)
- 找到AI中转站的Nginx站点配置文件,通常在
/etc/nginx/conf.d/或/www/server/nginx/conf/。 - 在
server块内添加以下规则:
# 屏蔽常见扫描器User-Agent
if ($http_user_agent ~* (sqlmap|nmap|python-requests|Nikto|curl|wget) ) {
return 403;
}
# 限制请求频率(单位:次/分钟)
limit_req_zone $binary_remote_addr zone=scan_limit:10m rate=5r/s;
limit_req zone=scan_limit burst=10 nodelay;
- 重新加载Nginx:
nginx -s reload或systemctl reload nginx。
说明:limit_req_zone 对每个IP的请求速率限制为5次/秒,超出会触发503,适合保护后端API。
如果中转站需要高频调用,可适当调高rate和burst值。
避坑指南
- 不要完全拦截所有curl和wget:很多正常自动化脚本也会用这两个工具,建议只拦截无UA或UA明显异常的组合。
- 误拦截正常用户:可以用宝塔面板的“日志”功能查看被拦截记录,如果发现自己的合法请求被拦截,将对应UA加入白名单。
- 频率限制太严格会导致用户频繁重试:建议先设置
rate=10r/s,观察几天再调整。 - 不要忘记更新规则:恶意扫描工具的特征会变,定期检查防火墙日志,补充新特征。
效果验证
- 使用浏览器正常访问中转站的API地址(例如
https://your.domain.com/v1/chat/completions),应能正常返回响应。 - 在SSH终端执行模拟扫描命令:
curl -A "sqlmap" https://your.domain.com/v1/chat/completions
应返回403 Forbidden。
- 在宝塔面板查看Nginx防火墙的“拦截记录”,应该能看到刚才的请求被拦截。
高频问题解答
Q:为什么我在宝塔里开启了WAF,扫描器还是能访问?
检查是否开启了“全局模式”,某些免费版只对特定站点生效。需要逐一为站点开启防火墙。
Q:频率限制会导致正常用户偶尔503?
是的,burst参数可以缓冲瞬时流量。如果频繁503,逐步提高rate或加大burst值。
Q:我用了CDN,IP都是CDN节点怎么办?
频率限制应该基于$http_cf_connecting_ip(Cloudflare)或$http_x_forwarded_for(其他CDN),需要修改limit_req_zone的key。
总结
自建AI中转站的WAF配置并不复杂,宝塔用户开几个开关就能生效;
手动用户写几条nginx规则即可。
关键是根据实际访问量微调频率限制,并定期查看拦截日志。
做好这一步,恶意扫描请求能减少80%以上,节省大量无谓流量。
建议结合密钥鉴权一起使用,防护更全面。