LinkedIn через IPv6 прокси: автоматизация приглашений без триггера антифрода
Содержание
- Почему LinkedIn вообще смотрит на IP
- Чем IPv6 отличается от IPv4 в контексте прокси
- Как LinkedIn палит автоматизацию
- Ротация IPv6: как это устроено технически
- prefix like "2001:db8:1234:5678"
- Проблема "свежих" IPv6 адресов
- Тайминги и лимиты приглашений
- Практическая схема ротации
- !/bin/bash
- Кейс: 500 приглашений за неделю без бана
- Кейс: почему датацентровый IPv6 не работает
- Кейс: TLS-фингерпринт и IPv6
- Мониторинг и что смотреть
- Инфраструктура: где брать IPv6
- Итог
Почему LinkedIn вообще смотрит на IP
LinkedIn — это не просто соцсеть, а платформа с одной из самых агрессивных антифрод-систем среди всех крупных сервисов. Основа их детекта — поведенческий анализ плюс репутация сетевого адреса. IP-адрес тут не главный сигнал, но он один из немногих, который сложно подделать на уровне приложения.
Когда вы отправляете приглашение, сервер получает кучу метаданных: IP, ASN, геолокацию, TLS-фингерпринт, заголовки, тайминги запросов между действиями. LinkedIn складывает это в скоринг. Если аккаунт новый, а IP принадлежит датацентру — привет, капча или теневой бан.
IPv6 в этой схеме интересен тем, что даёт огромный пул адресов. Один /64 префикс — это 2^64 адресов. Провайдеры обычно выдают клиентам /56 или /48. Это меняет правила игры: можно ротировать IP без покупки новых подсетей.
Чем IPv6 отличается от IPv4 в контексте прокси
В IPv4 прокси-пул — это набор конкретных адресов. Каждый адрес имеет репутацию, историю, ASN. Хостер даёт вам /29 — восемь адресов, и вы их крутите. Когда адрес попадает в бан-листы, приходится покупать новый.
IPv6 даёт другую модель. Вы получаете префикс /64 и генерируете адреса по своему усмотрению. Хостеры часто выдают /48 — это 65 536 подсетей, каждая по 18 квинтиллионов адресов. Технически можно каждый запрос делать с нового IP.
Но есть нюанс. Многие сайты до сих пор плохо работают с IPv6. LinkedIn поддерживает IPv6 на уровне CDN, но детект-системы могут помечать "слишком новый" адрес как подозрительный. Адрес, который никогда не встречался в логах, выглядит необычно.
Как LinkedIn палит автоматизацию
Антифрод LinkedIn работает на нескольких уровнях. Первый — network layer. Проверяется ASN, репутация диапазона, наличие в спам-базах. Второй — device fingerprint. Canvas, WebGL, шрифты, разрешение экрана. Третий — поведенческий: скорость действий, паттерны кликов, время между приглашениями.
С IPv6 есть специфика. Если вы генерируете адреса из одного /64, LinkedIn может увидеть, что все запросы идут из одной подсети. Это не блокировка, но флаг. Особенно если адреса меняются слишком часто — например, каждые 5 секунд.
Нормальное поведение пользователя: один IP на сессию, меняется раз в сутки или при переподключении. Если IP меняется на каждом запросе, это палево.
Ротация IPv6: как это устроено технически
Прокси-сервер на IPv6 получает префикс. Клиент подключается к прокси, а прокси выбирает исходящий адрес из пула. В простейшем случае — round-robin по списку адресов.
Вот пример на Python, который генерирует адреса из /64 и делает запросы через SOCKS5:
```python
import random
import socket
import socks
def random_ipv6_from_prefix(prefix):
prefix like "2001:db8:1234:5678"
suffix = ":".join(f"{random.randint(0, 0xffff):x}" for _ in range(4))
return f"{prefix}:{suffix}"
def request_via_proxy(url, proxy_host, proxy_port, prefix):
ip = random_ipv6_from_prefix(prefix)
s = socks.socksocket()
s.set_proxy(socks.SOCKS5, proxy_host, proxy_port)
s.bind((ip, 0))
s.connect(("www.linkedin.com", 443))
s.send(b"GET / HTTP/1.1\r\nHost: www.linkedin.com\r\n\r\n")
return s.recv(4096)
```
Ключевой момент — `bind`. SOCKS5 позволяет указать исходящий адрес. Прокси-сервер должен поддерживать это. Не все реализации умеют.
На стороне сервера (например, 3proxy или Dante) настраивается пул. В 3proxy это делается через `external` директиву:
```
external 2001:db8:1234:5678::1
external 2001:db8:1234:5678::2
external 2001:db8:1234:5678::3
```
Но вручную прописывать тысячи адресов — бред. Нужен скрипт или динамическая генерация.
Проблема "свежих" IPv6 адресов
IPv6-адрес, который никогда не использовался, выглядит для антифрода странно. В IPv4 все адреса давно распределены, у каждого есть история. В IPv6 огромное пространство, и большинство адресов просто не встречается в трафике.
LinkedIn (и другие сервисы) могут проверять: был ли этот адрес замечен в легитимном трафике? Если нет — флаг. Это не бан, но дополнительная проверка.
Решение — прогревать адреса. Использовать их для обычного браузинга, лайков, просмотров. Не для массовых действий. Через несколько дней адрес набирает "историю".
Тайминги и лимиты приглашений
LinkedIn не публикует точные лимиты, но эмпирически: 100-150 приглашений в неделю для обычного аккаунта. Для новых — 20-50. Превышение ведёт к ограничению.
Если вы делаете 50 приглашений за час с одного IP — это триггер. Даже если IP чистый. Нормальный человек не отправляет 50 приглашений за час. Он делает это в течение дня, с паузами.
С IPv6-ротацией возникает соблазн: менять IP на каждом приглашении. Это хуже, чем один стабильный IP. Потому что паттерн "новый IP на каждое действие" — явный признак бота.
Правильная стратегия: один IP на сессию. Сессия — 2-4 часа. Внутри сессии — 10-20 действий с рандомными паузами 30-180 секунд.
Практическая схема ротации
Вот рабочий подход. Есть пул /64 префиксов. Каждый префикс — отдельная "личность". Внутри префикса выбирается один адрес на сессию.
```bash
!/bin/bash
PREFIXES=(
"2001:db8:1::"
"2001:db8:2::"
"2001:db8:3::"
)
for p in "\${PREFIXES[@]}"; do
ip="\${p}\$(printf '%x' \$((RANDOM % 65536)))"
echo "Using \$ip"
curl -6 --interface "\$ip" -s -o /dev/null -w "%{http_code}\n" https://www.linkedin.com
sleep \$((RANDOM % 120 + 60))
done
```
Здесь `--interface` заставляет curl использовать конкретный IPv6-адрес. Это работает, если адрес уже назначен на интерфейс. Если нет — нужно добавлять через `ip -6 addr add`.
Кейс: 500 приглашений за неделю без бана
Пример: аккаунт LinkedIn, возраст 8 месяцев, 1200 контактов. Задача — отправить 500 приглашений за 7 дней.
Настройка: 10 /64 префиксов от хостера в Нидерландах. ASN — не датацентровый, а residential-провайдер. Это важно. Датацентровые ASN у LinkedIn в чёрном списке.
Каждый префикс использовался 2-3 дня. Внутри дня — 3-4 сессии по 2 часа. За сессию — 15-20 приглашений. Паузы рандомные, 45-240 секунд. Между сессиями — минимум 4 часа.
Результат: 500 приглашений, 0 капч, 0 блокировок. Acceptance rate — 22%. Это нормально для B2B.
Что было бы при использовании одного IP: скорее всего, бан на 3-й день. Или теневой бан — приглашения уходят, но не доставляются.
Кейс: почему датацентровый IPv6 не работает
Другой пример. Тот же аккаунт, но прокси на Hetzner. IPv6 /64, ротация каждые 30 минут.
Первый день: 40 приглашений, всё ок. Второй день: 30 приглашений, две капчи. Третий день: аккаунт ограничен, требуется верификация по документу.
Причина: Hetzner — датацентр. ASN 24940. LinkedIn знает, что с этого ASN идёт много автоматизации. Даже чистый IPv6-адрес из этого диапазона получает минус к репутации.
Вывод: ASN важнее, чем сам адрес. Residential IPv6 или small ISP — то, что нужно. Датацентры — нет.
Кейс: TLS-фингерпринт и IPv6
Третий пример. Всё настроено правильно: residential IPv6, ротация по сессиям, паузы. Но LinkedIn всё равно палит.
Причина оказалась в TLS. Python `requests` использует OpenSSL с определённым набором шифров. Этот набор отличается от того, что использует Chrome. LinkedIn (через Cloudflare) проверяет JA3-фингерпринт.
Решение: использовать `curl_cffi` или аналоги, которые имитируют TLS Chrome. После замены библиотеки — проблема ушла.
```python
from curl_cffi import requests
r = requests.get(
"https://www.linkedin.com/feed/",
impersonate="chrome120",
proxies={"https": "socks5://[2001:db8::1]:1080"}
)
```
Здесь `impersonate` подменяет TLS-фингерпринт. Прокси указывается с IPv6 в квадратных скобках.
Мониторинг и что смотреть
Без мониторинга вы не узнаете, что аккаунт в теневом бане. Приглашения уходят, но не доставляются. Или доставляются, но не показываются в поиске.
Что проверять:
- HTTP-коды ответов. 429 — rate limit. 403 — блок.
- Наличие капчи в ответе. Ищите `captcha` в HTML.
- Скорость ответа. Если сервер отвечает за 200 мс вместо 800 — возможно, вы уже на другом endpoint (заглушка).
- Acceptance rate. Если резко упал — аккаунт под фильтром.
Логировать всё. IP, время, действие, ответ. Потом анализировать.
Инфраструктура: где брать IPv6
Не каждый хостер даёт IPv6. И ещё меньше — residential IPv6. Варианты:
| Провайдер | Тип | IPv6 | ASN тип |
|-----------|-----|------|---------|
| Hetzner | VPS | /64 | Датацентр |
| OVH | VPS | /64 | Датацентр |
| Vultr | VPS | /64 | Датацентр |
| Residential proxies | Пул | /128 | Residential |
| Small ISP | VPS | /48 | ISP |
Датацентровые IPv6 дешёвые, но палевные. Residential — дорого, но работает. Компромисс — small ISP, которые не помечены как датацентр.
На практике для LinkedIn лучше residential. Датацентр — только если аккаунт старый и прогретый.
Итог
IPv6 даёт гибкость, которой нет в IPv4. Но гибкость — не панацея. LinkedIn смотрит на ASN, TLS, поведение, тайминги. IP — только один из факторов.
Схема, которая работает: residential IPv6, ротация по сессиям, паузы, имитация TLS браузера, мониторинг. Без любого из этих элементов — бан рано или поздно.
И да, не забывайте: LinkedIn обновляет детект постоянно. То, что работало полгода назад, сегодня может не работать. Тестируйте на мелких аккаунтах, прежде чем гнать объём.