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


23

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

有没有一种方法可以使nginx速率限制基于X-Forwarded-For标题中的ip而不是源的ip?

Answers:


28

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

 limit_req_zone  $binary_remote_addr zone=zone:16m rate=1r/s;

$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;

我只是得出了相同的结论,在快速测试中它可以正常工作。感谢您指出增加的内存使用量。
John Brodie 2013年

2
请注意,可能对此存在严重的安全问题:blog.ircmaxell.com/2012/11/anatomy-of-attack-how-i-hacked.html
ircmaxell 2015年

注意,在博客中关于symfony的信息是与以下地址:symfony.com/doc/current/components/http_foundation/...
calumbrodie

5
如果使用realip模块,则会$binary_remote_addr正确设置变量。
恩克·阿尔蒂

5

所述limit_req_zone指令定义要被用作用于请求分组关键变量。
通常,$binary_remote_addr使用而不是$remote_addr因为较小,并且节省空间。

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


1
+1用于RealIP模块。当使用这种模块,$binary_remote_addr$remote_addr设置为您配置的头部,通常的价值X-Forwarded-For-让你的标准变量现在“真正的客户端IP地址”。运行nginx -V以查看NGINX是否使用编译--with-http_realip。然后config就像:一样简单 set_real_ip_from 10.0.0.0/8; real_ip_header X-Forwarded-For; ,其中CIDR范围是设置X-Forwarder-For标头的上游负载均衡器的范围。
markdsievers
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.