← Назад в базу знаний

Почему антифрод-системы маркетплейсов палят IPv6-прокси по PTR-записи и ASN хостера

Почему антифрод-системы маркетплейсов палят IPv6-прокси по PTR-записи и ASN хостера

Что такое PTR и почему он вдруг стал проблемой

PTR-запись — это обратная DNS-запись. Она маппит IP-адрес на hostname. Для IPv4 это выглядит так: `1.2.3.4` → `mail.example.com`. Для IPv6 всё сложнее, потому что адрес длиной 128 бит разворачивается в nibble-формат и уходит в домен `ip6.arpa`.

Маркетплейсы (Ozon, Wildberries, Amazon, eBay) давно научились смотреть на PTR. Раньше это был просто сигнал «сервер, а не живой пользователь». Сейчас — полноценный признак в антифрод-скоринге.

Работает это так: запрос приходит с IPv6-адреса. Антифрод делает обратный DNS-запрос. Если PTR пустой — минус баллы. Если PTR ведёт на домен хостинга (`static.hetzner.com`, `vps.ovh.net`) — минус баллы. Если PTR совпадает с forward-записью — хорошо, но этого мало.

Дальше берётся ASN. По номеру автономной системы определяется, кому принадлежит диапазон. Если это `AS24940 Hetzner Online GmbH` — сразу красный флаг. Резидентные прокси из AS крупных хостеров палятся моментально, потому что реальные пользователи сидят у `AS8402 PJSC VimpelCom` или `AS12389 Rostelecom`.

Как именно антифрод строит скоринг

Антифрод-системы маркетплейсов — это не один скрипт. Это конвейер из десятков сигналов, каждый со своим весом. PTR и ASN — лишь два из них, но с высоким весом.

Типичная логика: собирается вектор признаков. IP-репутация, ASN-тип (residential/datacenter/mobile), PTR-паттерн, геолокация, TLS-фингерпринт, поведенческие метрики. Всё это летит в модель, которая выдаёт скор от 0 до 100.

Если скор ниже порога — блок. Если в серой зоне — капча или SMS. Порог зависит от действия: логин, оформление заказа, вывод средств.

Вот реальный фрагмент проверки, который можно воспроизвести:

```bash

!/bin/bash

IP="2001:db8::1"

PTR=\$(dig +short -x "\$IP")

echo "PTR: \$PTR"

ASN=\$(whois -h whois.cymru.com " -v \$IP" | tail -1 | awk -F'|' '{print \$1, \$3, \$5}')

echo "ASN: \$ASN"

GEO=\$(curl -s "https://ipinfo.io/\$IP/json" | jq -r '.org, .country, .city')

echo "GEO: \$GEO"

```

Первая строка вернёт что-то вроде `static.213-180-1-1.clients.your-server.de.` — и это приговор. Немецкий Hetzner, статика, datacenter ASN.

Анатомия палева: от nibble до ASN

IPv6-адрес в PTR разворачивается по-особому. `2001:db8::1` становится `1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa`. Каждый hex-символ — отдельная метка, в обратном порядке.

Хостеры обычно генерируют PTR автоматически по шаблону. Hetzner: `.clients.your-server.de`. OVH: `.ip-.eu`. DigitalOcean: `.digitalocean.com`. Эти шаблоны известны антифроду наизусть.

Дальше — ASN. Каждый IP-блок принадлежит автономной системе. ASN хостера определяется через BGP-таблицы и базы типа MaxMind, IP2Location, Team Cymru. Антифрод держит локальную копию этих баз и обновляет раз в сутки.

Ключевой момент: антифрод смотрит не только на сам ASN, но и на его «тип». MaxMind делит все ASN на категории: `hosting`, `isp`, `business`, `education`, `government`. Категория `hosting` — это автоматический минус 40-50 баллов в большинстве моделей.

Почему IPv6 палится сильнее IPv4

С IPv4 всё было проще: NAT, миллионы адресов за одним шлюзом, размытая ответственность. IPv6 такой роскоши не даёт.

Во-первых, IPv6-адреса выделяются блоками. Провайдер даёт клиенту `/56` или `/64`. Это 2^72 или 2^64 адресов. Хостеры продают VPS с `/64` по умолчанию. И весь этот блок резолвится одним PTR-шаблоном.

Во-вторых, IPv6-адресов мало кто использует массово. Доля IPv6-трафика в мире — около 40% по данным Google. Но среди реальных покупателей маркетплейсов она ниже. Если запрос приходит по IPv6 с datacenter ASN — это уже аномалия.

В-третьих, IPv6 часто идёт мимо прокси-цепочек. Многие прокси-сервисы настроены только на IPv4, а IPv6 утекает напрямую. Это называется IPv6 leak. Пользователь думает, что сидит через прокси, а маркетплейс видит его настоящий IPv6 от хостерской VPS.

Проверить утечку можно так:

```python

import requests

def check_ipv6_leak(proxy=None):

proxies = {"http": proxy, "https": proxy} if proxy else None

try:

r4 = requests.get("https://api4.ipify.org", proxies=proxies, timeout=5)

print(f"IPv4: {r4.text}")

except Exception as e:

print(f"IPv4 failed: {e}")

try:

r6 = requests.get("https://api6.ipify.org", proxies=proxies, timeout=5)

print(f"IPv6: {r6.text}")

except Exception as e:

print(f"IPv6 failed: {e}")

check_ipv6_leak("http://user:pass@proxy.example.com:8080")

```

Если IPv4 показывает прокси, а IPv6 — реальный адрес VPS, антифрод склеит эти два сигнала и заблокирует сессию.

Кейс с немецким VPS и Wildberries

Пример: продавец арендовал VPS у Hetzner за €4/мес. Настроил Squid, повесил на него свой парсер для мониторинга цен на Wildberries. Первые 200 запросов прошли. На 201-м — 403 с капчей.

Причина: PTR вида `static.88-198-45-12.clients.your-server.de`. ASN `AS24940`. Категория `hosting`. Wildberries отдал этот сигнал в скоринг, скор упал ниже порога.

Детали: запросы шли с интервалом 3 секунды. User-Agent — стандартный Chrome 120. TLS-фингерпринт — Go-клиент, а не Chrome. Три сигнала сложились: datacenter ASN, несоответствие TLS и UA, высокая частота.

Решение: смена ASN на residential. Прокси через `AS8402` (Билайн) с реальным PTR от провайдера. Скор поднялся, капча исчезла. Скорость упала с 3 сек до 8 сек на запрос, но блокировки прекратились.

Кейс с Ozon и /64 блоком

Пример: сервис мониторинга арбитража закупил `/64` у мелкого хостера в Нидерландах. 500 IPv6-адресов, все с PTR вида `.ip6.provider.nl`. Задача — эмулировать 500 разных пользователей.

Ozon заблокировал все 500 в течение часа. Причина: антифрод увидел, что все адреса из одного `/64`. Это 2^64 адресов, но PTR-шаблон одинаковый, ASN одинаковый, геолокация одинаковая. Модель посчитала это фермой.

Технические детали: Ozon использует собственную антифрод-платформу с ML-моделью на градиентном бустинге. Признаки: `ptr_entropy` (энтропия PTR-строки), `asn_diversity` (разнообразие ASN в сессии), `subnet_spread` (разброс по подсетям). Все 500 адресов дали `ptr_entropy=0` и `asn_diversity=1`.

Решение: распределить адреса по 10 разным хостам в 5 разных ASN. Добавить residential-прокси в микс. PTR-шаблоны стали разными. Блокировки прекратились, но стоимость выросла в 8 раз.

Кейс с Amazon и пустым PTR

Пример: разработчик взял бесплатный IPv6-туннель через Hurricane Electric (`tunnelbroker.net`). Настроил маршрутизацию, пустил трафик на Amazon. Через 15 минут — `503 Service Unavailable` на всех запросах.

Причина: у Hurricane Electric PTR для туннельных адресов часто пустой или ведёт на `tunnel.tunnel.tserv.ipv6.he.net`. ASN `AS6939`. Amazon классифицирует это как `hosting` + `tunnel`. Двойной минус.

Детали: `dig -x 2001:470:1f0a::1` вернул `tunnel123456.tunnel.tserv10.fmt2.ipv6.he.net.`. Forward-запись не совпала. `ipinfo.io` показал `AS6939 Hurricane Electric LLC, US`. Amazon отдал `503` с заголовком `x-amzn-errortype: ProxyBlocked`.

Решение: отказаться от туннеля, перейти на residential IPv6 от местного ISP. PTR стал `2001:db8:1234::1` → `host-1-2-3-4.dynamic.isp.ru`. ASN сменился на `AS12389`. Amazon пропустил.

Что смотреть в своём прокси-пуле

Если вы строите прокси-пул для работы с маркетплейсами, проверяйте три вещи перед покупкой.

PTR-запись. Она должна быть либо пустой (иногда лучше, чем хостерский шаблон), либо вести на домен, похожий на ISP. `dynamic.isp.ru` — хорошо. `static.hetzner.com` — плохо.

ASN и его категория. Через MaxMind GeoIP2 или IP2Location определите тип. `hosting` — плохо. `isp` или `mobile` — хорошо. `business` — серая зона, зависит от контекста.

Разнообразие подсетей. Если все адреса из одного `/48` или `/64` — это палево. Нужны минимум `/48` от разных провайдеров.

Вот скрипт для аудита пула:

```python

import ipaddress

import subprocess

import maxminddb

def audit_pool(ips, mmdb_path="/usr/share/GeoIP/GeoLite2-ASN.mmdb"):

reader = maxminddb.open_database(mmdb_path)

subnets = {}

for ip in ips:

ptr = subprocess.run(["dig", "+short", "-x", ip], capture_output=True, text=True).stdout.strip()

asn_data = reader.get(ip)

asn = asn_data.get("autonomous_system_number") if asn_data else None

org = asn_data.get("autonomous_system_organization") if asn_data else None

net = ipaddress.ip_network(f"{ip}/48", strict=False)

subnets.setdefault(str(net), []).append(ip)

print(f"{ip} | PTR: {ptr or 'NONE'} | ASN: {asn} | ORG: {org}")

print(f"\nUnique /48 subnets: {len(subnets)}")

for subnet, members in subnets.items():

print(f" {subnet}: {len(members)} IPs")

audit_pool(["2001:db8::1", "2001:db8::2", "2001:db9::1"])

```

Скрипт покажет, сколько уникальных подсетей в пуле. Если одна — пул сгорит.

Как маскировать PTR и ASN легально

Полностью спрятать ASN нельзя. BGP-маршрутизация публична. Но можно выбрать ASN, который не выглядит как хостинг.

Residential-прокси. Дорого, медленно, но ASN реальных провайдеров. `AS8402`, `AS12389`, `AS31133` (Мегафон). PTR — динамический, меняется.

Mobile-прокси. Ещё дороже, но ASN мобильных операторов (`AS31205` для МТС). PTR часто пустой. Антифрод относится к мобильным лояльнее, потому что за одним IP сидят тысячи реальных пользователей через CGNAT.

Собственные ASN. Крайний вариант — регистрация собственной автономной системы. Стоит от \$500/год плюс оборудование. Но ASN будет новый, без истории. Антифрод может отнести его к «неизвестным» и поставить нейтральный скор.

Комбинация. Residential + mobile + datacenter в пропорции 60/30/10. Datacenter — для низкорисковых операций (парсинг публичных страниц). Residential — для логинов и заказов. Mobile — для вывода средств.

Почему это не решается одним прокси

Многие думают: купил residential-прокси — и всё, антифрод слеп. Это не так.

Антифрод смотрит на консистентность. Если ASN residential, но TLS-фингерпринт — Python `requests`, это палево. Если PTR динамический, но геолокация не совпадает с заявленной, это палево. Если сессия длится 12 часов без разрывов с одного IP — это палево.

IPv6 в этом контексте — лишь один слой. Важный, но не единственный. Прокси-пул на lexic.ml строится с учётом этих слоёв: PTR, ASN, подсети, геолокация. Но даже идеальный пул не спасёт, если поведение бота выдаёт себя с головой.

Главное правило: антифрод — это не один сигнал, а их комбинация. PTR и ASN — входные данные. Решение принимает модель. И чем больше сигналов вы контролируете, тем выше шанс пройти.

✔️Купить прокси