Что означает переменная $http_x_real_ip в директиве log_format Nginx? Я изучаю конфигурацию работающего Nginx и столкнулся с этой переменной в формате логирования. Не могу найти информацию о ней в официальной документации Nginx. Является ли это пользовательской переменной, которую нужно искать в конфигурации, или это стандартная переменная, которая не задокументирована?
Переменная $http_x_real_ip в Nginx — это стандартная системная переменная, которая содержит значение HTTP-заголовка X-Real-IP. Эта переменная используется для доступа к реальному IP-адресу клиента, переданному через прокси-серверы или CDN, и является частью встроенной системы переменных Nginx, где префикс $http_ указывает на доступ к значениям HTTP-заголовков.
Содержание
- Что такое $http_x_real_ip
- Как работает переменная $http_x_real_ip
- Примеры использования в log_format
- Отличия от других переменных IP
- Настройка и конфигурация
- Безопасность и валидация
- Заключение
Что такое $http_x_real_ip
Переменная $http_x_real_ip является частью стандартного набора переменных Nginx, который предоставляет доступ к значениям HTTP-заголовков. В Nginx существует общая система переменных, где любой HTTP-заголовок может быть доступен через переменную с именем $http_<имя_заголовка>, где имя заголовка преобразуется в нижний регистр, а дефисы заменяются на подчеркивания.
Таким образом, переменная $http_x_real_ip напрямую соответствует HTTP-заголовку X-Real-IP, который часто используется прокси-серверами и CDN для передачи реального IP-адреса клиента сквозь цепочку прокси.
Важно: Эта переменная не является пользовательской или кастомной — она является стандартной частью Nginx и доступна во всех сборках Nginx, начиная с ранних версий.
Как работает переменная $http_x_real_ip
Когда запрос проходит через Nginx, сервер автоматически создает переменные для всех полученных HTTP-заголовков. Процесс работы с $http_x_real_ip можно описать следующим образом:
- Клиент отправляет запрос через прокси-сервер
- Прокси-сервер добавляет заголовок
X-Real-IPс реальным IP-адресом клиента - Nginx получает этот заголовок и создает соответствующую переменную
$http_x_real_ip - В конфигурации Nginx можно использовать эту переменную в директивах, включая
log_format
Пример базового использования:
log_format main '$http_x_real_ip - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
Этот формат записи будет отображать реальный IP-адрес клиента, переданный через заголовок X-Real-IP.
Примеры использования в log_format
В исследованных конфигурациях были найдены различные примеры использования $http_x_real_ip в директиве log_format:
Базовый формат с реальным IP
log_format specialLog '$remote_addr forwarded for $http_x_real_ip - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
Комбинированный формат с несколькими IP-заголовками
log_format combined_realip '$http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
Формат для Cloudflare
log_format combined_realip_cf '$http_cf_connecting_ip $http_x_forwarded_for - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
Таблица сравнения форматов логирования
| Формат | Описание | Пример использования |
|---|---|---|
| Основной | Стандартный формат с реальным IP | Базовое логирование |
| Специальный | Указывает цепочку проксирования | Анализ маршрута запроса |
| Cloudflare | Оптимизирован для CDN | Работа с Cloudflare |
Как отмечается в исследованиях, для Nginx можно просто использовать переменную $http_x_real_ip вместо IP-адреса, чтобы получить реальный IP клиента, переданный через заголовок.
Отличия от других переменных IP
Важно понимать различия между различными IP-переменными в Nginx:
Сравнение IP-переменных
| Переменная | Описание | Когда используется |
|---|---|---|
$remote_addr |
IP-адрес последнего прокси-сервера | Прямое подключение к Nginx |
$http_x_forwarded_for |
Цепочка IP-адресов через прокси | Стандартный XFF заголовок |
$http_x_real_ip |
Реальный IP клиента | Заголовок X-Real-IP |
$http_cf_connecting_ip |
IP от Cloudflare | Работа с Cloudflare |
Как объясняется в обсуждениях на Stack Overflow, выбор между заголовками зависит от того, какой тип прокси-сервера используется и можно ли доверять получаемым данным.
Настройка и конфигурация
Для корректной работы с $http_x_real_ip может потребоваться дополнительная настройка Nginx:
Базовая конфигурация
http {
log_format main '$http_x_real_ip - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
server {
access_log /var/log/nginx/access.log main;
}
}
Настройка с модулем realip
Если используется модуль ngx_http_realip_module, можно доверять определенным прокси-серверам:
http {
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Real-IP;
log_format main '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"';
}
Как указано в документации Nginx, при отключенном рекурсивном поиске исходный адрес клиента, соответствующий одному из доверенных адресов, заменяется последним адресом, отправленным в заголовке запроса.
Безопасность и валидация
При использовании $http_x_real_ip важно учитывать аспекты безопасности:
Проверка доверенных прокси
http {
# Доверяем только определенным прокси-серверам
set_real_ip_from 192.168.1.0/24;
set_real_ip_from 10.0.0.0/8;
real_ip_header X-Real-IP;
}
Защита от подмены IP
Как отмечается в ответах на Server Fault, по умолчанию real_ip_header использует X-Real-IP, что означает, что вредоносный пользователь может отправить запрос с случайным X-Real-IP и это будет использовано как $remote_addr.
Рекомендации по безопасности
- Всегда указывайте доверенные прокси-серверы через
set_real_ip_from - Используйте безопасные сетевые сегменты для доверия
- Рассмотрите использование PROXY Protocol для более надежной передачи IP
- Валидируйте IP-адреса в приложении
Заключение
-
$http_x_real_ip — это стандартная переменная Nginx, содержащая значение заголовка
X-Real-IP, а не пользовательская переменная. -
Основное назначение — доступ к реальному IP-адресу клиента, переданному через прокси-серверы или CDN в виде HTTP-заголовка.
-
Применение в log_format позволяет включать реальный IP-адрес в логи вместо IP-адреса последнего прокси-сервера, что важно для анализа и мониторинга.
-
Настройка безопасности требует указания доверенных прокси-серверов через
set_real_ip_fromдля предотвращения подмены IP-адресов. -
Альтернативные заголовки — в зависимости от инфраструктуры можно использовать
X-Forwarded-For,CF-Connecting-IPили другие заголовки через соответствующие переменные Nginx.
Для более глубокого изучения рекомендую ознакомиться с официальной документацией по ngx_http_realip_module и изучить примеры конфигураций в реальных проектах.
Источники
- NGINX access_log: log the real client IP from X-Forwarded-For/X-Real-IP/cf-connecting-ip instead of the proxy IP
- nginx with real_ip – log both client remote_addr and proxies address - Server Fault
- NGINX and X-Forwarded-For Header (XFF) | Loadbalancer
- Get user real ip in nginx behind nginx reverse proxy – Yannick Pereira-Reis
- Module ngx_http_realip_module - Nginx Documentation
- Forwarding Visitor’s Real-IP in Nginx Proxy/Fastcgi backend correctly
- Difference between X-Forwarded-For and X-Real-IP headers - Stack Overflow
- How to use multiple real IP headers with nginx | Medium