Здравствуйте, 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

Ответить