🌐 Nginx может сохранять исходный IP клиента даже за цепочкой прокси
🌐 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