кстати, proxy protocols - шикарная штука. вт, 6 июн. 2023 г. в 22:19, Gena Makhomed <g...@csdoc.com>:
> On 06.06.2023 14:00, Илья Шипицин wrote: > > > (на vps выставлять маркер, с клаудфлера запрос или нет > > $http_are_we_behind_cloudflare и по этому маркеру брать из одного или > > другого хедера) > > > > но в целом - это то самое "программирование на конфигах" > > > > map $http_are_we_behind_cloudflare $real_remote_addr { > > 'yes' $http_cf_connecting_ip; > > default $http_x_forwarded_for; > > } > > > Не получится на VPS выставлять маркер, потому что VPS проксирует трафик > на основной сервер через tcp, а не через http/https. Примерно так: > > # cat /etc/nginx/nginx.conf > > stream { > > server { > listen 11.11.11.11:80; > proxy_protocol on; > proxy_pass 22.22.22.22:57001; > } > > server { > listen 11.11.11.11:443; > proxy_protocol on; > proxy_pass 22.22.22.22:57002; > } > } > > самый простой вариант решения проблемы - это взять исходники > модуля ngx_http_realip_module, в котором определено три директивы > и две переменные, и на его основании сделать модуль > ngx_http_realip_module2, с такими директивами: > > set_real_ip_from2 > real_ip_header2 > real_ip_recursive2 > > и такими переменными: > > $realip_remote_addr2 > $realip_remote_port2 > > в таком случае на основном сервере будет такой конфиг: > > set_real_ip_from 11.11.11.11; > real_ip_header proxy_protocol; > > set_real_ip_from2 <cloudflare ip>; > ... > set_real_ip_from2 <cloudflare ip>; > real_ip_header2 CF-Connecting-IP; > > сначала отработают директивы set_real_ip_from и real_ip_header > из модуля ngx_http_realip_module и модуль установит переменные > > $remote_addr > $remote_port > > на основании данных, полученных из proxy_protocol, > после чего отработает модуль ngx_http_realip_module2 > и установит переменную > > $remote_addr > > на основании значения заголовка CF-Connecting-IP. > > - насколько я понимаю, с помощью njs написать модуль > ngx_http_realip_module2 не получится, потому что переменная > $remote_addr для njs находится в состоянии read only, > так что модуль ngx_http_realip_module2 необходимо будет > делать только используя язык программирования C. > > Не понятно только, можно ли будет включить этот модуль > ngx_http_realip_module2 в основную ветку nginx, или надо будет > писать его отдельно и вручную компилировать при выходе каждой > новой версии nginx? > > Более двух уровней обработки real_ip_header / real_ip_header2 > может понадобиться, чтобы включить одновременно возможность > автоматического получения реального IP клиента от cloudflare, > variti, stormwall и других сервисов защиты от DDoS. Тогда можно > было бы просто прописать в конфигах nginx одновременно > все допустимые варианты настройки и тогда можно было бы > вообще не править конфиги, при переключении метода защиты: > > set_real_ip_from <настройки для proxy_protocol>; > real_ip_header <настройки для proxy_protocol>; > > set_real_ip_from2 <настройки для cloudflare>; > real_ip_header2 <настройки для cloudflare>; > > set_real_ip_from3 <настройки для variti>; > real_ip_header3 <настройки для variti>; > > set_real_ip_from4 <настройки для stormwall>; > real_ip_header4 <настройки для stormwall>; > > Но тут не понятно, на каком количестве вариантов директив > надо остановиться, - 5, 10, 20 ? > > Выполнять же директивы просто в порядке следования в конфиге: > > set_real_ip_from <настройки для proxy_protocol>; > real_ip_header <настройки для proxy_protocol>; > > set_real_ip_from <настройки для cloudflare>; > real_ip_header <настройки для cloudflare>; > > set_real_ip_from <настройки для variti>; > real_ip_header <настройки для variti>; > > set_real_ip_from <настройки для stormwall>; > real_ip_header <настройки для stormwall>; > > нельзя, потому что это нарушит обратную совместимость > с уже существующими конфигурациями и такой патч > точно никогда не будет принят в основную ветку nginx. > > Вариант синтаксиса: > > real_ip_header <имя> set_real_ip_from <адрес>; > > позволяет неограниченное количество директив real_ip_header, > если обрабатывать их в том порядке, как они заданы в конфиге > - то получается максимально гибкая настройка конфигурации, > причем, даже без необходимости добавления новых директив. > > Но не знаю, примут ти такой патч/модуль в основную ветку nginx ? > > лучших вариантов синтаксиса, кроме > > real_ip_header <имя> set_real_ip_from <адрес>; > > я пока что не смог придумать. > > To Maxim Dounin: > > Максим, можно узнать Ваше мнение по этому вопросу? > > -- > 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