反向代理的速率限制

我对用于速率限制的标头有一个疑问。背景是我们有一个 nginx.conf 文件,其中包含 set_real_ip,并且我们正在使用一个提供商,该提供商通过 Some-Client-IP 标头向我们发送带有客户端实际 IP 的流量。

  sendfile on;
set_real_ip_from ...;
set_real_ip_from ...;
set_real_ip_from ...;
set_real_ip_from ...;

real_ip_header Some-Client-IP;
real_ip_recursive on;

Some-Client-IP 是我们从上游获取的带有实际用户 IP 的标头。

nginxconf.d 中的当前 discourse.conf 文件中,我们有默认设置:

对于我认为的所有通用路由

    proxy_set_header Host $http_host;
    proxy_set_header X-Request-Start "t=${msec}";
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $thescheme;
    proxy_pass http://discourse;

Discourse 是查看 X-Forwarded-For 还是 X-Real-IP 进行速率限制?我认为它查看的是 X-Forwarded-For,因为在 production.log 中我看到了我的反向代理的 IP。正确的解决方案是也将 X-Forwarded-For 改为查看 $remote_addr 吗?

从这个帖子来看,似乎有人直接删除了那一行 Last IP shows Reverse Proxy IP address - #5 by schleifer

谢谢

1 个赞

您是否将该节添加到您的 app.yml 中了?这些设置需要放在容器内的 NGINX 中。另请参阅 https://meta.discourse.org/t/how-to-set-up-discourse-on-a-server-with-existing-apache-sites/30013。那是针对 Apache 的,但无论谁在进行反向代理,app.yml 中的部分都是相同的。

这些诗句在我们容器内的 conf.d/discourse.conf 中,而不是在当前的 nginx.conf 中。

关于 app.yml 部分,您是指

run:
  - replace:
      filename: /etc/nginx/conf.d/discourse.conf
      from: "types {"
      to: |
        set_real_ip_from 172.17.0.0/24;
        real_ip_header X-Forwarded-For;
        real_ip_recursive on;
        types {

我们在容器外部没有 HAProxy,我们有一个 DNS 提供商为我们进行一些预处理,所以 real_ip_header 在另一个 header 值中,而且我们实际上需要替换一个 IP 地址列表。

我们实际上也看到了 X-Forwarded-For 的列表,我想知道这是否是导致错误 IP 显示的原因。

例如,我认为我们在生产日志中看到的是 111.11.11.111,而不是我们想要的 55.555.55.55(因为它设置在 x-real-ip 中)。

HTTP_X_FORWARDED_FOR	111.11.11.111, 22.22.22.222, 333.33.33.333, 55.555.55.55
HTTP_X_REAL_IP	55.555.55.55

那么您需要相应地调整推荐的配置。

或者,如果您不关心 IP 地址或速率限制,可以提醒速率限制模板。

1 个赞