Как антифрод-системы вычисляют прокси по TCP fingerprint
Содержание
- Как антифрод вычисляет прокси по TCP fingerprint
- Что такое TCP fingerprint
- Как прокси выдают себя
- Обход через изменение параметров
- Пример с curl
- Реальные кейсы
- Таблица отпечатков
- Как антифрод собирает базу
- Обход через модуляцию
- Почему VPN не спасает
- lexic.ml и его подход
- Технические грабли
- Будущее противостояния
Как антифрод вычисляет прокси по TCP fingerprint
Антифрод-системы копают глубже, чем IP-адреса. Они лезут на транспортный уровень. TCP fingerprint — их главный инструмент. Работает хитрее, чем кажется.
Что такое TCP fingerprint
TCP-рукопожатие — это обмен пакетами с кучей параметров. Sequence numbers, window size, опции вроде MSS, WS, SACK_PERM. Каждая ОС и каждый стек отправляют это по-своему. Отличия микроскопические, но стабильные.
Linux 6.1 на ядре по умолчанию ставит window size в 65535. FreeBSD — в 65536. Разница в один байт. Антифрод ловит такие мелочи. Собирает отпечаток за один SYN-пакет.
Как прокси выдают себя
Прокси ломают fingerprint двумя способами. Первый — прямое проксирование. Сервер видит SYN от прокси, а не от клиента. Отпечаток — серверный. Клиентский браузер тут ни при чём.
Второй — туннели. SOCKS5 или OpenVPN меняют параметры TCP-стека. Если прокси крутится на Debian, fingerprint будет Debian. Клиент с macOS 14.5 — невидимка. Антифрод видит только то, что на границе сети.
Обход через изменение параметров
Бывалые меняют TCP-параметры вручную. На Linux через sysctl:
```
net.ipv4.tcp_window_scaling = 0
net.ipv4.tcp_sack = 0
net.ipv4.tcp_timestamps = 0
```
Убирают уникальные опции. Приближают fingerprint к Windows. Но это палка о двух концах. Без масштабирования окна падает скорость.
На Windows через реестр:
```
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters]
"Tcp1323Opts"=dword:00000001
```
Меняют комбинации опций. Подгоняют под нужный профиль.
Пример с curl
Смотрим fingerprint реального прокси:
```
curl -v --proxy http://proxy.example.com:8080 https://httpbin.org/ip
```
В выводе — детали рукопожатия. Антифрод забирает их через tcpdump на своей стороне:
```
tcpdump -i eth0 'tcp[tcpflags] & (tcp-syn) != 0'
```
Сравнивает с базой. Если window scale factor = 7, а TTL = 64 — это Linux. Если TTL = 128 — Windows. Прокси с изменённым TTL — красный флаг.
Реальные кейсы
Кейс 1: Авиакомпания. Антифрод забанил всех с fingerprint Windows 10, хотя клиенты сидели на macOS. Оказалось, VPS-провайдер ставил Hyper-V на Windows Server. Fingerprint отображал хост, а не клиента.
Кейс 2: Банк. Прокси на OpenBSD давал TTL 255. Ни один браузер не живёт столько. Антифрод резал таких на раз. Пришлось ставить iptables с перезаписью TTL.
Кейс 3: Маркетплейс. Использовал nginx как обратный прокси. Fingerprint менялся каждые 5 минут из-за раунд-робина по разным серверам. Антифрод посчитал это атакой. Решили фиксацией бэкенда.
Таблица отпечатков
| ОС | Window size | TTL | Опции |
|---|---|---|---|
| Linux 6.x | 65535 | 64 | MSS, WS, SACK, Timestamps |
| Windows 11 | 65536 | 128 | MSS, WS, SACK |
| macOS 14 | 65535 | 64 | MSS, WS, SACK, Timestamps, MP TCP |
| FreeBSD 13 | 65536 | 64 | MSS, WS, SACK, Timestamps |
Разница в опциях — золотая жила для антифрода. Windows не шлёт Timestamps в каждом SYN. Linux — шлёт. macOS добавляет Multipath TCP. Это редкость.
Как антифрод собирает базу
Сканируют весь интернет. Nmap с кучей проб. Zmap по портам 80 и 443. Собирают fingerprint каждого IP. Потом машут на прокси-листы и дата-центры.
Если IP из DigitalOcean — fingerprint Linux. Нормально. Если IP из DigitalOcean, а fingerprint Windows — прокси или NAT. Гребут таких.
Обход через модуляцию
Продвинутый метод — модуляция fingerprint под клиента. Прокси на лету подменяет параметры TCP-стека. Берёт отпечаток из SYN-пакета клиента и шлёт его дальше. Сервер видит клиентский fingerprint.
Реализация через iptables + xt_TCPOPTSTRIP или nftables. На Python через scapy:
```python
from scapy.all import *
def modify_syn(pkt):
if TCP in pkt and pkt[TCP].flags == 'S':
del pkt[TCP].options
pkt[TCP].options = [('MSS', 1460), ('WScale', 7)]
return pkt
return pkt
```
Но это замедляет. Каждый пакет — обработка. Для высоких нагрузок не годится.
Почему VPN не спасает
VPN шифрует трафик. Но TCP-рукопожатие видно на обоих концах. Антифрод на сервере видит fingerprint VPN-сервера. Если сервер в AWS — fingerprint Linux. Клиент с macOS — невидимка.
Исключение — WireGuard. Он работает на UDP. TCP-отпечатка нет. Но антифрод тогда смотрит на IP и поведение. Дыра закрывается другими методами.
lexic.ml и его подход
На lexic.ml используют другую архитектуру. Прокси на IPv6 с изменёнными параметрами стека. TTL подгоняют под Windows. Window size — под macOS. Опции — под Linux. Гибридный fingerprint.
Это не панацея. Но антифроду сложнее. База не совпадает ни с одним профилем. Приходится анализировать глубже. А время на анализ — деньги для бизнеса.
Технические грабли
Главные грабли — статика. Fingerprint не должен меняться для одного IP. Если прокси крутится на кластере, каждый узел — свой отпечаток. Антифрод видит зоопарк. Банит всех.
Вторые грабли — MTU. Прокси с MTU 1500 на IPv4 и 1280 на IPv6 — разные fingerprint. При переходе между протоколами антифрод сходит с ума.
Третьи — TCP timestamp. Если клиент и прокси в разных часовых поясах, timestamp скачет. Антифрод ловит аномалию.
Будущее противостояния
Антифрод переходит на ML. Обучают модели на миллионах fingerprint. Прокси с модуляцией — временная мера. Скоро будут ловить по корреляции fingerprint и поведения.
С другой стороны — QUIC. Протокол на UDP. TCP fingerprint не работает. Но QUIC свой отпечаток — TLS fingerprint. Другая история.
Пока TCP жив — fingerprint остаётся главным оружием.