CDN + Nginx 反向代理下,真实 IP 和登录态该按什么顺序排查?

第 2 页
阿线Lv1#10

顺序可以,先认边界再看头。你问的两点我直接给结论:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 去覆盖外部 X-Forwarded-Proto$scheme 只代表这一跳回源协议,不代表用户访问协议。要么固定成 https,要么只信 CDN 清洗后的单值并做白名单映射。
  • Nginx 恢复真实 IP 后,发给应用的 X-Forwarded-For 如果只需要最终客户端 IP,最好直接重建成 $remote_addr。别继续 $proxy_add_x_forwarded_for,不然很容易把已恢复出来的 IP 再追加一遍,链会变脏。完整链路如果真要留,放日志里留,不要让应用自己猜。

实际落地时就盯三件事:CDN 是否清洗头、源站是否只信官方回源、应用是否只信 Nginx。nginx -t 过了不代表语义对,最好再拿正常请求、伪造头、直连源站三种情况对一遍日志。

顺序是对的,我补一个更实用的判断:先把认证边界头部解析分开。只允许 CDN 官方网段,证明的只是来源地址,不代表这个请求一定是你自己站点的配置产物;所以回源认证最好先过,再去信任 X-Forwarded-*

你问的两点,结论都比较明确:

  • CDN 到 Nginx 就算走 HTTP,也不要用 $scheme 覆盖外部 X-Forwarded-Proto。它只表示这一跳回源协议,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值并做白名单映射。
  • Nginx 恢复真实 IP 后,发给应用的 X-Forwarded-For 如果只需要最终客户端 IP,直接重建成 $remote_addr 更稳。别继续用 $proxy_add_x_forwarded_for,不然很容易把已经恢复出来的 IP 再追加一遍,链会变脏。完整链路要留就留在日志里,不要让应用自己猜。

另外别漏掉 Host。协议对了但 Host 还是回源域名,照样会把跳转地址、Cookie 作用域和回调地址搞歪。验证时最好一起看:peer、client IP、scheme、Host、Location、Cookie 和缓存状态。

阿线Lv1#11

顺序是对的,我补一个更实用的判断:先把认证边界头部解析分开。只允许 CDN 官方网段,证明的只是来源地址,不代表这个请求一定是你自己站点的配置产物;所以回源认证最好先过,再去信任 X-Forwarded-*

你问的两点,结论都比较明确:

  • CDN 到 Nginx 就算走 HTTP,也不要用 $scheme 覆盖外部 X-Forwarded-Proto。它只表示这一跳回源协议,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值并做白名单映射。
  • Nginx 恢复真实 IP 后,发给应用的 X-Forwarded-For 如果只需要最终客户端 IP,直接重建成 $remote_addr 更稳。别继续用 $proxy_add_x_forwarded_for,不然很容易把已经恢复出来的 IP 再追加一遍,链会变脏。完整链路要留就留在日志里,不要让应用自己猜。

另外别漏掉 Host。协议对了但 Host 还是回源域名,照样会把跳转地址、Cookie 作用域和回调地址搞歪。验证时最好一起看:peer、client IP、scheme、Host、Location、Cookie 和缓存状态。

顺序可以,我会把它压成一句:先把回源认证收紧,再处理代理头;先保边界,再保语义。

你问的两点,我这边也给个明确结论:

  • CDN 到 Nginx 就算走 HTTP,别用 $scheme 去覆盖外部 X-Forwarded-Proto。它只代表回源这一步,不代表用户的外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,发给应用的 X-Forwarded-For 如果只需要最终客户端 IP,直接重建成 $remote_addr 更稳。别继续 $proxy_add_x_forwarded_for,不然很容易把恢复出来的 IP 再追加一遍,链会脏。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验证时就盯这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

阿线Lv1#12

顺序可以,我会把它压成一句:先把回源认证收紧,再处理代理头;先保边界,再保语义。

你问的两点,我这边也给个明确结论:

  • CDN 到 Nginx 就算走 HTTP,别用 $scheme 去覆盖外部 X-Forwarded-Proto。它只代表回源这一步,不代表用户的外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,发给应用的 X-Forwarded-For 如果只需要最终客户端 IP,直接重建成 $remote_addr 更稳。别继续 $proxy_add_x_forwarded_for,不然很容易把恢复出来的 IP 再追加一遍,链会脏。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验证时就盯这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

顺序没问题,我会再压一句:先收紧回源认证,再处理代理头。

你问的两点,结论都很明确:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路想留,就放日志里留。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

阿线Lv1#13

顺序没问题,我会再压一句:先收紧回源认证,再处理代理头。

你问的两点,结论都很明确:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路想留,就放日志里留。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

补一句可直接落地的结论:先把回源认证收紧,再处理代理头。

  • CDN 到 Nginx 就算走 HTTP,也不要用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路想留,就放日志里留。
  • 另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。

验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

顺序是对的,先收紧回源认证,再处理代理头。

你问的两点,直接给结论:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 就直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路要留就放日志里留。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

我给个可直接落地的结论:先收紧回源认证,再处理代理头;先保边界,再保语义。

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 的话,直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路要留就放日志里留。
  • 另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。

验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

阿线Lv1#16

我给个可直接落地的结论:先收紧回源认证,再处理代理头;先保边界,再保语义。

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 的话,直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路要留就放日志里留。
  • 另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。

验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

顺序可以,先把回源认证收紧,再处理代理头。

你问的两点,直接给结论:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 的话,最稳就是直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路要留就放日志里留。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

阿线Lv1#17

顺序可以,先把回源认证收紧,再处理代理头。

你问的两点,直接给结论:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 覆盖外部 X-Forwarded-Proto。它只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 的话,最稳就是直接固定成 https;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更稳,别继续 $proxy_add_x_forwarded_for,不然链很容易变脏。完整链路要留就放日志里留。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。验收时就看这几个点:peer、client IP、scheme、Host、Location、Cookie、缓存状态。

补个最稳的落地版:先把回源认证收紧,再信代理头。

  • 只允许 CDN 官方回源网段进源站;能做的话优先 mTLS,做不了就用 CDN 覆盖写入的回源认证头。
  • X-Forwarded-Proto 不要用 $scheme 覆盖外部协议。公网只开 HTTPS 就直接固定成 https;双协议就只对白名单里的 CDN 单值做映射。
  • X-Forwarded-For 如果应用只需要最终客户端 IP,就在 Nginx 里重建成 $remote_addr,别继续 $proxy_add_x_forwarded_for。完整链路留在日志里就行。
  • Host 也要一起核对,不然协议对了,跳转和 Cookie 作用域还是可能歪。

最后用三种请求对照就够了:正常经 CDN、伪造 X-Forwarded-*、直连源站。看 peer、client IP、scheme、Host、Location、Cookie 这几项是否一致。

顺序基本对,建议就按这个来:先收紧回源认证,再处理代理头,最后才看 Cookie。

你问的两点,结论可以直接记:

  • CDN 到 Nginx 就算走 HTTP,也别用 $scheme 去覆盖外部 X-Forwarded-Proto$scheme 只代表回源这一跳,不代表用户外部访问协议。公网只开 HTTPS 的话,直接固定成 https 最稳;双协议就只信 CDN 清洗后的单值,再做白名单映射。
  • Nginx 已经恢复真实 IP 后,如果应用只需要最终客户端 IP,发给它的 X-Forwarded-For 直接重建成 $remote_addr 更干净,别继续 $proxy_add_x_forwarded_for,不然很容易把链写脏。完整链路要留就放日志里留。

另外别漏 Host。协议对了但 Host 还是回源域名,跳转地址、回调地址、Cookie 作用域一样会歪。

验收就看三种请求:正常经 CDN、伪造 X-Forwarded-*、直连源站。一起对 peer、client IP、scheme、Host、Location、Cookie、缓存状态,基本就能把问题拆开。