Как антифрод-системы вычисляют прокси по анализу TCP/IP стека (TCP fingerprint)
Содержание
- TCP/IP стек как отпечаток пальца
- Параметры, которые выдают прокси
- p0f и другие инструменты пассивного анализа
- Антифрод на той стороне видит:
- - TTL: 55
- - Window: 65535
- - Options: MSS,NOP,WScale,NOP,NOP,SACK,Timestamp
- - Идентифицирует как Linux 4.x
- TCP timestamp — ловушка для прокси
- IP ID — скрытая метка
- Window Scale и другие тонкости
- Реальные кейсы блокировок
- Как защититься от fingerprint-детекта
- Пример изменения TTL на Linux
- Таблица сравнения fingerprint разных ОС
- Будущее TCP fingerprinting
TCP/IP стек как отпечаток пальца
Каждое устройство в сети оставляет следы. Невидимые, но читаемые. TCP/IP стек — это не просто протокол, а сложная система с кучей параметров по умолчанию. Разные ОС, разные версии ядер, разные сборки — всё это даёт уникальную комбинацию.
Антифрод-системы давно научились снимать эти отпечатки. Берут TCP-пакет, разбирают его по косточкам, сравнивают с базой known fingerprints. Если виртуальная машина с прокси выдаёт fingerprint Windows Server 2019, а User-Agent в HTTP — iPhone 15 — тревога.
Хуже того, многие прокси-провайдеры используют шаблонные образы. Один образ на сотни клиентов. Один fingerprint на всех. Антифрод это видит: "О, 500 запросов с идентичным TCP fingerprint, но IP из разных подсетей. Блокируем."
Параметры, которые выдают прокси
TCP handshake — кладезь информации. SYN-пакет содержит кучу полей, которые разные ОС заполняют по-разному.
**TTL (Time To Live)**. Начальное значение — первый маркер. Windows: 128. Linux: 64. Cisco: 255. Если пакет пришёл с TTL=55, но через 5 хопов — значит стартовый был 60. Специфичная сборка? Возможно.
**Window Size**. Размер окна приёма. Windows 10: 65535. Linux: 29200 или 65535 в зависимости от версии. Прокси-софт часто не трогает этот параметр, оставляя дефолт.
**MSS (Maximum Segment Size)**. Обычно 1460 для Ethernet. Но некоторые VPS-провайдеры ставят 1440 или 1452. Мелкий нюанс, а антифрод цепляется.
**TCP Options**. Список опций и их порядок — самый информативный кусок. Windows: `MSS, NOP, WScale, NOP, NOP, SACK, Timestamp`. Linux: `MSS, SACK, Timestamp, WScale`. Разный порядок, разный набор. Прокси-сервера часто отдают опции хост-системы, а не клиента.
p0f и другие инструменты пассивного анализа
Самый известный инструмент — p0f (passive OS fingerprinting). Работает без инъекций, просто слушает трафик.
```
curl -s https://example.com | head -1
Антифрод на той стороне видит:
- TTL: 55
- Window: 65535
- Options: MSS,NOP,WScale,NOP,NOP,SACK,Timestamp
- Идентифицирует как Linux 4.x
```
p0f хранит базу сигнатур. Сравнивает входящий пакет с десятками тысяч записей. Результат — ОС, дистанция до хоста, иногда даже версия ядра.
Но p0f — это прошлый век. Современные антифрод-системы используют машинное обучение. Скармливают fingerprintы нейросетям, те находят аномалии быстрее человека.
TCP timestamp — ловушка для прокси
Опция Timestamp (TSval, TSecr) — мощный инструмент. Она показывает время отправки пакета с точностью до миллисекунд.
Проблема прокси: timestamp клиента не совпадает с timestamp сервера. Антифрод сравнивает: "Этот запрос пришёл с IP из Нью-Йорка, но timestamp соответствует UTC+3. Странно."
Хуже того, некоторые прокси забывают обновлять timestamp при пересылке пакетов. Клиент отправил пакет с TSval=1000, прокси переслал с тем же TSval. Сервер видит: "Пакет пришёл через 500 мс, но timestamp говорит 0 мс. Невозможно физически."
Ещё один трюк: по разнице timestamp можно определить, сколько времени прошло между запросами. Если один клиент шлёт запросы с разных IP, но timestamp растёт линейно — это один человек за прокси.
IP ID — скрытая метка
Поле Identification в IP-заголовке — ещё один маркер. Разные ОС генерируют ID по-разному:
- Linux: глобальный счётчик, увеличивается на 1 с каждым пакетом
- Windows: случайное значение
- OpenBSD: случайное, но с определённым распределением
Прокси часто кеширует пакеты. Если два запроса с разных IP имеют ID, идущие подряд (например, 12345 и 12346) — это один источник.
Антифрод собирает статистику: "С этого IP ID всегда чётный, с этого — нечётный. Совпадение? Нет."
Window Scale и другие тонкости
Window Scale — множитель для размера окна. Значение от 0 до 14. Windows 10: 8 (множитель 256). Linux: 7 (128). Разные сборки Linux могут иметь 6 или 9.
MSS тоже варьируется. Стандарт 1460, но:
- VPN-туннели: 1400-1450
- PPPoE: 1492
- Loobpack: 16384
Прокси, работающие через туннели, часто имеют MSS ниже стандартного. Антифрод это видит и понимает: "MSS=1400 — почти наверняка туннель или прокси."
Реальные кейсы блокировок
**Кейс 1: Одинаковый fingerprint на всех клиентах**
Провайдер арендовал 1000 IP на одном VPS. Все прокси — Docker-контейнеры с одинаковым образом. Антифрод увидел 1000 запросов с идентичным fingerprint и заблокировал всю подсеть за 10 минут.
**Кейс 2: Несоответствие TTL и геолокации**
Клиент из Австралии, TTL=55 (стартовый 60, 5 хопов). Но сервер в США. TTL через 10 хопов должен быть 50, а не 55. Значит, клиент физически ближе к серверу, чем заявляет. Прокси.
**Кейс 3: Timestamp-атака**
Прокси-сервер в Нидерландах. Клиент из России. При каждом запросе timestamp увеличивается на 50-100 мс. Но сервер видит, что RTT (round-trip time) между клиентом и прокси — 200 мс. Разница timestamp меньше RTT — невозможно. Прокси.
Как защититься от fingerprint-детекта
Полностью скрыть TCP fingerprint — задача сложная. Но можно минимизировать риски.
**Способ 1: Использовать однородную инфраструктуру**
Если все клиенты используют одну ОС с одинаковыми настройками стека — fingerprint будет одинаковым. Это не скроет прокси, но сделает детект сложнее.
**Способ 2: Модифицировать TCP/IP стек**
На Linux можно через sysctl изменить TTL, window size, MSS. Но полную эмуляцию Windows сделать сложно — слишком много нюансов.
```
Пример изменения TTL на Linux
sysctl -w net.ipv4.ip_default_ttl=128
```
**Способ 3: Использовать специализированные прокси**
Некоторые провайдеры, вроде lexic.ml, модифицируют TCP-стек клиента, подгоняя его под target-систему. Но это костыль, не панацея.
**Способ 4: Прокси с поддержкой TCP splicing**
Терминируют TCP-соединение на своей стороне, создавая новое — к серверу. Fingerprint клиента не передаётся. Минус: latency растёт.
Таблица сравнения fingerprint разных ОС
| Параметр | Windows 10 | Linux 5.x | macOS | Android |
|----------|------------|-----------|-------|---------|
| TTL | 128 | 64 | 64 | 64 |
| Window Size | 65535 | 29200 | 65535 | 65535 |
| MSS | 1460 | 1460 | 1460 | 1460 |
| WScale | 8 | 7 | 3 | 8 |
| Опции | MSS,NOP,WScale,NOP,NOP,SACK,Timestamp | MSS,SACK,Timestamp,WScale | MSS,NOP,WScale,NOP,SACK,Timestamp | MSS,SACK,Timestamp,WScale |
Разница очевидна. Особенно порядок опций и WScale.
Будущее TCP fingerprinting
С развитием HTTP/3 и QUIC классический TCP fingerprint теряет актуальность. QUIC работает поверх UDP, там свои механизмы идентификации.
Но антифрод не стоит на месте. Уже сейчас анализируют:
- Packet inter-arrival time (время между пакетами)
- Congestion control алгоритмы (CUBIC, BBR, Reno)
- ACK-стратегии
Прокси-провайдерам придётся адаптироваться. Эмуляция стека на уровне ядра — тренд. Но это дорого и сложно.
Для обычного пользователя совет один: не используйте дешёвые прокси с VPS-образов. Они все одинаковые, и антифрод их видит за километр.