Почему антифрод-системы маркетплейсов палят IPv6-прокси по PTR-записи и ASN хостера
Содержание
- Что такое PTR и почему он вдруг стал проблемой
- Как именно антифрод строит скоринг
- !/bin/bash
- Анатомия палева: от nibble до ASN
- Почему IPv6 палится сильнее IPv4
- Кейс с немецким VPS и Wildberries
- Кейс с Ozon и /64 блоком
- Кейс с Amazon и пустым PTR
- Что смотреть в своём прокси-пуле
- Как маскировать 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: `
Дальше — 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 вида `
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
Детали: `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 — входные данные. Решение принимает модель. И чем больше сигналов вы контролируете, тем выше шанс пройти.