Реальный IP больше не распознается через прокси

За последние пару месяцев (не уверен, когда именно это началось) я заметил, что моя внешняя конфигурация nginx, документированная на Add an offline page to display when Discourse is rebuilding or starting up , для передачи реального IP-адреса игнорируется.

Эта внешняя конфигурация nginx работала годами:

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header X-Real-IP $remote_addr;

Теперь я вижу, что весь трафик приписывается внутренней сети Docker в пространстве RFC1918, вот так:

Очевидно, это ломает функцию «применить этот штраф к другим пользователям, использующим этот IP-адрес» и все остальные случаи использования реального удаленного IP-адреса.

Я предполагаю, что это уже где-то обсуждалось, и я просто плохо искал. :frowning: Но буду признателен за подсказки, что могло измениться, под что мне нужно адаптироваться.

Недавно я что-то помнил об этом, но не могу найти. Handling the "chain of trust" of the end user's real IP - #8 by supermathie включает ссылку на шаблон Cloudflare, который, как мне кажется, может быть хорошей моделью.

Вот что я делаю, и это, похоже, всё ещё работает (на момент «Discourse 2026.6.0-latest - GitHub - discourse/discourse: A platform for community discussion. Free, open, simple. · GitHub версия 5c507d8359f4d6e8a5d98780c622d51cedbd9bd7»)

after_bundle_exec:
  - replace:
    filename: /etc/nginx/conf.d/discourse.conf
    from: "types {"
    to: |
      set_real_ip_from 192.168.1.0/24;
      set_real_ip_from 192.168.11.0/24;
      set_real_ip_from 172.16.0.0/12;
      set_real_ip_from 10.0.0.0/8;
      real_ip_recursive on;
      real_ip_header X-Forwarded-For;
      types {

Вероятно, это связано с этим коммитом: FIX: nginx sample configuration should be setting x-f-f to the end us… · discourse/discourse@b4a3389 · GitHub

Это может вам помочь:

Как обычно, публикация и просмотр ответов помогают мне найти другие похожие посты. :rofl: Например,

Спасибо всем! Теперь займусь настройкой set_real_ip_from в контейнере nginx!

Я собираюсь использовать весь диапазон RFC1918. Для справки других пользователей, это будет выглядеть так:

after_bundle_exec:
  - replace:
    filename: /etc/nginx/conf.d/discourse.conf
    from: "types {"
    to: |
      set_real_ip_from 192.168.0.0/16;
      set_real_ip_from 172.16.0.0/12;
      set_real_ip_from 10.0.0.0/8;
      real_ip_recursive on;
      real_ip_header X-Forwarded-For;
      types {

У меня это не работает.

Теперь я понимаю, почему это перестало работать для меня после упомянутого коммита: он сломал замену set_real_ip, которую я использовал на протяжении многих лет. Обоснование повышения надёжности звучит разумно, и этот подход лучше: одно нарушение обратной совместимости сейчас, но в будущем таких проблем будет меньше.

Я не знаю, почему замена after_bundle_exec не применяется, но я собираюсь переключиться на метод добавления файлов.

Это работает для меня; делюсь решением для следующего человека:

run:
  - file:
     path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
     chmod: 644
     contents: |
       real_ip_recursive on;
  - 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.conf
     chmod: 644
     contents: |
       set_real_ip_from 192.168.0.0/16;
       set_real_ip_from 172.16.0.0/12;
       set_real_ip_from 10.0.0.0/8;