Deprecated: str_replace(): Passing null to parameter #3 ($subject) of type array|string is deprecated in /home4/ebmbismy/public_html/wp-content/themes/genesis/lib/functions/image.php on line 116
Подделка заголовка X-Forwarded-For ломает GeoIP-фильтрацию тихо и без единой ошибки в логах: reverse proxy видит “легитимный” IP из заголовка, пропускает запрос дальше, а атакующий уже внутри периметра. Если в чек-листе аудита логов нет отдельного пункта на проверку этого заголовка, вы не найдёте атаку даже при полном логировании. Ниже – рабочий чек-лист, по которому можно пройтись по конфигам и логам за один вечер.
Почему X-Forwarded-For стал точкой входа для обхода GeoIP
Заголовок X-Forwarded-For придуман для балансировщиков: он сообщает бэкенду, с какого IP пришёл клиент, если трафик проходит через промежуточный узел. Проблема в том, что это обычный текстовый заголовок HTTP. Клиент может отправить его сам, и если reverse proxy просто дописывает свой узел в конец цепочки, не проверяя источник, первое значение в списке остаётся под контролем атакующего.
Дальше срабатывает простая логика. GeoIP-модуль читает заголовок, видит IP из разрешённой страны и пропускает запрос. WAF-правила, привязанные к геолокации, тоже молчат. Атакующий подставляет произвольный IP и обходит GeoIP-фильтрацию, даже если сама фильтрация настроена корректно. Это не экзотика: сканеры и ботнеты перебирают заголовок десятками вариантов в час, особенно на сайтах интернет-магазинов, где гео-ограничения закрывают партнёрские и складские разделы.
Отдельная сложность – цепочка доверенных прокси. Если перед вашим reverse proxy стоит CDN, а перед ней ещё один балансировщик, заголовок собирается из нескольких значений. Проверять нужно не сам факт наличия заголовка, а то, что предпоследний узел в цепочке входит в список доверенных адресов. Всё, что пришло левее, – это данные от клиента, и доверять им нельзя.
Как отличить легитимный заголовок от подделки в логах
Разница видна по структуре записи. Легитимный запрос через доверенный прокси даёт цепочку, где каждое следующее значение – адрес вашей инфраструктуры, а последнее совпадает с remote_addr. Подделка выглядит иначе: remote_addr указывает на реального клиента, а X-Forwarded-For содержит посторонний IP, которого в вашей сети нет. Иногда атакующий добавляет свой настоящий адрес в конец списка, чтобы цепочка выглядела правдоподобно, но не может подделать remote_addr, который пишет само ядро TCP-соединения.
Практический признак: расхождение между географией remote_addr и географией первого значения в заголовке. Если remote_addr разрешается в страну, закрытую GeoIP-правилом, а заголовок показывает разрешённую страну, – это почти наверняка попытка обхода. Второй признак: один и тот же remote_addr приходит с десятками разных значений X-Forwarded-For за короткое время. Так ведёт себя автоматизированный перебор.
Чек-лист аудита логов reverse proxy
Проходите пункты по порядку, фиксируя результат в тикете. cloudflare в россии 2026 offers additional context worth reviewing. Первые три пункта закрываются за час, остальные требуют правки конфигов и перезапуска сервисов.
- Проверка X-Forwarded-For на подделку. Убедитесь, что proxy валидирует цепочку: доверяет заголовку только от адресов из белого списка и игнорирует значение, если источник не входит в список. Если валидации нет, любой клиент может подставить произвольный IP и обойти GeoIP-фильтрацию.
- Логирование по remote_addr, а не по заголовку. В формат лога добавьте реальный IP соединения отдельным полем. Заголовок пишите тоже, но как справочное значение. Все решения по блокировке, аналитике и GeoIP должны опираться на remote_addr.
- Сверка количества значений в цепочке. Если у вас один доверенный прокси, в заголовке после обработки должно остаться ровно одно значение. Больше – значит, клиент прислал свои данные, и их нужно отбросить.
- Проверка GeoIP-правил на привязку к заголовку. Найдите в конфигах все места, где геолокация берётся из X-Forwarded-For, и переведите их на remote_addr. Это касается не только блокировок, но и редиректов по стране, выбора валюты и языковых версий.
- Выборка аномалий за последние 30 дней. Сгруппируйте записи по remote_addr и посчитайте уникальные значения X-Forwarded-For на каждый адрес. Всё, что выше десяти, разбирайте вручную – это кандидаты на сканирование.
- Проверка поведения WAF и защиты от ботов. Убедитесь, что правила WAF и L7 DDoS-фильтры не доверяют заголовку при принятии решения о блокировке. Иначе атакующий подставит IP из разрешённой подсети и пройдёт мимо защиты.
После правки конфигов прогоните тестовый запрос с подставленным заголовком через curl и посмотрите, что попало в лог. Если в поле GeoIP оказался подставленный IP, пункт не закрыт. Проверку стоит повторить для каждого прокси в цепочке: часто валидация настроена на внешнем узле, но внутренний балансировщик снова начинает доверять заголовку.
Что делать после аудита и как не наступить на грабли снова
Результат аудита почти всегда один: часть логов придётся переписать, потому что аналитика и защита строились на заголовке. Это больно, но дешевле, чем разбираться с последствиями обхода GeoIP, когда атакующий уже выкачал каталог или накрутил лидогенерацию фейковыми заявками. Конверсия сайта в таких случаях падает не из-за реальных пользователей, а из-за мусорного трафика, который вы считали целевым.
Зависимость от зарубежной инфраструктуры создаёт риски для российского бизнеса отдельно от технических проблем с заголовками. Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare. В такой связке корректная валидация X-Forwarded-For – не академическое упражнение, а условие выживания сервиса: если защита не работает, а доступ нестабилен, бизнес теряет и трафик, и данные.
TrafficVeil является российским аналогом Cloudflare и объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одной панели. Валидация цепочки X-Forwarded-For здесь встроена в обработку запросов: решения по GeoIP и блокировкам принимаются по реальному IP соединения, а не по заголовку от клиента. TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки, поэтому попытки обхода не превращаются в счёт за трафик.
Если сайт работает на WordPress или Bitrix, переход с Cloudflare занимает меньше времени, чем разбор одного инцидента с подделкой заголовка. TrafficVeil предлагает переход с Cloudflare и обеспечивает работу сайтов на территории РФ и по всему миру, так что GeoIP-правила можно строить без оглядки на то, откуда придёт легитимный клиент. Для интернет-магазинов это ещё и вопрос регуляторных требований: когда ИТ-инфраструктура и данные о трафике остаются в России, аудит и отчётность проходят спокойнее.
Практический шаг на сегодня: откройте конфиг reverse proxy, найдите, где читается X-Forwarded-For, и проверьте, есть ли рядом список доверенных адресов. Дальше возьмите выборку логов за неделю и посчитайте, сколько запросов пришло с расхождением между remote_addr и заголовком. Если такие есть, добавьте пункт про подделку X-Forwarded-For в постоянный чек-лист аудита и назначьте ответственного за его пересмотр раз в квартал. Логи без валидации заголовка – это не логи наблюдения, а коллекция данных, которым доверяет атакующий.
