я делал каскадные map-ы (когда переменная задается через переменную,
задаваемую другим map-ом).

но решение далеко от идеального

1) требуется правка конфигов и релоад
2) очень сложно прикручивается эквивалент set_real_ip_from

возможно, в каком-то приближении, именно за счет маркера "запрос пришел с
прокси" или "запрос пришел не с прокси" можно сделать нужный вам map

вс, 4 июн. 2023 г. в 20:40, Gena Makhomed <g...@csdoc.com>:

> Здравствуйте, All!
>
> Есть такая конфигурация:
>
> (1) client ==> vps_server ==> main_server
>
> (2) client ==> cloudflare => vps_server ==> main_server
>
> vps_server слушает на 80 и 443 портах и через модуль stream проксирует
> запроcы на main_server через tcp, передавая на main_server информацию
> о реальном IP клинта через proxy_protocol. Все SSL сертификаты
> и конфигурации сайтов хранятся при этом только на main_server.
>
> В первом случае для получения реального IP клиента - в блоке
> server надо прописать:
>
> set_real_ip_from 11.22.33.44;  # IP адрес vps_server
> real_ip_header proxy_protocol;
>
> Во втором случае для получения реального IP клиента - в блоке
> server надо прописать:
>
> set_real_ip_from 173.245.48.0/20;
> ...
> set_real_ip_from 2c0f:f248::/32;
> real_ip_header CF-Connecting-IP;
>
> При этом - в момент включения/выключения cloudflare
> для какого-то виртуального хоста - необходимо править
> конфиги nginx и делать релоад конфигурации nginx.
>
> Можно ли без правки исходников nginx используя только функциональность
> nginx и модуля njs получить автоматическое определение IP адреса клиента
> вне зависимости от того, каким образом пришел запрос - или от клиента
> напрямую на IP адерс vps_server, или через cloudflare proxy?
>
> Если без правки исходников nginx такую функциональность получить нельзя
> - как лучше всего написать патч, который реализует логику работы
> множественных директив set_real_ip_from и real_ip_header,
> таким образом, чтобы не сломать обратную совместимость
> со всеми уже существующими конфигурациями nginx?
>
> Может быть - лучше всего будет сделать в nginx
> два варианта директивы real_ip_header - первый
> вариант - как сейчас, с одним параметром,
> и второй вариант - с тремя параметрами:
>
> real_ip_header proxy_protocol set_real_ip_from 11.22.33.44;
>
> real_ip_header CF-Connecting-IP set_real_ip_from 173.245.48.0/20;
>
> первый вариант, с одним параметром - как и раньше, может быть только
> один, а второй вариант - с тремя параметрами может присутствовать в
> конфигурации nginx больше одного раза.
>
> И если обрабатывать расширенные директивы real_ip_header в том порядке,
> в котором они встречаются в конфиге - то как раз и будет автоматически
> получена необходимая функциональность обработки множественных заголовков
> real_ip_header, при этом будет полностью соблюдена
> обратная совместимость со всеми текущими конфигурациями nginx,
> потому что ни у кого в конфигах сейчас нет директивы
> real_ip_header с тремя параметрами.
>
> Б большинтсве случаев, примерно 80-90% будет использоваться текущий
> синтаксис директивы real_ip_header, но при необходимости обработки
> нескольких директив real_ip_header - будет использоваться вариант
> с тремя параметрами, в оставшихся 10-20% случаев.
>
> старый синтаксис набора директив
>
> set_real_ip_from 11.11.11.11;
> set_real_ip_from 22.22.22.22;
> set_real_ip_from 33.33.33.33;
> real_ip_header X-Real-IP;
>
> может быть автоматически преобразован при чтении конфига
> во внутреннее представление аналогичное набору директив:
>
> real_ip_header X-Real-IP set_real_ip_from 11.11.11.11;
> real_ip_header X-Real-IP set_real_ip_from 22.22.22.22;
> real_ip_header X-Real-IP set_real_ip_from 33.33.33.33;
>
> - так что в nginx нужно будет реализовать только один вариант кода
> для обработки "расширенного" варианта конфига, с тремя директивами.
>
> Или существует какой-то еще лучший вариант решения этой задачи?
>
> --
> Best regards,
>   Gena
> _______________________________________________
> nginx-ru mailing list
> nginx-ru@nginx.org
> https://mailman.nginx.org/mailman/listinfo/nginx-ru
>
_______________________________________________
nginx-ru mailing list
nginx-ru@nginx.org
https://mailman.nginx.org/mailman/listinfo/nginx-ru

Ответить