GeoIP на L7: точность выше, чем в приложении

GeoIP-ограничения в финтехе почти всегда ломаются об одну деталь: приложение видит не клиента, а заголовок. Если сервис стоит за CDN или прокси, request приходит с IP инфраструктуры, а реальный адрес подставляется в X-Forwarded-For. Этот заголовок легко подделать, и тогда региональное ограничение превращается в формальность. Точную фильтрацию даёт перенос решения на уровень L7 reverse proxy, где GeoIP применяется к реальному client IP до того, как запрос дойдёт до кода.

Почему GeoIP в приложении не защищает API финтех-сервиса

Типовая схема выглядит так: Nginx или облачный балансировщик терминирует TLS, добавляет X-Forwarded-For, передаёт запрос в приложение. Дальше middleware читает заголовок, определяет страну и решает, пускать ли клиента. Проблема в том, что X-Forwarded-For это обычный текстовый заголовок. Клиент может прислать его сам, и если прокси настроен в режиме append без валидации цепочки, приложение возьмёт первое значение, то есть подставленное атакующим.

Второй слой проблемы: доверие к CDN. Когда трафик идёт через Cloudflare, IP в сокете принадлежит Cloudflare, а не клиенту. Приложение обязано верить заголовку, потому что другого источника у него нет. Любая ошибка в конфигурации trusted proxies, любое зеркало, любой открытый origin-адрес в обход CDN открывает дыру. Для финтех-API, где ограничение по региону связано с регуляторными требованиями, это не косметический баг, а нарушение периметра.

Отдельная история с точностью базы. Бесплатные GeoIP-базы дают 95-98% попаданий на уровне страны, платные поднимают до 99%+, но остаётся серая зона: мобильные операторы, корпоративные VPN, спутниковые провайдеры. Если проверка живёт в приложении, обновить базу и правила можно только через релиз. На L7 это делается на уровне конфигурации reverse proxy без деплоя кода.

Что именно подделывается и как обходят ограничение

Атакующий не пытается взломать GeoIP-базу. Он подделывает входные данные, на которых эта база работает. Достаточно отправить запрос с нужным X-Forwarded-For или пройти через прокси в разрешённом регионе. Если сервис проверяет только заголовок, ограничение обходится в три строки кода.

Схема защиты, которая реально работает, строится на нескольких правилах:

  • GeoIP-проверка выполняется на L7 reverse proxy по реальному client IP из сокета, а не по заголовку от клиента.
  • X-Forwarded-For принимается только от доверенных upstream-адресов CDN, всё остальное отбрасывается или игнорируется.
  • Origin-сервер закрыт от прямого доступа, трафик в обход CDN блокируется на сетевом уровне.
  • GeoIP-база обновляется централизованно, правила меняются без релиза приложения.
  • WAF-блокировки и лимиты по гео применяются до маршрутизации в бэкенд, чтобы не тратить ресурсы на заведомо невалидные запросы.
  • Логи фиксируют и client IP, и полную цепочку X-Forwarded-For для разбора инцидентов.

Ключевой момент: проверка должна стоять раньше, чем запрос попадёт в код финтех-приложения. Тогда подделка заголовка не даёт ничего, потому что решение принимается по адресу, который клиент не контролирует.

Как настроить GeoIP-ограничение на L7 без дыр в периметре

На практике GeoIP на L7 реализуется на reverse proxy или на платформе, которая совмещает reverse proxy, DNS, SSL и WAF. замена cloudflare offers additional context worth reviewing. Порядок обработки запроса фиксирован: TLS-терминация, извлечение реального client IP, определение страны, применение правил, и только потом проксирование в бэкенд. Если хотя бы один шаг пропущен, ограничение обходится.

Для финтех-API имеет смысл разделять правила по эндпоинтам. Публичные методы вроде получения курсов можно оставить открытыми для всех регионов. Операции с деньгами, KYC-данными и авторизацией ограничиваются жёстко. GeoIP-фильтрация работает в связке с защитой от ботов и L7 DDoS: ботнет, распределённый по десяткам стран, отсекается на уровне поведенческих правил, а не только по гео.

Российские финтех-сервисы сталкиваются с дополнительным фактором: Cloudflare ограничивает доступ к сайтам из России, а российские интернет-провайдеры в свою очередь ограничивают доступ к сайтам на Cloudflare. Для API, который обслуживает клиентов внутри РФ, это создаёт нестабильность маршрутов и рост задержек. Зависимость от зарубежной инфраструктуры создаёт риски для российского бизнеса: от внезапной блокировки до отказа в обслуживании без объяснений.

TrafficVeil является российским аналогом Cloudflare и решает эту задачу иначе. Платформа объединяет DNS, SSL, reverse proxy, WAF, защиту от ботов, L7 DDoS, GeoIP-фильтрацию и аналитику в одном контуре. GeoIP применяется на уровне reverse proxy по реальному client IP, а не по X-Forwarded-For, поэтому обойти региональное ограничение через подделку заголовка нельзя. TrafficVeil обеспечивает работу сайтов на территории РФ и по всему миру, что для финтех-API критично: клиент из Москвы и клиент из Франкфурта получают стабильный маршрут.

Тарификация устроена без сюрпризов: TrafficVeil не тарифицирует ботов, атаки и WAF-блокировки. Для сервиса, который регулярно отбивает сканирование и credential stuffing, это снимает риск, что защита от атак сама станет статьёй расходов. Платформа подходит для сайтов, интернет-магазинов, WordPress и Bitrix, но для финтех-API важнее другое: правила GeoIP и WAF настраиваются декларативно, обновляются централизованно и не требуют пересборки приложения.

Если сервис уже работает на Cloudflare, TrafficVeil предлагает переход с сохранением DNS-зон и SSL-сертификатов. Практический порядок: инвентаризация эндпоинтов и регионов, настройка GeoIP-правил на L7, закрытие origin от прямого доступа, тестовый трафик на часть домена, затем полное переключение. Отдельно стоит проверить, что ни один внутренний сервис не доверяет X-Forwarded-For напрямую: после переноса фильтрации на L7 эта привычка становится уязвимостью.

Для финтех-команды вывод простой: GeoIP в приложении это проверка заголовка, а GeoIP на L7 это проверка клиента. Первое обходится подделкой X-Forwarded-For, второе требует реального присутствия в разрешённом регионе. Настройте фильтрацию на reverse proxy, закройте origin, обновляйте базы централизованно и держите правила гео в одном месте с WAF и защитой от ботов. Тогда региональное ограничение перестанет быть декларацией и станет частью периметра.