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

Maxim Dounin mdounin на mdounin.ru
Пт Июн 9 06:29:02 UTC 2023


Hello!

On Sun, Jun 04, 2023 at 09:40:17PM +0300, Gena Makhomed wrote:

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

Если у вас в обоих случаях vps_server проксирует всё через stream 
с proxy_protocol, то на принимающей стороне вам в любом случае 
надо сначала достать реальный адрес клиента из proxy_protocol.  А 
уже потом смотреть в заголовки (или не смотреть, если на 
vps_server пришли не с IP-адресов Cloudflare).

То есть, фактически, для корректной работы такой схемы - нужен 
"real_ip_recursive on;" (http://nginx.org/r/real_ip_recursive) и 
заголовок со списком нужных адресов.

Сейчас из коробки такое можно сделать дополнительным 
проксированием с установкой заголовка.  Для стандартного заголовка 
X-Forwarded-For, благо Cloudflare его ставит, конфигурация будет 
выглядеть как-то так:

server {
    listen 8080 proxy_protocol;
   
    set_real_ip_from <vps>;
    real_ip_header proxy_protocol;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

server {
    listen 8081;
    
    set_real_ip_from 127.0.0.1;
    set_real_ip_from <cloudflare>;

    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    ...
}

[...]

> Или существует какой-то еще лучший вариант решения этой задачи?

Я периодически думаю о том, чтобы научить модуль realip брать 
список IP-адресов не из заголовка, а непосредственно из 
переменной.  Тогда необходимость в дополнительном проксировании в 
подобных странных конфигурациях отпадёт.

Но в целом это выглядит как достаточно маргинальный use case, 
IMHO, и доступное сейчас решение с дополнительным проксированием 
ему плюс-минус адекватно.

-- 
Maxim Dounin
http://mdounin.ru/


Подробная информация о списке рассылки nginx-ru