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

Как работает маскировка TCP/IP стека для обхода DPI и антифрод-систем

Как работает маскировка TCP/IP стека для обхода DPI и антифрод-систем

TCP/IP стек: почему его видно за километр

Стандартный TCP/IP стек — как открытая книга. Каждая ОС оставляет цифровые отпечатки. Linux, Windows, macOS — у каждого свои quirks. DPI системы эти отпечатки читают.

TTL, window size, MSS, опции TCP — всё это собирается в fingerprint. Утилиты типа p0f, Nmap, Zeek определяют ОС с точностью до патча. Для антифрода это база — если трафик не совпадает с ожидаемым профилем, пакет летит в бан.

Проблема прокси: трафик клиента проходит через сервер. Сервер под Linux. DPI видит: клиент из Windows, но TTL и window scaling от Linux. Несостыковка — блокировка. Даже если IP чистый, fingerprint сдаёт с потрохами.

DPI: что именно они смотрят

Глубокий анализ пакетов — не метафора. DPI заглядывает внутрь. Не только заголовки, но и payload, последовательность флагов, тайминги.

Основные параметры для fingerprinting:

- Initial TTL (обычно 64, 128, 255)

- TCP Window Size (вариативен)

- TCP Options order и значения (MSS, WS, SACK, Timestamps)

- IP ID pattern (инкремент, случайный, ноль)

- DF flag поведение

Каждая комбинация — как ДНК. Изменить один параметр — система заподозрит неладное. Изменить все — нужно знать, как именно.

Маскировка: меняем цифровой отпечаток

Маскировка TCP/IP стека — подмена параметров на лету. Пакет идёт от клиента, но на уровне ядра или прокси модифицируется. Выглядит как родной для целевой системы.

Техники:

- **TTL нормализация**: подгоняем под ОС назначения. Если идём на Windows сервер — TTL 128.

- **Window size клонирование**: копируем типичное значение для нужной ОС.

- **TCP options реордеринг**: ставим в правильный порядок. Linux любит MSS первым, Windows — WS.

- **IP ID фиксация**: отключаем инкремент, ставим случайное или ноль.

Реализация — через iptables + xtables-addons, nftables с custom chains, или на уровне приложения. Пример с iptables:

```bash

iptables -t mangle -A POSTROUTING -j TTL --ttl-set 128

iptables -t mangle -A POSTROUTING -j TCPMSS --set-mss 1460

```

Но это топорная работа. Для точной эмуляции нужно больше.

Эмуляция Windows через Linux

Кейс: клиент с Windows, прокси на Linux, целевой сервер ждёт Windows fingerprint. Проблема — дефолтный Linux стек не похож на Windows.

Решаем через стратегическую подмену параметров. Берём типичный Windows 10 fingerprint:

- TTL: 128

- Window size: 65535 (с масштабированием)

- MSS: 1460

- Опции: WS, NOP, MSS, SACK, Timestamps

Настраиваем через nftables:

```bash

nft add rule ip mangle POSTROUTING tcp dport 80 ip ttl set 128

nft add rule ip mangle POSTROUTING tcp dport 80 tcp option maxseg size set 1460

```

Но window size сложнее. Тут нужна модификация на уровне ядра или использование готовых решений. Например, **netmap** или **DPDK** для полного контроля над пакетами.

Python-костыль для тестов

Для быстрой проверки — скрипт на scapy. Меняем параметры вручную:

```python

from scapy.all import *

import random

def mask_packet(pkt):

if TCP in pkt:

Меняем TTL

pkt[IP].ttl = 128

Меняем window size

pkt[TCP].window = 65535

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

if pkt[TCP].options:

opts = [opt for opt in pkt[TCP].options if opt[0] in ['MSS', 'NOP', 'WScale', 'SAckOK']]

pkt[TCP].options = opts

Пересчитываем контрольные суммы

del pkt[IP].chksum

del pkt[TCP].chksum

return pkt

Перехват и модификация

sniff(filter="tcp", prn=mask_packet, store=0)

```

Не для продакшена. Но для понимания механизма — норм. Scapy тормозит, на высоких нагрузках не взлетит.

Антифрод-системы: что они ловят

Антифрод не только fingerprint смотрит. Ещё:

- **Временные паттерны**: RTT, межпакетные интервалы. Прокси добавляет задержку — это видно.

- **Sequence numbers**: предсказуемость. Linux использует привязанные к таймеру, Windows — более случайные.

- **ACK handling**: разные ОС по-разному обрабатывают дубликаты ACK.

Для обхода — эмуляция не только статики, но и динамики. Тут уже нужен полноценный стек, а не подмена заголовков.

Решения для продакшена

Готовые инструменты:

- **Mullvad VPN** — использует модифицированный OpenVPN с маскировкой стека.

- **Suricata** — может эмулировать разные профили.

- **Custom kernel modules** — для полного контроля.

На **lexic.ml** используют гибридный подход: часть параметров меняется на уровне прокси, часть — через туннельные протоколы. UDP инкапсуляция скрывает TCP fingerprint полностью.

Пример конфига для nftables с маскировкой:

```bash

table ip mangle {

chain PREROUTING {

type filter hook prerouting priority -150;

tcp dport 80,443 ip ttl set 128

tcp dport 80,443 tcp option maxseg size set 1460

tcp dport 80,443 tcp option window scale set 8

}

}

```

Сравнение подходов

| Метод | Сложность | Эффективность | Производительность |

|-------|-----------|---------------|-------------------|

| iptables TTL+MSS | Низкая | Низкая | Высокая |

| nftables + опции | Средняя | Средняя | Высокая |

| Scapy | Высокая | Высокая | Низкая |

| Kernel module | Очень высокая | Очень высокая | Средняя |

| DPDK/netmap | Экспертная | Максимальная | Максимальная |

Реальные грабли

Первая попытка: подменил TTL и window size. DPI всё равно забанил. Оказалось, проблема в IP ID — Linux использует инкремент, Windows — случайный. Пакеты с инкрементом на Windows-сервере — красный флаг.

Вторая: забыл про опцию Timestamps. Linux её шлёт всегда, Windows — нет. DPI увидел таймстампы от "Windows" и заблокировал.

Третья: переборщил с маскировкой. Сделал TTL 128, но пакеты шли через несколько hop'ов. Реальный TTL на выходе — 121. DPI посчитал аномалией.

Вывод: маскировка должна быть комплексной. Менять всё, учитывать сетевую топологию. И тестировать на реальных DPI.

Будущее: эмуляция полного стека

Тренд — не подмена параметров, а полная эмуляция стека целевой ОС. Проекты вроде **OpenVPN with TCP fingerprint obfuscation** или **Proxifier** с кастомными профилями.

Идея: виртуальный TCP/IP стек, который ведёт себя как Windows, но работает на Linux. Каждый пакет — точная копия ожидаемого поведения. Вплоть до таймингов retransmission.

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

Итог: что делать

Маскировка TCP/IP стека — не панацея. Но базовый уровень защиты даёт. Если DPI смотрит только fingerprint — шанс обойти высокий. Если антифрод копает глубже — нужна комплексная стратегия.

Старт:

1. Определить target fingerprint (через p0f или Wireshark).

2. Настроить подмену через nftables/iptables.

3. Проверить на тестовом DPI (Suricata в режиме IDS).

4. Добавить UDP инкапсуляцию для сложных случаев.

И помнить: идеальной маскировки нет. Всегда есть риск, что DPI обновит сигнатуры.

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