如何限制托管在AWS EC2实例上基于DRF的API收到的随机未知请求?
解决方案
一、拦截恶意扫描请求
- Nginx前置过滤(优先推荐,性能损耗最低)
先在Nginx层拦截非法请求,避免请求打到DRF服务消耗资源,配置参考:- 新增默认服务块,所有Host头不匹配你的API域名的请求直接返回444(无响应断开连接,比错误码更省资源)
server { listen 80 default_server; listen [::]:80 default_server; return 444; }- 你的正常API服务块内新增路径拦截规则,匹配扫描常见路径直接拦截:
server { listen 80; server_name 你的API正式域名; # 拦截常见扫描路径 location ~* (\.php|\.asp|\.jsp|/wp-|/admin|/mysql|/phpmyadmin) { return 444; } # 配置频次限制,单IP每秒最多10次请求,可根据业务调整 limit_req zone=api burst=20 nodelay; # 其余原有转发到DRF的配置 } - AWS WAF防护
给EC2前置配置ALB(应用负载均衡),将AWS WAF挂载到ALB上,启用AWS托管的爬虫拦截、漏洞扫描防护规则,可直接拦截90%以上的公开扫描请求。
二、限制仅Amplify前端可访问API(无静态IP场景适配)
- 方案1:API Gateway做统一入口(改动最小,无需修改业务代码)
将EC2的DRF服务配置为API Gateway的后端集成,开启API Gateway的CORS规则,仅允许你的Amplify域名跨域访问,同时可配置JWT校验或API Key校验,所有无有效凭证的请求直接在API Gateway层被拦截,不会转发到EC2。 - 方案2:请求签名校验
前后端约定加密密钥,前端所有API请求在Header中携带按规则生成的签名,Nginx层先校验签名合法性,不合法直接返回444,扫描请求无法获知签名规则,自然无法通过校验。 - 方案3:CloudFront + 源站访问控制
给EC2配置CloudFront CDN,将EC2放在私有子网,安全组仅允许CloudFront的IP段访问,再配置CloudFront的WAF规则仅允许Referer为你的Amplify域名的请求通过,同样可以实现仅Amplify可访问的效果。
你配置了DRF的ALLOWED_HOSTS仍收到请求是正常现象:ALLOWED_HOSTS仅会在应用层拦截Host头非法的请求并返回400,但请求仍然会到达DRF进程消耗资源,所以必须在更上层的Nginx/ALB/WAF层做拦截,才能真正降低服务负载。
内容的提问来源于stack exchange,提问作者Prateek Jain
相关产品推荐
相关产品推荐

