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

Как антифрод-системы вычисляют прокси по TCP/IP-стеку (TCP fingerprint) и как это обойти

Как антифрод-системы вычисляют прокси по TCP/IP-стеку (TCP fingerprint) и как это обойти

Как антифрод-системы вычисляют прокси по TCP/IP-стеку

Банки, маркетплейсы и CDN-провайдеры не просто смотрят на IP. Они копают глубже. На уровень TCP-рукопожатия. Там, где обычный пользователь не оставляет следов, прокси выдают себя с головой.

TCP fingerprint — это цифровой отпечаток стека. Каждая ОС, каждое ядро, каждый прокси-сервер настраивает TCP-соединение по-своему. Размер окна, TTL, опции, последовательность флагов — всё это собирается в уникальный профиль.

Как выглядит TCP-рукопожатие глазами антифрода

Когда клиент шлёт SYN, антифрод смотрит не на IP, а на структуру пакета. Конкретные поля:

- **Window Size (WSS)** — начальное окно приёма. Linux обычно ставит 29200 или 65535. Windows — 65535, 8192, 64240. MacOS — 65535.

- **TTL (Time To Live)** — начальное значение. 64 для Linux/Mac, 128 для Windows.

- **MSS (Maximum Segment Size)** — максимум сегмента. 1460 для Ethernet, 1440 для PPPoE, 1400 для VPN.

- **TCP Options** — порядок и состав опций. SACK permitted, Timestamp, NOP, Window scale — их комбинация уникальна для каждого стека.

- **ISN (Initial Sequence Number)** — генерация случайного числа. Разные ОС используют разные алгоритмы.

Собери всё это — получишь хеш. Он называется **TCP fingerprint**. Базы данных вроде p0f, nmap, JA3S содержат миллионы таких отпечатков.

Почему прокси-серверы светятся

Прокси — это серверы. Они работают под Linux, FreeBSD или Windows Server. Их TCP-стек отличается от клиентского.

Пример: запрос с мобильного телефона через 4G. TTL обычно 64, WSS около 65535, MSS 1460. Если такой запрос приходит с прокси на Linux с TTL 64, WSS 29200 и MSS 1440 — это аномалия.

Антифрод видит: IP из диапазона дата-центра, а TCP-отпечаток — как у реального пользователя. Только наоборот. Если отпечаток совпадает с прокси-сервером — блокировка.

Реальный пример: как p0f видит прокси

Утилита p0f (passive OS fingerprinting) анализирует трафик без активного сканирования. Она смотрит на SYN-пакеты и выдаёт:

```

192.168.1.1: Linux 3.x [S:64:1:0:mss=1460,ws=7,nop,nop,sok:df:0]

```

Это значит: TTL 64, window scale 7, MSS 1460, опции в порядке. Если антифрод видит такой отпечаток с IP, который не принадлежит Linux-хосту (например, мобильный IP), он делает вывод — это прокси.

Как антифрод собирает статистику по отпечаткам

Система не блокирует по одному запросу. Она накапливает данные. За час собирает 10-20 тысяч запросов с одного IP. Строит распределение TCP fingerprints.

Если 95% запросов с одного IP имеют одинаковый отпечаток — это сервер. Если отпечатки разные — возможно, NAT. Но если среди них есть отпечатки прокси-серверов — это красный флаг.

Базы данных антифродов содержат отпечатки популярных прокси-провайдеров. Например, отпечатки nginx, haproxy, squid, 3proxy. Если твой прокси использует стандартный стек Linux — он в базе.

Что можно сделать: обход через модификацию TCP-стека

Обойти TCP fingerprint можно. Но не магией. Нужно изменить параметры стека на сервере, чтобы они совпадали с клиентскими.

**Способ 1: Изменение sysctl**

На Linux можно подкрутить параметры TCP:

```bash

Изменяем TTL на 128 (как у Windows)

echo 128 > /proc/sys/net/ipv4/ip_default_ttl

Меняем начальное окно

echo 65535 > /proc/sys/net/ipv4/tcp_rmem

echo 65535 > /proc/sys/net/ipv4/tcp_wmem

Отключаем window scaling для совместимости

echo 0 > /proc/sys/net/ipv4/tcp_window_scaling

```

Но это грубо. Антифрод видит не только TTL, но и комбинацию опций. Просто изменить TTL недостаточно.

**Способ 2: Эмуляция стека через iptables**

Можно перехватывать SYN-пакеты и модифицировать их на лету. Например, скриптом на Python с использованием scapy:

```python

from scapy.all import *

def modify_syn(pkt):

if TCP in pkt and pkt[TCP].flags == 'S':

Меняем TTL

pkt[IP].ttl = 128

Меняем window size

pkt[TCP].window = 65535

Убираем лишние опции

del pkt[TCP].options

Добавляем стандартные для Windows

pkt[TCP].options = [('MSS', 1460), ('NOP', None), ('NOP', None), ('SACKOK', None), ('WScale', 8)]

send(pkt)

sniff(filter='tcp', prn=modify_syn, store=0)

```

Но это костыль. Пакет может быть отброшен антифродом, если контрольная сумма не сойдётся. Или если прокси-сервер сам перезапишет параметры.

**Способ 3: Использование специализированных прокси**

Некоторые провайдеры прокси (например, lexic.ml) давно знают про TCP fingerprint. Они используют кастомные стеки или эмуляцию под реальные устройства. В их случае отпечаток будет совпадать с мобильным или домашним интернетом.

Но важно понимать: полная эмуляция невозможна. Есть параметры, которые не подделать. Например, ISN — генерация случайных чисел. Если антифрод использует машинное обучение, он может заметить, что ISN ведёт себя не как у реального пользователя.

Кейс: банк блокирует прокси по fingerprint

Пример: онлайн-банк на nginx 1.24. Он использует модуль ngx_http_realip_module и p0f для пассивного анализа. Приходит запрос с IP 45.67.89.10. p0f выдаёт:

```

45.67.89.10: Linux 3.x [S:64:1:0:mss=1440,ws=7,nop,nop,sok:df:0]

```

Банк знает, что IP 45.67.89.10 принадлежит дата-центру Hetzner. Отпечаток Linux. В то же время, с этого IP идут запросы с User-Agent мобильного Safari. Несоответствие. Банк ставит метку "прокси" и через 5 минут блокирует IP.

Решение: на прокси-сервере нужно изменить отпечаток под Windows. Для этого можно использовать iptables с модулем u32 или tc. Но проще — взять прокси, который уже эмулирует Windows.

Кейс: CDN блокирует по TCP timestamp

Другой пример: CDN от Cloudflare. Они смотрят на TCP Timestamp option. Если timestamp монотонно возрастает — это сервер. У пользователя timestamp может сбрасываться при перезагрузке или менять случайно.

Прокси на Linux обычно использует системные часы. Timestamp растёт линейно. CDN видит: за 10 минут timestamp увеличился на 600 секунд. Это значит, что сервер не перезагружался. Антифрод делает вывод — это не пользователь.

Обойти можно: отключить timestamp на сервере:

```bash

echo 0 > /proc/sys/net/ipv4/tcp_timestamps

```

Но тогда нарушится работа некоторых протоколов (например, TCP Fast Open). И антифрод может заметить отсутствие timestamp — это тоже аномалия.

Кейс: антифрод вычисляет прокси по MSS

MSS (Maximum Segment Size) — размер сегмента, который клиент готов принять. Для Ethernet это 1460 байт. Для PPPoE — 1440. Для VPN — 1400.

Прокси часто используют туннели. Если прокси работает через OpenVPN, MSS уменьшается. Антифрод видит: запрос с IP дата-центра, MSS 1400. Обычный пользователь так не подключается. Блокировка.

Решение: настроить MSS clamping на прокси:

```bash

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

```

Это заставит сервер подстраивать MSS под реальный MTU. Но если MTU на прокси меньше, чем у клиента, MSS всё равно будет отличаться.

Что реально работает: комбинация методов

Ни один метод по отдельности не даёт 100% защиты. Антифроды умные. Они смотрят на всё вместе: IP, TCP fingerprint, HTTP headers, поведение.

Лучший подход — использовать прокси, которые:

1. Эмулируют реальный TCP-стек (Windows, macOS, Android).

2. Меняют IP под каждый запрос (ротация).

3. Имитируют поведение пользователя (задержки, тайминги).

Например, на lexic.ml используют кастомные билды ядра с изменёнными параметрами. Они подсовывают антифроду отпечаток, который совпадает с обычным домашним роутером. Но даже это не гарантия.

Технический итог

TCP fingerprint — мощный инструмент. Он работает на уровне ядра, до HTTP. Обмануть его сложно, но можно.

- Изменяй TTL, window size, MSS под целевую ОС.

- Отключай или эмулируй TCP timestamp.

- Используй clamping MSS для туннелей.

- Не забывай про ISN — его сложнее всего подделать.

Помни: антифрод не блокирует по одному признаку. Он собирает статистику. Если твой прокси ведёт себя как сервер 24/7 — его вычислят.

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