iplogs.com

Как блокировать VPN, прокси и Tor-трафик

Рабочие правила для Cloudflare WAF, Nginx, Caddy и Stripe Radar. Плюс плейбук по ложным срабатываниям. Большая часть VPN-трафика это легитимные пользователи, поэтому грубая блокировка оборачивается потерей клиентов. Используйте эти паттерны там, где трение реально окупается.

Решение: где блокировать, где усиливать

  • Блокировать: создание аккаунтов, отправка KYC, вывод средств (withdrawal, refund), админские и служебные маршруты.
  • Усилить аутентификацию: логин, сброс пароля, оплата, изменение подписки, массовые операции.
  • Разрешать: чтение контента, RSS, публичная документация. Жёсткая блокировка этих маршрутов теряет больше денег, чем предотвращает.

Выражение Cloudflare WAF

Встроенные cf.threat_score и ip.src.is_in_european_union сами по себе ловят слишком мало. Добавьте внешний lookup через Cloudflare Worker (см. руководство по внедрению), затем применяйте правило WAF:

# Блокировать VPN/прокси на регистрации и оплате
(http.request.uri.path matches "^/(signup|checkout|api/payment)" and
 cf.threat_score gt 14 or
 ip.src.is_in_european_union eq false and any(http.request.headers["x-iplogs-verdict"][*] in {"vpn_detected" "vpn_likely"}))

Заголовок x-iplogs-verdict ставится из Worker, который вызывает POST /v1/check для IP посетителя.

Nginx: блок по списку ASN

Для статической блокировки по ASN скачайте CSV от IPLogs в /data/datacenter-asns.csv и сконвертируйте в geo-блок Nginx:

# Сгенерируйте /etc/nginx/conf.d/vpn-block.conf из списка ASN от IPLogs
geo $is_vpn_asn {
    default 0;
    # Добавьте CIDR-диапазоны для AS9009 (M247), AS62240 (Clouvider) и т.д.
    # Источник: https://iplogs.com/data/datacenter-asns.csv
    23.234.0.0/16 1;
    185.65.0.0/16 1;
    # ...
}

server {
    location ~ ^/(signup|checkout) {
        if ($is_vpn_asn) {
            return 403 "VPN traffic blocked on this route";
        }
        proxy_pass http://app;
    }
}

Caddy: блок по заголовку через reverse-proxy

# Сниппет Caddyfile. Вердикт ставится из плагина Caddy,
# либо из middleware вашего приложения до reverse-proxy.
example.com {
    @vpn_block {
        path /signup* /checkout*
        header X-IPLogs-Verdict vpn_detected vpn_likely
    }
    respond @vpn_block 403 "VPN traffic blocked on this route"

    reverse_proxy localhost:3000
}

Stripe Radar: рецепт правила

Stripe Radar 2.0 уже по умолчанию помечает VPN/прокси как повышенный риск. Чтобы применять более жёсткие правила, передайте вердикт IPLogs в Customer.metadata при создании payment intent:

// При создании payment intent
const verdict = (await checkVpn(customerIp)).verdict;
await stripe.paymentIntents.create({
  amount, currency,
  customer: customerId,
  metadata: { iplogs_verdict: verdict },
});

// Правило в Stripe Radar (UI):
// Block if :metadata:iplogs_verdict: == "vpn_detected"
// Review if :metadata:iplogs_verdict: == "vpn_likely"
// 3DS if :metadata:iplogs_verdict: == "suspicious" and :amount: > 5000

Плейбук по ложным срабатываниям

Перед тем как блокировать, продумайте обработку ложных срабатываний. Большинство жалоб на FP приходит от этих категорий:

  • CGNAT и мобильные операторы разделяют пулы IP между тысячами абонентов, и эти диапазоны нередко пересекаются с коммерческими VPN-выходами. Лучше усиливать аутентификацию, а не блокировать.
  • Cloudflare WARP и iCloud Private Relay включены у миллионов пользователей по умолчанию. Выделите их в отдельный класс private_relay и применяйте к ним заметно меньшее трение.
  • Корпоративные прокси: крупные клиенты направляют весь трафик через единый egress, который выглядит как датацентровый выход.
  • Путешествующие сотрудники: бизнес-пользователи рутинно поднимают рабочий VPN из командировок, и именно это самые ценные клиенты, которых легче всего ошибочно заблокировать.

Всегда оставляйте путь оспаривания. Сообщение «обнаружен VPN, попробуйте другую сеть» со ссылкой на форму контакта возвращает часть выручки, потерянной из-за ложных срабатываний.

FAQ

Какой лучший способ блокировать VPN-трафик на сайте?

Блокируйте на edge (Cloudflare WAF, Nginx, Caddy) только на высокорисковых маршрутах — регистрация, KYC, выводы, админка — а не на всём трафике. На чтении блокировка почти никогда не оправдана. Стандартный паттерн: установить заголовок-вердикт на edge и ссылаться на него в WAF-правилах.

Полностью блокировать VPN-пользователей или достаточно отметить?

Отмечайте везде, жёстко блокируйте только на действиях высокого риска. Большая часть VPN-трафика — это легитимные пользователи (приватность, недоверенный Wi-Fi, гео-контент). Блокируйте записи (регистрация, оплата, смена пароля), на остальном — step-up auth. Жёсткая блокировка чтения карает лояльных пользователей за паттерн атакующего.

Как блокировать VPN на Cloudflare?

Запустите Cloudflare Worker, который вызывает API IPLogs, записывает вердикт в заголовок X-IPLogs-Verdict, и добавьте WAF-правило: когда заголовок равен vpn_detected или vpn_likely на защищённых путях, возвращайте 403 или challenge. Полный шаблон правила в разделе Cloudflare WAF выше.

Как блокировать VPN-трафик в Nginx или Caddy?

Используйте geo-блок по ASN: ведите список ASN/IP известных VPN-выходов и отклоняйте соответствующие адреса на защищённых location. Для динамических per-IP решений вызывайте API IPLogs из reverse-proxy и ориентируйтесь на возвращённый вердикт. Примеры для обоих серверов выше.

Какой HTTP-статус возвращать при блокировке VPN-трафика?

Используйте 403 Forbidden с короткой страницей, которая объясняет, что соединение выглядит анонимизированным, и предлагает путь оспаривания. Избегайте 429 (rate-limit) и 503 (ошибка сервера) — оба путают retry-логику и ботов, а 403 — единственный семантически корректный код для отказа по политике.

Как избежать ложных срабатываний при блокировке VPN?

Относитесь к Apple Private Relay, Cloudflare WARP, мобильным CGNAT-сетям и корпоративным VPN как к отдельным категориям, не как к коммерческому VPN. Всегда предлагайте путь оспаривания и логируйте решение для аудита. API IPLogs возвращает их как отдельные сигналы, чтобы вы могли применять разные правила.

Сначала встраиваете обнаружение в код? Смотрите руководство по внедрению. Хотите понять, почему ваш собственный IP помечен как VPN? Прочтите разбор причин.