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