<div dir="ltr">я делал каскадные map-ы (когда переменная задается через переменную, задаваемую другим map-ом).<div><br></div><div>но решение далеко от идеального</div><div><br></div><div>1) требуется правка конфигов и релоад</div><div>2) очень сложно прикручивается эквивалент set_real_ip_from</div><div><br></div><div>возможно, в каком-то приближении, именно за счет маркера "запрос пришел с прокси" или "запрос пришел не с прокси" можно сделать нужный вам map</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">вс, 4 июн. 2023 г. в 20:40, Gena Makhomed <<a href="mailto:gmm@csdoc.com">gmm@csdoc.com</a>>:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Здравствуйте, All!<br>
<br>
Есть такая конфигурация:<br>
<br>
(1) client ==> vps_server ==> main_server<br>
<br>
(2) client ==> cloudflare => vps_server ==> main_server<br>
<br>
vps_server слушает на 80 и 443 портах и через модуль stream проксирует<br>
запроcы на main_server через tcp, передавая на main_server информацию<br>
о реальном IP клинта через proxy_protocol. Все SSL сертификаты<br>
и конфигурации сайтов хранятся при этом только на main_server.<br>
<br>
В первом случае для получения реального IP клиента - в блоке<br>
server надо прописать:<br>
<br>
set_real_ip_from 11.22.33.44;  # IP адрес vps_server<br>
real_ip_header proxy_protocol;<br>
<br>
Во втором случае для получения реального IP клиента - в блоке<br>
server надо прописать:<br>
<br>
set_real_ip_from <a href="http://173.245.48.0/20" rel="noreferrer" target="_blank">173.245.48.0/20</a>;<br>
...<br>
set_real_ip_from 2c0f:f248::/32;<br>
real_ip_header CF-Connecting-IP;<br>
<br>
При этом - в момент включения/выключения cloudflare<br>
для какого-то виртуального хоста - необходимо править<br>
конфиги nginx и делать релоад конфигурации nginx.<br>
<br>
Можно ли без правки исходников nginx используя только функциональность<br>
nginx и модуля njs получить автоматическое определение IP адреса клиента<br>
вне зависимости от того, каким образом пришел запрос - или от клиента<br>
напрямую на IP адерс vps_server, или через cloudflare proxy?<br>
<br>
Если без правки исходников nginx такую функциональность получить нельзя<br>
- как лучше всего написать патч, который реализует логику работы <br>
множественных директив set_real_ip_from и real_ip_header,<br>
таким образом, чтобы не сломать обратную совместимость<br>
со всеми уже существующими конфигурациями nginx?<br>
<br>
Может быть - лучше всего будет сделать в nginx<br>
два варианта директивы real_ip_header - первый<br>
вариант - как сейчас, с одним параметром,<br>
и второй вариант - с тремя параметрами:<br>
<br>
real_ip_header proxy_protocol set_real_ip_from 11.22.33.44;<br>
<br>
real_ip_header CF-Connecting-IP set_real_ip_from <a href="http://173.245.48.0/20" rel="noreferrer" target="_blank">173.245.48.0/20</a>;<br>
<br>
первый вариант, с одним параметром - как и раньше, может быть только <br>
один, а второй вариант - с тремя параметрами может присутствовать в <br>
конфигурации nginx больше одного раза.<br>
<br>
И если обрабатывать расширенные директивы real_ip_header в том порядке,<br>
в котором они встречаются в конфиге - то как раз и будет автоматически<br>
получена необходимая функциональность обработки множественных заголовков<br>
real_ip_header, при этом будет полностью соблюдена<br>
обратная совместимость со всеми текущими конфигурациями nginx,<br>
потому что ни у кого в конфигах сейчас нет директивы<br>
real_ip_header с тремя параметрами.<br>
<br>
Б большинтсве случаев, примерно 80-90% будет использоваться текущий<br>
синтаксис директивы real_ip_header, но при необходимости обработки<br>
нескольких директив real_ip_header - будет использоваться вариант<br>
с тремя параметрами, в оставшихся 10-20% случаев.<br>
<br>
старый синтаксис набора директив<br>
<br>
set_real_ip_from 11.11.11.11;<br>
set_real_ip_from 22.22.22.22;<br>
set_real_ip_from 33.33.33.33;<br>
real_ip_header X-Real-IP;<br>
<br>
может быть автоматически преобразован при чтении конфига<br>
во внутреннее представление аналогичное набору директив:<br>
<br>
real_ip_header X-Real-IP set_real_ip_from 11.11.11.11;<br>
real_ip_header X-Real-IP set_real_ip_from 22.22.22.22;<br>
real_ip_header X-Real-IP set_real_ip_from 33.33.33.33;<br>
<br>
- так что в nginx нужно будет реализовать только один вариант кода<br>
для обработки "расширенного" варианта конфига, с тремя директивами.<br>
<br>
Или существует какой-то еще лучший вариант решения этой задачи?<br>
<br>
-- <br>
Best regards,<br>
  Gena<br>
_______________________________________________<br>
nginx-ru mailing list<br>
<a href="mailto:nginx-ru@nginx.org" target="_blank">nginx-ru@nginx.org</a><br>
<a href="https://mailman.nginx.org/mailman/listinfo/nginx-ru" rel="noreferrer" target="_blank">https://mailman.nginx.org/mailman/listinfo/nginx-ru</a><br>
</blockquote></div>