Welcome! Log In Create A New Profile

Advanced

Re: множественные директивы real_ip_header

Gena Makhomed
June 06, 2023 04:20PM
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
Subject Author Posted

множественные директивы real_ip_header

Gena Makhomed June 04, 2023 02:42PM

Re: множественные директивы real_ip_header

Илья Шипицин June 05, 2023 06:08AM

Re: множественные директивы real_ip_header

Gena Makhomed June 05, 2023 11:48AM

Re: множественные директивы real_ip_header

Илья Шипицин June 06, 2023 06:56AM

Re: множественные директивы real_ip_header

Илья Шипицин June 06, 2023 07:02AM

Re: множественные директивы real_ip_header

Gena Makhomed June 06, 2023 04:20PM

Re: множественные директивы real_ip_header

Илья Шипицин June 06, 2023 06:02PM

Re: множественные директивы real_ip_header

Maxim Dounin June 09, 2023 02:30AM

новая версия модуля ngx_http_realip_module

Gena Makhomed June 11, 2023 07:32PM

Re: новая версия модуля ngx_http_realip_module

Maxim Dounin June 11, 2023 09:28PM



Sorry, only registered users may post in this forum.

Click here to login

Online Users

Guests: 209
Record Number of Users: 8 on April 13, 2023
Record Number of Guests: 421 on December 02, 2018
Powered by nginx      Powered by FreeBSD      PHP Powered      Powered by MariaDB      ipv6 ready