TCP fingerprint: как антифрод видит твой прокси
Содержание
- Как формируется TCP fingerprint
- MTU — Maximum Transmission Unit
- TTL — Time To Live
- Window Size — размер окна TCP
- Как антифрод собирает fingerprint
- Реальный кейс: как вычислили прокси
- Как проверить свой fingerprint
- Получаем TTL из сокета
- Получаем MSS
- Как прокси маскируют fingerprint
- Таблица: параметры разных ОС
- Почему простые методы не работают
- Что делать, если антифрод блокирует
- Зоопарк антифрод-систем
- Реальный пример с прокси
- Выводы
Прокси — не панацея. Антифрод-системы давно научились вычислять их по TCP-стеку. Не по IP-адресу, а по тому, как твой пакет выглядит на уровне ядра.
MTU, TTL, window size — три параметра, которые сливают прокси с потрохами. Разбираем, как это работает и что с этим делать.
Как формируется TCP fingerprint
Каждый пакет TCP содержит заголовок. В нём — куча полей, которые заполняет операционная система. Не приложение, не браузер. Именно ядро ОС.
Разные ОС заполняют эти поля по-разному. Linux ставит одни значения, Windows — другие, macOS — третьи. Антифрод собирает эти параметры в отпечаток — fingerprint.
Проблема в том, что прокси-серверы обычно работают на Linux. Клиент сидит на Windows или macOS. Когда запрос идёт через прокси, антифрод видит fingerprint сервера, а не клиента.
MTU — Maximum Transmission Unit
MTU определяет максимальный размер пакета. Стандартное значение для Ethernet — 1500 байт. Но не все так просто.
Домашние роутеры, VPN-туннели, PPPoE-соединения — каждый добавляет свои накладные расходы. Реальный MTU может быть 1492, 1472 или даже 1400.
Антифрод смотрит: если MTU клиента отличается от стандартного — подозрительно. Если MTU совпадает с типичным значением для дата-центров — ещё подозрительнее.
Пример: ты сидишь дома с MTU 1492 (PPPoE). Прокси в DigitalOcean даёт MTU 1500. Антифрод видит расхождение и ставит флаг.
TTL — Time To Live
TTL — счётчик прыжков. Каждый роутер уменьшает его на 1. Когда TTL доходит до 0, пакет отбрасывается.
Стандартные значения:
- Linux: 64
- Windows: 128
- macOS: 64
- Cisco: 255
Антифрод вычисляет начальный TTL по формуле: округление до ближайшего стандартного значения вверх.
Пример: пришёл пакет с TTL=52. Округляем до 64. Значит, прошло 12 хопов. Если TTL=116 — округляем до 128, прошло 12 хопов.
Проблема: прокси часто форвардят пакеты без изменения TTL. Клиентский TTL доходит до сервера. Но если прокси уменьшает TTL — антифрод видит несоответствие.
Window Size — размер окна TCP
Window size — параметр, который говорит, сколько данных может принять сторона без подтверждения. Значение зависит от ОС и настроек.
Linux: 29200 или 65535 (с масштабированием)
Windows: 65535 или 8192
macOS: 65535
Антифрод анализирует window size в SYN-пакете. Если клиент отправляет window size как у Linux, а User-Agent как у Chrome на Windows — несоответствие.
Как антифрод собирает fingerprint
Система пассивно слушает TCP-рукопожатие. Ей не нужно отправлять дополнительные запросы. Достаточно первого SYN-пакета.
Собираются параметры:
- Initial TTL
- Window size
- MTU (через MSS — Maximum Segment Size)
- Опции TCP: SACK, Timestamps, WSopt
- Порядок опций
Из этого формируется хеш — p0f-отпечаток. База p0f содержит тысячи fingerprint'ов разных ОС и устройств.
Реальный кейс: как вычислили прокси
Ситуация: пользователь заходит на сайт через прокси. Браузер — Chrome на Windows. Fingerprint:
- TTL: 64 (Linux)
- Window size: 29200 (Linux)
- MSS: 1460 (Linux)
- Опции: порядок как у Linux
Антифрод сверяет с базой. Совпадение: Linux 2.6.x. User-Agent: Windows NT 10.0. Несовпадение. Блокировка.
Как проверить свой fingerprint
Используй curl с разными интерфейсами:
```bash
curl -v --interface eth0 https://example.com 2>&1 | grep -E "TTL|MSS|window"
```
Или пиши скрипт на Python:
```python
import socket
import struct
def get_tcp_fingerprint(host, port):
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(5)
sock.connect((host, port))
Получаем TTL из сокета
ttl = sock.getsockopt(socket.IPPROTO_IP, socket.IP_TTL)
Получаем MSS
mss = sock.getsockopt(socket.IPPROTO_TCP, socket.TCP_MAXSEG)
sock.close()
return {"ttl": ttl, "mss": mss}
print(get_tcp_fingerprint("example.com", 80))
```
Как прокси маскируют fingerprint
Простые прокси не меняют TCP-параметры. Они работают как есть. Антифрод легко их вычисляет.
Продвинутые решения меняют fingerprint под клиента. Например, proxy.ml (lexic.ml) использует технологию TCP spoofing — подменяет параметры в SYN-пакете.
Как это работает:
1. Прокси получает SYN от клиента
2. Снимает fingerprint клиента
3. Форвардит запрос с изменёнными параметрами
4. Ответ приходит с подставными значениями
Таблица: параметры разных ОС
| ОС | TTL | Window Size | MSS | Типичный fingerprint |
|---|---|---|---|---|
| Linux 2.6+ | 64 | 29200 | 1460 | 64:29200:1460:... |
| Windows 10 | 128 | 65535 | 1460 | 128:65535:1460:... |
| macOS | 64 | 65535 | 1460 | 64:65535:1460:... |
| Android | 64 | 29200 | 1440 | 64:29200:1440:... |
| iOS | 64 | 65535 | 1440 | 64:65535:1440:... |
Почему простые методы не работают
Менять TTL вручную — хреновая идея. Если поставить 128, а клиент на Linux — антифрод увидит несоответствие с другими параметрами.
Менять window size — тоже грабли. Значение должно совпадать с реальным поведением TCP-стека. Иначе пакеты будут теряться.
Лучший способ — полная эмуляция fingerprint'а клиента. Но это требует глубоких изменений в ядре или использования специализированных прокси.
Что делать, если антифрод блокирует
Первый шаг — проверить fingerprint своего прокси. Используй p0f или аналоги:
```bash
p0f -i eth0 -p -o /var/log/p0f.log
```
Второй шаг — сравни с ожидаемым fingerprint'ом клиента. Если расхождение — прокси не подходит.
Третий шаг — ищи прокси с поддержкой TCP spoofing. Обычные HTTP/SOCKS прокси не меняют fingerprint. Только специализированные решения.
Зоопарк антифрод-систем
Разные системы используют разные подходы:
- Cloudflare: анализирует TTL + window size + порядок опций
- Akamai: смотрит на MSS + TTL + timestamp
- PerimeterX: проверяет window size + масштабирование
- DataDome: собирает полный fingerprint + поведенческий анализ
Каждая система имеет свои пороги. Где-то достаточно совпадения TTL, где-то нужно полное совпадение fingerprint'а.
Реальный пример с прокси
Берём обычный прокси на Linux. Отправляем запрос:
```bash
curl -x http://proxy:8080 https://httpbin.org/ip
```
Смотрим fingerprint через tcpdump:
```
10:00:00.000000 IP client.12345 > server.80: Flags [S], seq 123, win 29200, options [mss 1460,sackOK,TS val 123 ecr 0,nop,wscale 7], length 0
```
Window size 29200, MSS 1460 — чистый Linux. Если клиент на Windows — провал.
Тот же запрос через lexic.ml:
```
10:00:00.000000 IP client.12345 > server.80: Flags [S], seq 456, win 65535, options [mss 1460,sackOK,TS val 456 ecr 0,nop,wscale 7], length 0
```
Window size 65535 — уже похоже на Windows. Fingerprint подменён.
Выводы
TCP fingerprint — мощный инструмент антифрода. MTU, TTL, window size — три параметра, которые выдают прокси.
Обычные прокси не защищают от этого. Нужны специализированные решения с поддержкой TCP spoofing.
Проверяй fingerprint своих прокси. Сравнивай с клиентом. Если расхождение — ищи альтернативы.
Помни: антифрод эволюционирует. То, что работало вчера, может не работать завтра. Держи руку на пульсе.