🌐 Nginx может сохранять исходный IP клиента даже за цепочкой прокси
👁 В сложной инфраструктуре запрос может пройти через балансировщик, CDN и несколько прокси. Если доверять заголовку
X-Forwarded-For без ограничений, клиент сможет подменить свой IP и повлиять на журналирование, ограничения запросов и правила доступа.📝 Доверяем только известным прокси:
Модуль Real IP позволяет восстановить адрес клиента из заголовка, но доверенными нужно объявлять только реальные адреса промежуточных узлов.
set_real_ip_from 10.20.0.0/16;
set_real_ip_from 192.0.2.10;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
📝 Используем восстановленный IP для ограничений:
После обработки Real IP переменная
$binary_remote_addr содержит бинарное представление восстановленного адреса. Её удобно применять для ограничения частоты запросов без лишних затрат на хранение ключей.
http {
limit_req_zone $binary_remote_addr
zone=per_ip:10m rate=10r/s;
server {
location /api/ {
limit_req zone=per_ip burst=20 nodelay;
proxy_pass http://backend;
}
}
}
📝 Проверяем, какой адрес Nginx считает клиентским:
Добавьте отдельный формат журнала, чтобы видеть исходный адрес соединения и восстановленный адрес клиента. Это помогает обнаружить ошибочную настройку доверенных прокси.
log_format client_ip
'peer=$realip_remote_addr '
'client=$remote_addr '
'xff="$http_x_forwarded_for" '
'request="$request" status=$status';
access_log /var/log/nginx/client_ip.log client_ip;
❗️ Главное правило:
set_real_ip_from должен содержать только доверенные узлы, которые действительно контролируют передаваемые заголовки. Если разрешить доверие произвольным адресам, клиент сможет подделать IP, а ограничения и журналы потеряют достоверность.tags: #nginx #разработка #devops
🧭 @recura_tech