Как антифрод-системы вычисляют прокси по TCP/IP-стеку (TCP fingerprint) и как это обойти
Содержание
- Как антифрод-системы вычисляют прокси по TCP/IP-стеку
- Как выглядит TCP-рукопожатие глазами антифрода
- Почему прокси-серверы светятся
- Реальный пример: как p0f видит прокси
- Как антифрод собирает статистику по отпечаткам
- Что можно сделать: обход через модификацию TCP-стека
- Изменяем TTL на 128 (как у Windows)
- Меняем начальное окно
- Отключаем window scaling для совместимости
- Меняем TTL
- Меняем window size
- Убираем лишние опции
- Добавляем стандартные для Windows
- Кейс: банк блокирует прокси по fingerprint
- Кейс: CDN блокирует по TCP timestamp
- Кейс: антифрод вычисляет прокси по MSS
- Что реально работает: комбинация методов
- Технический итог
Как антифрод-системы вычисляют прокси по 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 — его вычислят.