mcdanlj
(Michael K Johnson)
16.Июль.2026 13:02:29
1
За последние пару месяцев (не уверен, когда именно это началось) я заметил, что моя внешняя конфигурация 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-адреса.
Я предполагаю, что это уже где-то обсуждалось, и я просто плохо искал. Но буду признателен за подсказки, что могло измениться, под что мне нужно адаптироваться.
pfaffman
(Jay Pfaffman)
16.Июль.2026 13:27:43
2
Недавно я что-то помнил об этом, но не могу найти. Handling the "chain of trust" of the end user's real IP - #8 by supermathie включает ссылку на шаблон Cloudflare, который, как мне кажется, может быть хорошей моделью.
run:
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header cf-connecting-ip;
- exec:
cmd:
# avoid the trap of specifying both URLs on one curl line; the data might not have a final newline
# print sprintf looks dubious at first, but avoids the problem of "how many times do you backslash a \\\\n"
- curl -s https://www.cloudflare.com/ips-v4/ | awk '{print sprintf("set_real_ip_from %s;", $0)}' > /etc/nginx/conf.d/outlets/server/set-real-ip-from-cloudflare.conf
- curl -s https://www.cloudflare.com/ips-v6/ | awk '{print sprintf("set_real_ip_from %s;", $0)}' >> /etc/nginx/conf.d/outlets/server/set-real-ip-from-cloudflare.conf
Вот что я делаю, и это, похоже, всё ещё работает (на момент «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 {
chapoi
16.Июль.2026 14:39:50
3
Вероятно, это связано с этим коммитом: FIX: nginx sample configuration should be setting x-f-f to the end us… · discourse/discourse@b4a3389 · GitHub
Это может вам помочь:
Введение
Discourse должен знать реальный IP-адрес конечного пользователя.
Однако конечный пользователь никогда не подключается к Discourse напрямую, поскольку всегда присутствует один или несколько вышестоящих веб-серверов (nginx, работающий в контейнере Discourse). Таким образом, нам необходим способ надежной передачи этой информации в Discourse.
Решением является заголовок x-forwarded-for. В этой теме я опишу конкретные механизмы корректной обработки этой информации и то, как мы ожидаем её р…
mcdanlj
(Michael K Johnson)
16.Июль.2026 15:16:04
4
Как обычно, публикация и просмотр ответов помогают мне найти другие похожие посты. Например,
Hi,
I have researched quite a lot but nothing seems to work with me.
I have a discourse setup installed. And I have this remote reverse proxy server that acts as a HTTPS layer between the user and the main discourse server..
[image]
I have included these revers proxy settings properly.. But why does it still show my Reverse Proxy server’s IP Address (hostname to be specific)
[image]
Спасибо всем! Теперь займусь настройкой 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 {
mcdanlj
(Michael K Johnson)
16.Июль.2026 17:07:03
5
У меня это не работает.
Теперь я понимаю, почему это перестало работать для меня после упомянутого коммита: он сломал замену 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;