множественные директивы 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