Commit b4a3389 更新后如何获取用户ip

该提交修复了一个你依赖的配置错误,但该错误也可能允许任何最终用户通过设置该标头来伪造其 IP 地址。

实际上有一种更简单的方法,无需使用套接字——我刚刚撰写了一份关于如何操作的指南。

对于你的设置 @CLOUD_PHT,你应该在容器定义中添加以下内容(如果已存在 run 部分,请将这些指令添加到其中;否则,请添加 run 部分):

run:
  - file:
      path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
      chmod: 644
      contents: |
        real_ip_header x-forwarded-for;
  - file:
      path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-host.conf
      chmod: 644
      contents: |
        set_real_ip_from 172.17.0.1;

可能还需要以下内容:

  - file:
      # 我们需要开启递归模式,因为我们将拥有至少两个条目:一个来自主机,一个来自 CloudFlare
      path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
      chmod: 644
      contents: |
        real_ip_recursive on;

这取决于你服务器上的 nginx 本身是否正在处理 Cloudflare 标头以确定最终用户的真实 IP(建议这样做),还是仅仅在其之上添加自己的标头。更多详情请参见 https://meta.discourse.org/t/handling-the-chain-of-trust-of-the-end-users-real-ip/406372#p-2001772-more-than-one-proxy-7


其他读者:请注意,此指令

run:
  - file:
      path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-host.conf
      chmod: 644
      contents: |
        set_real_ip_from 172.17.0.1;

并不适用于所有设置。仅当来自此 IP 的所有连接到 Discourse 容器的连接都是可信的时,才执行此操作。

具体来说,IPv6 设置的一个已知问题是,到服务器的 IPv6 连接由 Docker 通过 IPv4 转发——其实现方式使得所有连接看起来都来自主机的 docker0 IP 地址。如果你将上述指令应用到你的设置中,它将允许所有通过 IPv6 连接的用户随意伪造其 IP 地址。