Как работает маскировка TCP/IP стека для обхода DPI и антифрод-систем
Содержание
- TCP/IP стек: почему его видно за километр
- DPI: что именно они смотрят
- Маскировка: меняем цифровой отпечаток
- Эмуляция Windows через Linux
- Python-костыль для тестов
- Меняем TTL
- Меняем window size
- Убираем лишние опции
- Пересчитываем контрольные суммы
- Перехват и модификация
- Антифрод-системы: что они ловят
- Решения для продакшена
- Сравнение подходов
- Реальные грабли
- Будущее: эмуляция полного стека
- Итог: что делать
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 обновит сигнатуры.