← Назад в базу знаний

TCP fingerprint: как антифрод видит твой прокси

TCP 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 своих прокси. Сравнивай с клиентом. Если расхождение — ищи альтернативы.

Помни: антифрод эволюционирует. То, что работало вчера, может не работать завтра. Держи руку на пульсе.

✔️Купить прокси