在更新完
所有用户的最后使用地址都变为了docker的网关如 172.17.0.1
我使用的架构如
cloudflare → VPS Nginx → Discourse docker Nginx → Discourse
在更新完
所有用户的最后使用地址都变为了docker的网关如 172.17.0.1
我使用的架构如
cloudflare → VPS Nginx → Discourse docker Nginx → Discourse
我的设置和你类似,以下是我添加到主机 nginx 配置中的内容,以便传递用户的 IP 地址:
location / {
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header X-Forwarded-For;
proxy_pass http://unix:/var/discourse/shared/standalone/nginx.http.sock:;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
你好 @CLOUD_PHT - 欢迎来到 Meta ![]()
我猜你是在同一台机器配置上运行了多个网站?(比如一个 WordPress 站点 + Discourse)
问题在于你正在通过 Docker 的内部网络(端口映射)路由流量,这会将所有传入请求伪装成 Docker 网关 IP(172.17.0.1)。由于内部 Nginx 不识别 172.17.0.1 为 Cloudflare IP,出于安全考虑,它会丢弃 CF-Connecting-IP 标头。
要解决这个问题,你需要将设置切换为使用 Unix 套接字——这允许你的外部 Nginx 将流量(以及标头)直接传递给 Discourse,而不会因 Docker 的网络问题而破坏 IP 地址。
请遵循此官方指南,并在重建时确保在 app.yml 文件中保留 cloudflare.template.yml。
该提交修复了一个你依赖的配置错误,但该错误也可能允许任何最终用户通过设置该标头来伪造其 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 地址。