кстати, 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

Ответить