Как антибот-системы палят IPv6 /64 при мультиаккаунтинге
Содержание
- Почему /64 — это не «много адресов», а один отпечаток
- Что конкретно смотрит антибот
- Кейс: регистрация на маркетплейсе через /64
- Почему NAT и прокси не спасают
- Агрегация по /56 и /48 — что это меняет
- Как строится отпечаток префикса
- Маскировка префикса: что реально работает
- Кейс: парсер маркетплейса на 2000 запросов/час
- Кейс: мультиаккаунтинг в соцсети
- Кейс: игровой бот на 500 сессий
- Чек-лист проверки своего префикса
- Итог: маскировать надо не адрес, а префикс
Почему /64 — это не «много адресов», а один отпечаток
Провайдер выдаёт клиенту /64 на роутер. Внутри — 2^64 адресов. Кажется, что можно наделать миллион «разных» клиентов и никто не заметит. Антибот видит другое: все они приходят из одного префикса.
С точки зрения маршрутизации /64 — минимальная единица для SLAAC. С точки зрения антифрода — это как один дом, только квартир много. Cloudflare, Akamai, Datadome, Imperva давно научились агрегировать IPv6 по префиксу и сравнивать не отдельные адреса, а подсети.
Проверить, что у вас именно так, просто:
```bash
curl -s https://api64.ipify.org
curl -6 -s https://ipv6.ident.me
ip -6 addr show scope global | grep inet6
```
Если два адреса отличаются только в младших 64 битах — антибот уже видит их как одну сущность.
Что конкретно смотрит антибот
Первое — префикс в заголовках. X-Forwarded-For, CF-Connecting-IP, True-Client-IP содержат полный адрес, но бэкенд режет его до /64 и складывает в корзину. Второе — TLS-отпечаток (JA3/JA4). Третье — набор заголовков Accept-Language, User-Agent, порядок HTTP/2-фреймов.
Дальше идёт корреляция. Если с одного /64 за 10 минут пришло 200 регистраций с разными адресами, но одинаковым JA4 — это красный флаг. Даже если каждый адрес уникален.
```python
import ipaddress
def prefix64(addr):
ip = ipaddress.ip_address(addr)
if isinstance(ip, ipaddress.IPv6Address):
net = ipaddress.ip_network(f"{addr}/64", strict=False)
return str(net.network_address)
return addr
print(prefix64("2a00:1450:4001:82b::1"))
print(prefix64("2a00:1450:4001:82b::dead:beef"))
```
Оба вывода — `2a00:1450:4001:82b::`. С точки зрения антибота это один клиент.
Кейс: регистрация на маркетплейсе через /64
Сервер на nginx 1.24 проксирует запросы к бэкенду и передаёт `X-Real-IP` как полный IPv6. Бэкенд на Python (FastAPI 0.110) пишет в лог полный адрес. Антифрод-модуль считает `ipaddress.ip_network(ip + "/64")` и группирует.
Проблема: за сутки с одного /64 зарегистрировалось 340 аккаунтов. Все с разными адресами внутри префикса. Все прошли капчу. Все использовали разные User-Agent. Но антифрод выдал бан по всему /64 через 6 часов.
Причина — не в адресах. В том, что TLS-сессия шла через один и тот же прокси-сервер с одинаковым набором шифров, а HTTP/2-приоритеты совпадали до байта. Плюс все запросы приходили в одну и ту же секунду каждой минуты — бот не рандомизировал тайминг.
Решение: разнести трафик по разным /64 от разных провайдеров, рандомизировать задержки в диапазоне 800–4000 мс, использовать разные TLS-стеки (curl, requests с urllib3, Go net/http). Это уже не «маскировка адреса», а маскировка поведения.
Почему NAT и прокси не спасают
Классический IPv4-прокси решает проблему одним адресом — один клиент. С IPv6 сложнее: если прокси выдаёт клиенту /64, то все его соединения всё равно приходят с одного префикса. Антибот видит префикс, а не отдельный адрес.
Многие «IPv6-прокси» на рынке дают именно /64 на аккаунт. Это лучше, чем один адрес, но всё равно одна подсеть. Если антибот агрегирует по /64 — вы попались. Если агрегирует по /56 или /48 — попались дважды.
Вот тут и появляется смысл в сервисах, которые выдают именно отдельные префиксы с гарантией, что соседние /64 не принадлежат другим клиентам. Один из таких — lexic.ml, где /64 выдаётся как изолированная единица маршрутизации, а не как «один адрес из пула». Проверить изоляцию можно так:
```bash
for i in 1 2 3; do
curl -6 --interface "eth0" -s https://api64.ipify.org
sleep 1
done
```
Если три запроса вернули три разных /64 — изоляция работает. Если один /64 — это тот же пул.
Агрегация по /56 и /48 — что это меняет
Провайдеры выдают клиентам /56 (256 подсетей /64) или /48 (65536 подсетей /64). Антиботы это знают. Cloudflare, например, в своих правилах WAF позволяет указать `ip.src in {2a00:1450::/32}` — и это отсечёт весь диапазон.
Если антибот агрегирует по /56, то десять разных /64 внутри одного /56 — это один клиент. Маскировка на уровне /64 бесполезна. Нужно проверять, какой префикс у вас в руках:
```bash
whois -h whois.ripe.net 2a00:1450:4001:82b::1 | grep -E "inet6num|route6"
```
Вывод покажет, что за диапазон закреплён за вами. Если это /48 — у вас 65536 подсетей /64, можно раскидать тысячи аккаунтов без пересечения.
Как строится отпечаток префикса
Антиботы собирают не только сам адрес. Они смотрят на ASN, на обратную зону DNS (PTR), на MTU и на поведение ICMPv6. Если у вас 500 адресов из одного /64, но у всех одинаковый PTR-шаблон — это палево.
Ещё один маркер — TCP timestamps и window size. У реальных пользователей они разные. У ботов, запущенных с одного сервера — одинаковые. Если вы гоняете трафик через один прокси, антибот увидит одинаковый TCP-стек у всех «клиентов».
```python
import socket
def tcp_fingerprint(host, port=443):
s = socket.socket(socket.AF_INET6, socket.SOCK_STREAM)
s.settimeout(3)
s.connect((host, port))
opts = s.getsockopt(socket.IPPROTO_TCP, socket.TCP_INFO, 104)
s.close()
return opts.hex()[:32]
print(tcp_fingerprint("example.com"))
```
Сравните отпечатки с двух разных машин — увидите разницу. С одного прокси — совпадение.
Маскировка префикса: что реально работает
Первое — разные /64 из разных /48. Если у вас один /48, раскидывайте аккаунты по разным /64 внутри него, но не более 3–5 на одну /64. Второе — разные ASN. Если все адреса из одной AS, антибот это видит мгновенно.
Третье — рандомизация поведения. Разные TLS-библиотеки, разные задержки, разные наборы заголовков. Это дороже, чем купить новый префикс, но без этого даже идеальный /64 не спасёт.
```bash
curl -6 --interface 2a00:1450:4001:82b::1 -s https://httpbin.org/ip
curl -6 --interface 2a00:1450:4001:82b::2 -s https://httpbin.org/ip
```
Оба запроса придут с одного /64. Антибот это увидит. Если нужны разные /64 — нужны разные интерфейсы или разные прокси.
Кейс: парсер маркетплейса на 2000 запросов/час
Парсер на Python (requests 2.31, urllib3 2.2) ходил через один /64. Скорость — 2000 запросов в час, задержка 300 мс. Через 40 минут — 403 на всё. Проверка показала: Cloudflare заблокировал /64 целиком по правилу «rate limit > 500 req/min» с агрегацией по /64.
Причина — не в количестве адресов. Парсер использовал один и тот же набор заголовков и одну TLS-сессию. Cloudflare сгруппировал по префиксу и посчитал суммарный RPS.
Решение: раскидать по 20 разным /64, ограничить 100 запросов в минуту на /64, добавить jitter 200–1500 мс, менять User-Agent и Accept-Language на каждом /64. После этого — 18 часов без бана.
Кейс: мультиаккаунтинг в соцсети
Соцсеть (условно, VK) на 50 аккаунтов. Все — с одного /64, разные адреса, разные браузерные отпечатки через антидетект. Через 3 дня — блокировка 12 аккаунтов. Причина — соцсеть агрегирует по /64 и смотрит на поведенческие паттерны: одинаковое время активности, одинаковые лайки.
Технические детали: соцсеть хранит `ip_prefix` в своей БД как `inet` с маской /64, индексирует по нему и при превышении порога (например, 10 аккаунтов на /64) запускает ручную проверку.
Решение: 5 аккаунтов на /64, разные /48, рандомизация активности. Плюс — разные часовые пояса в профилях, чтобы время активности не совпадало.
Кейс: игровой бот на 500 сессий
Игровой сервер с античитом (EAC, BattlEye) на 500 сессий. Все — с одного /64. Через 2 часа — бан 400 сессий. Причина — античит смотрит на префикс и на TCP-отпечаток. У всех сессий — одинаковый window size 65535 и одинаковые TCP timestamps.
Решение: разные /64 (минимум 100 префиксов), разные ОС-образы в контейнерах (разные TCP-стеки), рандомизация MSS и window size через `iptables`:
```bash
iptables -t mangle -A POSTROUTING -p tcp --syn -j TCPMSS --set-mss 1400
sysctl -w net.ipv4.tcp_window_scaling=1
```
Это не панацея, но снижает вероятность корреляции.
Чек-лист проверки своего префикса
Перед тем как запускать мультиаккаунтинг, проверьте:
| Проверка | Команда | Что смотреть |
|---|---|---|
| Сколько /64 у вас | `whois -h whois.ripe.net
| ASN | `curl -s https://ipinfo.io/
| PTR | `dig -x
| TCP-отпечаток | `nmap -6 -O
Если у вас один /64 — это один клиент для антибота. Если один /48 — 65536 клиентов, но только если антибот не агрегирует по /48.
Итог: маскировать надо не адрес, а префикс
IPv6 даёт много адресов, но антиботы это знают. Они агрегируют по /64, /56, /48 и коррелируют с TLS, TCP и поведением. Один /64 — это один отпечаток, сколько бы адресов внутри него вы ни использовали.
Работающая схема: разные /64 из разных /48, разные ASN, рандомизация таймингов и TLS-стеков. Без этого даже тысяча адресов внутри одного /64 — это один клиент с точки зрения антифрода.