【问题标题】:NGinx $proxy_add_x_forwarded_for and real_ip_headerNGinx $proxy_add_x_forwarded_for 和 real_ip_header
【发布时间】:2015-03-26 13:00:29
【问题描述】:

我在 NGinx 和另一个前端负载均衡器下有一个 webapp,如下所示(x.x.x.x = IP 地址):

客户端(a.a.a.a) -> LB (b.b.b.b) -> NGX (c.c.c.c) -> WEBAPP (d.d.d.d)

这是我的 NGinx 配置的 sn-p:

location / {
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP       $remote_addr;
    real_ip_header    X-Forwarded-For;
    set_real_ip_from  b.b.b.b;
    real_ip_recursive on;
}
  1. 负载均衡器添加 X-Forwarded-For 字段和客户端 IP
    X-Forwarded-For = a.a.a.a
  2. NGinx 通过省略 LB IP (b.b.b.b) 在 X-Forwarded-For 标头中搜索客户端真实 IP,并将 $remote_addrb.b.b.b 更改为 a.a.a.a,因此 proxy_set_header X-Real-IP $remote_addr 变为真(好吧,这就是我想要的!)
    但是,NGinx 还使用a.a.a.a IP 而不是b.b.b.b 完成X-Forwarded-For 标头
  3. WEBAPP 收到以下标头:
    X-Forwarded-For = a.a.a.a, a.a.a.a
    X-Real-IP = a.a.a.a
    -> X-Forwarded-For 应该是 a.a.a.a, b.b.b.b

我需要的是能够先设置proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for,然后搜索真实IP并替换$remote_addr值。

谁能帮我解决这个问题?

【问题讨论】:

  • 似乎您的 LB 没有将自己添加到标题中。
  • 我不这么认为,NGinx 将自己添加为 a.a.a.a(参见步骤 3,在 X-Forwarded-For 标头中有两次 a.a.a.a)而不是 b.b.b.b,因为 real_ip_header 执行之前proxy_set_header

标签: nginx http-headers


【解决方案1】:

$proxy_add_x_forwarded_for 等于$http_x_forwarded_for,$remote_addr,当使用http_realip_module 时,$remote_addr 变量将被更改。因此,您将不会获得该标头中的最后一个代理地址。更改指令的顺序不会产生影响,因为nginx 配置是声明性的。

使用http_realip_module时,$realip_remote_addr变量(nginx >= 1.9.7)可以作为原来的$remote_addr使用。因此,您可以像这样设置 X-Forwarded-For 标头:

proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $realip_remote_addr";

【讨论】:

  • 请为您的回答提供更多背景信息,为什么您的回答可能有效?答案应该清晰、完整,并能回答问题
  • 太棒了,这应该是正确的答案。
  • 解决方案有效,但这不是来自 nginx 的糟糕实现吗?他们至少应该用模块描述明确地告诉它,或者更好地提供另一个应该存储 nginx 客户端信息的变量。
【解决方案2】:

同样的问题。这很烦人,我实际上不确定这是功能还是错误:)

我知道这不是一个解决方案,但我已经删除了 real_ip_header,只需使用 X-Forwarded-For 第一个 ipaddress 即可在我需要的任何地方获取客户的 IP 地址(例如日志)。

【讨论】:

  • 这是一种解决方法 :) 您必须解析 X-Forwarded-For 才能获得真正的 IP,但它确实有效。我不知道 NGinx 团队是否想要这个功能或者它是否是一个错误......
  • 如果 real_ip_header 被移除,$remote_addr 不会从 X-Forwarded-For 获取实际客户端 IP。
【解决方案3】:

我最近遇到了同样的“问题”,得出的结论是这种行为是由real_ip_recursive on; 指令引起的。

来自nginx realip docs

如果启用递归搜索,则与其中一个受信任地址匹配的原始客户端地址将替换为请求标头字段中发送的最后一个非受信任地址。

您已指定信任b.b.b.b(因为您的set_real_ip_from b.b.b.b;

所以你所期望的,即a.a.a.a, b.b.b.b 将被a.a.a.a, a.a.a.a 取代。

让我明白这一点的来源是:https://serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong

【讨论】:

    猜你喜欢
    • 2018-07-17
    • 2014-10-22
    • 2011-01-01
    • 2011-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多