使用 X-Forwarded-For 标头限制 nginx 速率

Joh*_*die 26 nginx rate-limiting

我正在研究使用 nginx 的HttpLimitReqModule 进行速率限制。但是,请求都来自同一个 IP(负载均衡器),在标头中有真实的 IP 地址。

有没有办法根据X-Forwarded-For标头中的 ip 而不是源的 ip来设置 nginx 速率限制?

And*_*sov 32

是的,典型的限速配置定义字符串如下所示:

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;
Run Code Online (Sandbox Code Playgroud)

$binary_remote_addr限制器的唯一键在哪里。您应该尝试将其更改为$http_x_forwarded_for获取X-Forwarded-For标头值的变量。虽然这会增加内存消耗,因为$binary_remote_addr使用压缩的二进制格式来存储 IP 地址,$http_x_forwarded_for而不是。

 limit_req_zone  $http_x_forwarded_for zone=zone:16m rate=1r/s;
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用 realip 模块,`$binary_remote_addr` 变量会被正确设置。 (7认同)
  • 请注意,这可能存在严重的安全问题:http://blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html (4认同)
  • @КонстантинВан,如果您确定请求标头始终由受信任的反向代理/负载均衡器设置或清理,那么您可以信任请求标头。拒绝与防火墙或非公共网络的所有非代理连接,或像 RealIP 模块一样使用白名单(在原始“$remote_addr”上)进行标头使用。 (2认同)

Luk*_*kas 5

limit_req_zone指令定义了用作请求分组键的变量。
通常,$binary_remote_addr使用 而不是$remote_addr因为它更小并且节省空间。

也许您还想使用RealipModule
这会将远程地址变量重写为自定义标头中提供的地址,并且还将使日志记录和其他变量的使用更容易。