Как антифрод-системы вычисляют прокси по TCP/IP стеку и fingerprint браузера
Содержание
- Как антифрод видит прокси: TCP/IP стек и fingerprint
- MTU и TTL — первая линия обороны
- Идентификация прокси по заголовкам TCP
- HTTP-заголовки, которые выдают прокси
- Fingerprint браузера — цифровой отпечаток
- WebRTC — утечка реального IP
- DNS-запросы — следы прокси
- Поведенческий анализ
- Пример: как работает lexic.ml в этой войне
- Таблица: какие параметры выдают прокси
- Как защититься от детекции
- Что будет дальше
Как антифрод видит прокси: TCP/IP стек и fingerprint
Антифрод-системы эволюционировали. Раньше достаточно было сменить IP. Сейчас — война на уровне пакетов и отпечатков браузера.
Прокси и VPN — не анонимность. Это флаги, которые система считывает за миллисекунды.
Разберем, как именно.
MTU и TTL — первая линия обороны
Каждая ОС и сетевое оборудование оставляют следы. Самые простые — MTU и TTL.
**MTU** (Maximum Transmission Unit) — размер пакета. У Windows по умолчанию 1500 байт. У Linux — часто 1500, но может быть 1492 при PPPoE. У macOS — 1500.
Прокси-серверы часто форсируют MTU. Если ваш клиент шлет пакеты с MTU 1500, а прокси режет до 1400 — антифрод видит несоответствие. Это подозрительно.
**TTL** (Time To Live) — счетчик прыжков. Windows: 128. Linux: 64. macOS: 64. Роутеры: 255.
Пример: вы сидите в Москве, TTL=128. Прокси в Амстердаме. Ваш пакет проходит через 10 хопов, TTL падает до 118. Антифрод видит: "клиент за прокси — TTL не совпадает с ожидаемым для региона".
Простейший скрипт проверки:
```bash
ping -c 1 target.com | grep "ttl="
```
Но антифроды делают замеры на уровне ядра. Они знают, какой TTL должен быть у реального пользователя из этого региона.
Идентификация прокси по заголовкам TCP
TCP-стек — это fingerprint операционной системы. Каждая ОС инициализирует TCP-соединение по-своему.
**Window Scale** — размер окна. Linux: 7 (128 KiB). Windows: 8 (256 KiB). macOS: 6 (64 KiB).
**MSS** (Maximum Segment Size) — максимальный сегмент. Зависит от MTU. Если прокси форсирует MSS, это видно.
**SACK** (Selective Acknowledgment) — поддержка выборочных подтверждений. Почти все современные ОС поддерживают. Но старые прокси — нет.
**Timestamps** — метки времени TCP. Linux включает по умолчанию. Windows — нет. macOS — включает.
Антифрод собирает эти параметры в момент handshake. Сравнивает с эталонными профилями ОС.
Пример: ваш браузер на Windows 11 шлет запрос через прокси на Linux. Антифрод видит: TCP-стек клиента — Linux (по window scale, timestamps). А User-Agent в HTTP — Chrome on Windows. Несоответствие. Блокировка.
HTTP-заголовки, которые выдают прокси
Прокси добавляют заголовки. Даже если вы их не просили.
**Via** — стандартный заголовок для прокси. Некоторые серверы его не удаляют.
**X-Forwarded-For** — цепочка IP. Если прокси его не чистит — ваша реальная IP там.
**X-Real-IP** — nginx proxy. Часто забывают удалить.
**Connection: keep-alive** — прокси могут менять поведение. Например, форсировать закрытие соединения после каждого запроса.
**Client-IP** — редко, но бывает.
Пример запроса через прокси:
```
GET / HTTP/1.1
Host: target.com
Via: 1.1 proxy.example.com
X-Forwarded-For: 192.168.1.100
```
Антифрод видит: "пользователь за прокси". Даже если IP чистый.
Fingerprint браузера — цифровой отпечаток
Canvas fingerprinting — рисование скрытого изображения. Разные браузеры рендерят его по-разному. Прокси не влияют.
WebGL — 3D-рендеринг. GPU и драйверы дают уникальные значения. Прокси не меняют.
AudioContext — генерация звука. Разные браузеры выдают разные частоты.
Font fingerprinting — список шрифтов. У реального пользователя — 50-100 шрифтов. У прокси-клиента — 10-20.
**User-Agent** — легко подделывается. Но антифрод проверяет его на соответствие остальным параметрам.
**Screen resolution** — разрешение экрана. Часто совпадает с типичным для региона.
**Timezone** — часовой пояс. Если прокси в США, а timezone Europe/Moscow — подозрительно.
Реальный кейс: пользователь с IP из Германии, timezone Asia/Tehran, язык браузера русский. Антифрод: "прокси + эмигрант". Блокировка.
WebRTC — утечка реального IP
WebRTC — технология для P2P. Она игнорирует прокси. Браузер напрямую шлет запросы на STUN-серверы. Те возвращают реальный IP.
Антифрод встраивает на сайт скрытый WebRTC-код. Он собирает все IP клиента: реальный и через прокси.
Сравнение: если IP через прокси отличается от реального — это прокси.
Пример кода для проверки:
```javascript
const pc = new RTCPeerConnection({iceServers: [{urls: 'stun:stun.l.google.com:19302'}]});
pc.createDataChannel('');
pc.createOffer().then(offer => pc.setLocalDescription(offer));
pc.onicecandidate = e => console.log(e.candidate.candidate);
```
Результат: видите два IP — один ваш, другой прокси.
DNS-запросы — следы прокси
Когда вы используете прокси, DNS-запросы идут через него. Но браузер может делать их локально.
Антифрод проверяет: совпадает ли DNS-сервер с IP прокси? Если нет — это прокси.
Также: время ответа DNS. Через прокси — задержка 100-500 мс. У реального пользователя — 10-50 мс.
Поведенческий анализ
Прокси-клиенты ведут себя иначе:
- **Скорость кликов** — у прокси выше задержка. Клики с задержкой 200-500 мс — подозрительно.
- **Прокрутка страницы** — через прокси рывками.
- **Время загрузки ресурсов** — CSS, JS, изображения грузятся с задержкой.
Антифрод строит профиль поведения. Если он отклоняется от нормы — блокировка.
Пример: как работает lexic.ml в этой войне
Мы в lexic.ml с 2015 года боремся с детекцией. Наши прокси:
- Форсируют TTL=64 (как Linux), чтобы не выбиваться из профиля.
- Удаляют все лишние HTTP-заголовки (Via, X-Forwarded-For).
- Поддерживают WebRTC-блокировку на уровне ядра.
- Используют реальные DNS-серверы региона.
Но даже так — антифроды умнеют. Мы тестируем каждый новый метод детекции. Если система начинает считать наши IP — меняем стек.
Таблица: какие параметры выдают прокси
| Параметр | Реальный пользователь | Прокси-клиент |
|----------|----------------------|---------------|
| TTL | 128 (Win), 64 (Linux) | Часто 64, но может быть 128 |
| MTU | 1500 | 1400-1500 |
| Window Scale | 8 (Win), 7 (Linux) | 7 (если прокси на Linux) |
| Via | Нет | Есть (если не удален) |
| X-Forwarded-For | Нет | Есть (если не удален) |
| WebRTC IP | Один | Два (реальный + прокси) |
| DNS-сервер | Локальный | Прокси-сервер |
| Timezone | Соответствует IP | Может не совпадать |
| Canvas fingerprint | Уникальный | Уникальный, но не совпадает с регионом |
Как защититься от детекции
1. **Используйте прокси с чистым TCP-стеком**. Не все прокси форсят параметры. Выбирайте те, что маскируются под реальную ОС.
2. **Блокируйте WebRTC**. В браузере: `chrome://flags/#enable-webrtc-hide-local-ips-with-mdns`. Или через расширения.
3. **Удаляйте лишние заголовки**. Если вы пишете свой клиент — чистите Via, X-Forwarded-For.
4. **Синхронизируйте timezone**. Ваш часовой пояс должен совпадать с регионом IP.
5. **Используйте реальные шрифты**. У прокси-клиентов часто урезанный список шрифтов. Установите стандартные.
6. **Не используйте одинаковые fingerprint для всех сессий**. Антифрод видит: 1000 пользователей с одинаковым отпечатком — это бот.
Что будет дальше
Антифроды переходят на ML. Они обучают модели на тысячах параметров: от TCP-заголовков до времени между кликами.
Прокси-провайдеры отвечают тем же: генерируют реалистичные профили для каждого IP.
Война бесконечна. Но знание механизмов — половина победы.