Заголовок X-Forwarded-For: определение IP клиента за прокси
Когда запрос проходит через прокси, балансировщики или CDN, реальный IP клиента теряется — сервер видит IP прокси. Заголовок X-Forwarded-For (XFF) решает проблему, передавая реальный IP через цепочку прокси.
Как работает X-Forwarded-For
Каждый прокси добавляет IP предыдущего хопа:
Клиент (203.0.113.50) → Прокси1 (10.0.0.1) → Прокси2 (10.0.0.2) → Сервер
X-Forwarded-For: 203.0.113.50, 10.0.0.1
Левый IP — оригинальный клиент. Каждый последующий — прокси в цепочке.
Связанные заголовки
- X-Forwarded-For: цепочка IP клиента (де-факто стандарт)
- X-Real-IP: единственный IP клиента (конвенция Nginx)
- Forwarded: стандартизированная замена (RFC 7239)
- X-Forwarded-Proto: исходный протокол (http/SSL/TLS проверку)
- X-Forwarded-Host: исходный Host
Почему это важно
- Логирование: без XFF все запросы кажутся от IP балансировщика
- Rate limiting: ограничение по реальному IP клиента
- IP геолокацию: GeoIP нужен реальный IP
- Контроль доступа: IP-based ACL нуждаются в реальном IP
- Аналитика: точный подсчёт посетителей
- Безопасность: обнаружение мошенничества
Конфигурация серверов
Nginx
set_real_ip_from 10.0.0.0/8;
set_real_ip_from 172.16.0.0/12;
real_ip_header X-Forwarded-For;
real_ip_recursive on;
Apache
RemoteIPHeader X-Forwarded-For
RemoteIPTrustedProxy 10.0.0.0/8
RemoteIPTrustedProxy 172.16.0.0/12
PHP
function getClientIP(): string {
$trusted = ['10.0.0.0/8', '172.16.0.0/12'];
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
$ips = array_map('trim', explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']));
foreach (array_reverse($ips) as $ip) {
if (!isTrustedProxy($ip, $trusted)) return $ip;
}
}
return $_SERVER['REMOTE_ADDR'];
}
Безопасность: проблема доверия
XFF легко подделать. Любой клиент может отправить:
X-Forwarded-For: 1.2.3.4
Если сервер доверяет левому IP — атакующий может выдать себя за любой адрес. Решение: доверяйте только записям от известных прокси.
Правильный алгоритм разбора
- Начните с правого IP в X-Forwarded-For
- Проверьте — это доверенный прокси?
- Если да — двигайтесь влево
- Первый недоверенный IP — реальный клиент
- Никогда не доверяйте левому IP вслепую
Типичные ошибки
- Доверие левому IP: парсите справа налево, пропуская доверенные прокси
- Нет списка доверенных: без цепочки доверия XFF бесполезен для безопасности
- Несколько заголовков XFF: некоторые прокси создают новый заголовок. Конкатенируйте все.
- Утечка внутренних IP: XFF может раскрыть топологию внутренней сети
- IPv6: убедитесь, что парсинг обрабатывает оба формата
Cloudflare
Cloudflare предоставляет CF-Connecting-IP с проверенным IP клиента. Надёжнее XFF, так как контролируется Cloudflare.
Заключение
X-Forwarded-For необходим за прокси, но требует аккуратной обработки. Настройте цепочку доверия, парсите справа налево и никогда не доверяйте левому IP вслепую.
Проверьте ваш сайт прямо сейчас
Проверить →