TCP fingerprint: как антифрод вычисляет прокси
Содержание
- Что такое TCP fingerprint
- Как антифрод собирает данные
- Почему стандартные прокси палятся
- Реальный кейс: бан по TTL
- Техники обхода: маскировка fingerprint'а
- 1. Подмена TTL
- Установить TTL=128 для всех исходящих пакетов
- 2. Настройка TCP-стэка
- Размер окна как у Windows
- Отключить SACK (Windows не всегда использует)
- 3. Эмуляция через nfqueue
- Меняем TTL
- Меняем размер окна
- Удаляем опцию TS (часто палит прокси)
- Продвинутые методы антифрода
- Таблица: fingerprint'ы популярных ОС
- Практический тест
- Что делает lexic.ml
- Как обходить комплексно
- Грабли, на которые наступают
- Вывод
Антифрод-системы научились видеть прокси на уровне TCP. Не по IP, не по заголовкам HTTP, а по тому, как соединение устанавливается. Разберём механику.
Что такое TCP fingerprint
Каждая операционная система собирает TCP-пакеты по-своему. Linux, Windows, macOS — у каждого свой почерк. Разница в начальном TTL, размере окна, опциях TCP, таймингах.
Пример fingerprint'а Linux 5.x:
```
TTL: 64
Window: 29200
Options: MSS, SACK, TS, NOP, WScale
MSS: 1460
WScale: 7
```
Windows 10 выдаст:
```
TTL: 128
Window: 65535
Options: MSS, SACK, TS, WScale
MSS: 1460
WScale: 8
```
Антифрод снимает отпечаток с каждого входящего соединения. Если fingerprint не совпадает с ожидаемым для реального пользователя — прокси.
Как антифрод собирает данные
Система пассивно слушает SYN-пакеты. Ей не нужно отвечать — достаточно первого пакета трёхстороннего рукопожатия.
Что анализируется:
- Размер начального окна (IW)
- Список опций TCP и их порядок
- Значение TTL
- Timestamp и их точность
- Флаги ECN, SACK
Всё это складывается в хеш. Базы данных вроде p0f или JA3 собирают миллионы таких отпечатков. Сравнение занимает миллисекунды.
Почему стандартные прокси палятся
Обычный прокси-сервер работает на Linux. Он шлёт пакеты с fingerprint'ом Linux. Пользователь сидит на Windows, но антифрод видит Linux-отпечаток. Несостыковка.
Хуже того — многие VPS и dedicated серверы используют дефолтные настройки ядра. Все они выглядят одинаково. Антифрод знает: если пришёл запрос с fingerprint'ом DigitalOcean или AWS — это почти наверняка прокси.
Реальный кейс: бан по TTL
Была история: клиент купил прокси, всё работало неделю. Потом — блокировка. Антифрод засёк TTL=64. У реальных пользователей в этом регионе TTL=128 (Windows). Разница в 64 хопа — очевидный признак прокси.
Решение примитивное, но рабочее: подкрутить TTL в iptables:
```bash
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 128
```
Но это лечит только один симптом.
Техники обхода: маскировка fingerprint'а
1. Подмена TTL
Меняем TTL на значение, типичное для целевой ОС. Для Windows — 128, для macOS — 64, для Android — 64.
```bash
Установить TTL=128 для всех исходящих пакетов
iptables -t mangle -A POSTROUTING -j TTL --ttl-set 128
```
2. Настройка TCP-стэка
Linux позволяет менять параметры TCP через sysctl. Можно подогнать под fingerprint Windows.
```bash
Размер окна как у Windows
sysctl -w net.ipv4.tcp_window_scaling=1
sysctl -w net.ipv4.tcp_rmem='4096 87380 6291456'
sysctl -w net.ipv4.tcp_wmem='4096 87380 6291456'
Отключить SACK (Windows не всегда использует)
sysctl -w net.ipv4.tcp_sack=0
```
3. Эмуляция через nfqueue
Более сложный, но гибкий вариант. Перехватываем SYN-пакеты и модифицируем их на лету.
```python
from nfqueue import Queue
from scapy.all import IP, TCP
def modify_packet(payload):
data = payload.get_data()
pkt = IP(data)
if TCP in pkt and pkt[TCP].flags == 'S':
Меняем TTL
pkt[IP].ttl = 128
Меняем размер окна
pkt[TCP].window = 65535
Удаляем опцию TS (часто палит прокси)
del pkt[TCP].options
payload.set_verdict_modified(1, bytes(pkt), len(pkt))
else:
payload.set_verdict(1)
q = Queue()
q.open()
q.set_callback(modify_packet)
q.bind(0)
q.run()
```
Продвинутые методы антифрода
Антифрод не стоит на месте. Они научились анализировать:
- **TCP timestamps**. У реальных пользователей они монотонно растут. У прокси — сбрасываются при перезапуске сервера.
- **RTT (Round-Trip Time)**. Слишком стабильное время ответа — признак прокси.
- **Sequence numbers**. Предсказуемые последовательности — признак ботов.
- **IP ID**. У прокси часто одинаковый IP ID для всех соединений.
Таблица: fingerprint'ы популярных ОС
| ОС | TTL | Window | MSS | WScale | SACK | Timestamp |
|---|---|---|---|---|---|---|
| Windows 10 | 128 | 65535 | 1460 | 8 | + | + |
| Windows 11 | 128 | 65535 | 1460 | 8 | + | + |
| Linux 5.x | 64 | 29200 | 1460 | 7 | + | + |
| macOS 14 | 64 | 65535 | 1460 | 6 | + | + |
| Android 13 | 64 | 29200 | 1460 | 7 | + | + |
| iOS 17 | 64 | 65535 | 1460 | 6 | + | + |
Практический тест
Проверяем fingerprint своего сервера через curl:
```bash
curl -s https://tcpip.pro/api/fingerprint
```
Ответ покажет, как вас видит антифрод. Если TTL=64 и window=29200 — вы Linux. Для маскировки под Windows нужно TTL=128 и window=65535.
Что делает lexic.ml
Провайдеры вроде lexic.ml уже встроили маскировку TCP fingerprint в свои прокси. Они подменяют fingerprint на уровне ядра, эмулируя Windows или macOS. Плюс рандомизируют параметры, чтобы каждый запрос выглядел как от отдельного пользователя.
Но это не панацея. Антифрод эволюционирует. Теперь они смотрят на:
- **HTTP/2 fingerprint**. Как клиент устанавливает h2-соединение — свой почерк.
- **TLS fingerprint (JA3)**. Как клиент договаривается о шифровании.
- **WebRTC fingerprint**. Даже без WebRTC, системные вызовы оставляют следы.
Как обходить комплексно
Одной подменой TTL не отделаться. Нужен многослойный подход:
1. **TCP-стек** — подогнать под целевую ОС.
2. **HTTP-заголовки** — User-Agent, Accept-Language, порядок заголовков — всё должно соответствовать.
3. **TLS** — использовать библиотеки, эмулирующие fingerprint браузера.
4. **Поведение** — имитировать человеческие паузы, скролл, клики.
Пример настройки Python requests с маскировкой:
```python
import requests
from requests.adapters import HTTPAdapter
from urllib3.util.ssl_ import create_urllib3_context
class TlsAdapter(HTTPAdapter):
def init_poolmanager(self, *args, **kwargs):
ctx = create_urllib3_context()
ctx.set_ciphers('ECDHE+AESGCM:ECDHE+CHACHA20:DHE+AESGCM')
ctx.set_alpn_protocols(['h2', 'http/1.1'])
kwargs['ssl_context'] = ctx
return super().init_poolmanager(*args, **kwargs)
session = requests.Session()
session.mount('https://', TlsAdapter())
```
Грабли, на которые наступают
- **Слишком чистый fingerprint**. Если все параметры идеально совпадают с Windows, но при этом нет ни одного отклонения — это подозрительно. У реальных пользователей бывают вариации.
- **Постоянный IP ID**. Некоторые забывают рандомизировать IP ID. Антифрод видит: все пакеты от этого IP имеют последовательные ID — явный признак одного устройства.
- **Отсутствие background traffic**. У реального пользователя в фоне идут обновления, DNS-запросы, синхронизация. У прокси — тишина.
Вывод
TCP fingerprint — мощный инструмент, но не абсолютный. Антифрод смотрит не на один параметр, а на совокупность. Маскировка должна быть комплексной: от TTL до TLS.
Если используете прокси для критичных задач — проверяйте fingerprint вашего сервера. И не забывайте про поведенческий анализ. Технические параметры можно подделать, но паттерны поведения пользователя — сложнее.