Что такое AmneziaWG и зачем он нужен
AmneziaWG — это модифицированная версия протокола WireGuard, разработанная командой Amnezia для обхода систем глубокого анализа трафика (DPI). Первая версия появилась в 2023 году и позволяла скрывать факт использования VPN за счёт мусорных пакетов, изменения размеров handshake-пакетов и замены стандартных заголовков. Однако с тех пор DPI-системы стали значительно умнее: они научились распознавать не только обычный WireGuard, но и многие обфусцированные протоколы по статистическим паттернам, размерам пакетов и временным характеристикам.
AmneziaWG 2.0 — это ответ на эти вызовы. Вместо простой маскировки заголовков протокол теперь умеет полностью имитировать легитимный UDP-трафик, например DNS-запросы, QUIC-соединения или SIP-звонки. Это позволяет обходить даже продвинутые DPI, которые анализируют не только первые байты пакета, но и их поведение во времени.
Протокол доступен для самостоятельного развёртывания на собственном сервере (self-hosted). Для работы с AmneziaWG 2.0 требуется клиент AmneziaVPN версии 4.8.12.9 или выше на десктопе или Android. Пользователи бесплатной и премиум-версий пока используют AWG 1.5, но поддержка 2.0 будет добавлена позже.
Ключевые нововведения AmneziaWG 2.0
Версия 2.0 добавляет три основных механизма, которые в совокупности обеспечивают высокую степень мимикрии:
- Signature packets (i1–i5) — до пяти специальных пакетов, отправляемых перед каждым handshake. Они выглядят как начало легитимного протокола (DNS, QUIC, SIP и т.д.), что сбивает с толку DPI.
- Расширенный padding (S3 и S4) — в версии 1.0 padding применялся только к handshake-пакетам (S1, S2), которые происходят раз в две минуты. Основной трафик (data-пакеты) оставался с предсказуемыми размерами. В 2.0 добавлен padding для Cookie Reply (S3) и для каждого транспортного пакета (S4), что делает размеры всех пакетов случайными.
- Range-based заголовки (H1–H4) — вместо фиксированных значений заголовков теперь можно задавать диапазоны, из которых для каждого пакета выбирается случайное число. Это предотвращает запоминание DPI постоянных значений.
Эти механизмы работают вместе: перед handshake отправляются сигнатурные пакеты, затем мусорные пакеты, а сам handshake и все последующие data-пакеты получают случайные заголовки и padding.
Signature packets: как работает мимикрия под DNS, QUIC и SIP
Signature packets — это, пожалуй, самое значимое нововведение AmneziaWG 2.0. Идея проста: перед каждым настоящим WireGuard handshake клиент отправляет серверу до пяти пакетов, которые выглядят как начало обычного DNS-запроса, QUIC-соединения или любого другого протокола. DPI видит эти пакеты и думает, что трафик легитимный, поэтому пропускает его.
Технически каждый signature packet описывается на языке CPS (Custom Protocol Signature). CPS позволяет конструировать пакеты из тегов, каждый из которых добавляет определённый фрагмент данных. Например, тег ** вставляет фиксированные байты (магические байты протокола), ` — текущую временную метку, — N случайных байт, — N случайных букв/цифр, ` — N случайных цифр.
Пример сигнатуры для имитации QUIC:
i1 = **Здесь ** — начало QUIC Initial packet (тип 0xc7, версия 1), ` — 8 случайных символов для Connection ID, — временная метка, ` — 50 случайных байт payload. В результате пакет выглядит как начало QUIC-соединения, и DPI пропускает его.
Важно: signature packets отправляются только перед handshake, который происходит раз в две минуты. Если i1 не настроен, они не отправляются вовсе, что обеспечивает обратную совместимость с версией 1.0.
Расширенный padding: S3 и S4 для всех типов пакетов
В WireGuard каждый пакет имеет строго определённый размер: handshake initiation — 148 байт, handshake response — 92 байта, cookie reply — 64 байта, а транспортные пакеты — переменный, но кратный 16 байтам. Эти фиксированные размеры являются отличным индикатором для DPI.
AmneziaWG 1.0 позволял изменять размеры только handshake-пакетов через параметры S1 и S2. Но handshake происходит редко, а основной объём трафика — это data-пакеты, которые оставались предсказуемыми. Версия 2.0 добавляет два новых параметра:
- S3 — padding для Cookie Reply. Этот пакет отправляется сервером только при нагрузке (защита от DoS-атак) и имеет стандартный размер 64 байта. S3 добавляет к нему случайное количество байт, делая размер непредсказуемым.
- S4 — padding для всех транспортных пакетов. Это самый важный параметр, так как он применяется к каждому data-пакету, который несёт реальный интернет-трафик. S4 добавляет случайные байты к зашифрованным данным, что делает размеры пакетов случайными и затрудняет статистический анализ.
Пример конфигурации:
S1 = 68
S2 = 149
S3 = 32
S4 = 16Важно учитывать компромисс: чем больше padding, тем выше маскировка, но и больше накладные расходы на трафик. При больших значениях S4 пакеты могут превысить MTU, что приведёт к фрагментации и снижению скорости.
Range-based заголовки: почему фиксированные значения больше не работают
В WireGuard каждый пакет начинается с 4-байтового идентификатора типа: 1 — Handshake Initiation, 2 — Handshake Response, 3 — Cookie Reply, 4 — Transport Data. AmneziaWG 1.0 позволял заменить эти значения на свои через параметры H1–H4, но они были фиксированными для всех пакетов. DPI мог запомнить эти значения и снова заблокировать трафик.
В версии 2.0 заголовки можно задавать в виде диапазонов. Например:
H1 = 471800590-471800690
H4 = 1769581055-1869581055При отправке каждого пакета случайно выбирается значение из указанного диапазона, а при приёме принимается любое значение из диапазона. В результате каждый пакет имеет уникальный заголовок, что делает невозможным его идентификацию по постоянному признаку.
Критическое ограничение: диапазоны H1, H2, H3 и H4 не должны пересекаться. Иначе невозможно будет понять, какой тип пакета пришёл. Например, если H1 = 100-200, а H2 = 150-250, то пакет с заголовком 170 может быть интерпретирован и как handshake init, и как handshake response. Проверка пересечений выполняется автоматически, и при обнаружении конфликта конфигурация будет отклонена.
Порядок отправки пакетов в AmneziaWG 2.0
Чтобы понять, как все механизмы работают вместе, рассмотрим полный порядок отправки пакетов при установке соединения:
- Signature packets (i1–i5) — отправляются перед каждым handshake, если настроены. Они имитируют начало легитимного протокола.
- Junk packets — мусорные пакеты в количестве Jc, размером от Jmin до Jmax байт. Они отправляются всегда перед handshake и создают дополнительный шум.
- Handshake Initiation — пакет с padding S1 и случайным заголовком H1.
- Handshake Response — пакет с padding S2 и случайным заголовком H2.
- Cookie Reply — отправляется только при нагрузке на сервер, с padding S3 и заголовком H3.
- Transport Data — все последующие пакеты с padding S4 и заголовком H4.
Ключевые моменты:
- Signature packets отправляются только если настроены (i1 не пустой).
- Junk packets отправляются всегда перед handshake.
- S1/S2 применяются к handshake-пакетам, S3 — к cookie reply, S4 — к каждому data-пакету.
- H1–H4 с диапазонами генерируют уникальный заголовок для каждого пакета.
Такая последовательность создаёт впечатление, что клиент обменивается с сервером легитимным трафиком (например, DNS-запросами), а затем продолжает передавать данные в том же стиле.
Язык CPS: как создавать собственные сигнатуры
CPS (Custom Protocol Signature) — это специальный формат для описания signature packets. Он позволяет конструировать пакеты из тегов, каждый из которых добавляет определённый фрагмент данных. Всего в userspace-движке amneziawg-go доступно 8 тегов:
**— вставляет фиксированные байты (hex-строка, чётное число цифр).- `` — добавляет 4 байта текущего Unix-времени (big-endian).
- `` — добавляет N криптографически случайных байт.
- `` — добавляет N случайных букв/цифр (a-zA-Z).
- `` — добавляет N случайных цифр (0-9).
- `` — вставляет копию входных данных (pass-through).
- `` — вставляет Base64-кодированные входные данные (без padding).
- `` — вставляет N байт, содержащих длину входных данных в big-endian.
Теги `, , не документированы и поддерживаются только в userspace-движке. Модуль ядра Linux поддерживает только , , , , и дополнительный тег (счётчик пакетов). Поэтому при создании сигнатур для кросс-платформенной совместимости рекомендуется использовать только пересечение: , , , , `.
Пример сигнатуры для имитации DNS:
i1 = **Здесь ** — заголовок DNS-запроса, ` — временная метка, ` — 15 случайных байт. DPI видит начало DNS-запроса и пропускает трафик.
Как развернуть собственный VPN с AmneziaWG 2.0
Для развёртывания VPN с AmneziaWG 2.0 на собственном сервере необходимо выполнить несколько шагов:
- Скачайте или обновите приложение AmneziaVPN до версии 4.8.12.9 или выше. Это можно сделать со страницы загрузки или зеркала.
- Установите протокол AmneziaWG 2.0 на сервере. Для этого в приложении выберите опцию установки нового протокола. Дополнительная настройка не требуется — все параметры будут сгенерированы автоматически.
- Подключитесь к серверу с любого устройства, поддерживающего AmneziaVPN (десктоп, Android).
Важно отметить, что AmneziaWG 2.0 поддерживается только для self-hosted установок. Пользователи Free и Premium версий пока используют AWG 1.5, но поддержка 2.0 будет добавлена позже.
При установке протокола вы можете настроить параметры обфускации: signature packets (i1–i5), padding (S1–S4), заголовки (H1–H4) и мусорные пакеты (Jc, Jmin, Jmax). Для большинства пользователей достаточно стандартных настроек, но опытные администраторы могут создать собственные сигнатуры для имитации конкретных протоколов.
Репозиторий протокола доступен на GitHub, что позволяет изучить исходный код и внести свои изменения.
Ограничения и совместимость
AmneziaWG 2.0 имеет несколько важных ограничений, которые стоит учитывать:
- Совместимость с ядром Linux: userspace-движок amneziawg-go поддерживает все 8 тегов CPS, но модуль ядра Linux поддерживает только 6 (включая недокументированный `
). Если на хосте установлен модуль ядра, конфигурация с тегами,,` будет отклонена. Поэтому для кросс-платформенных конфигураций используйте только общие теги.
- Пересечение диапазонов H1–H4: диапазоны заголовков не должны пересекаться, иначе протокол не сможет определить тип пакета. Проверка выполняется автоматически, но при ручной настройке будьте внимательны.
- Валидация Jmin и Jmax: в коде нет перекрёстной проверки Jmin <= Jmax. Если задать Jmin > Jmax, поведение будет непредсказуемым. Рекомендуется использовать Jc в диапазоне 4–12.
- Padding и MTU: при больших значениях S4 пакеты могут превысить MTU, что приведёт к фрагментации и снижению производительности. Следует выбирать разумные значения, например 16–32 байта.
- Обратная совместимость: если не настраивать H1–H4, протокол полностью совместим с обычным WireGuard. Это позволяет использовать AmneziaWG 2.0 в сетях, где DPI не блокирует WireGuard, без дополнительной настройки.
Практические рекомендации по настройке
При настройке AmneziaWG 2.0 важно найти баланс между маскировкой и производительностью. Вот несколько рекомендаций:
- Начните с готовых сигнатур: используйте примеры из документации для имитации DNS, QUIC или SIP. Это проще, чем создавать свои с нуля.
- Настройте S4 умеренно: значение 16–32 байта достаточно для изменения размеров пакетов без значительного увеличения трафика. Слишком большие значения могут вызвать фрагментацию.
- Используйте диапазоны H1–H4: даже небольшой диапазон (например, 100 значений) делает заголовки непредсказуемыми. Убедитесь, что диапазоны не пересекаются.
- Тестируйте на разных сетях: эффективность обфускации зависит от конкретного DPI. Проверьте работу VPN в разных условиях (домашний интернет, мобильная сеть, общественный Wi-Fi).
- Следите за обновлениями: команда Amnezia активно развивает протокол. Регулярно обновляйте клиент и следите за новыми версиями.
Если вы используете AmneziaWG 2.0 на сервере с модулем ядра, помните о различиях в поддержке тегов CPS. Для максимальной совместимости используйте только **, `, , , `.
Вопросы и ответы
Чем AmneziaWG 2.0 отличается от версии 1.0?
AmneziaWG 2.0 добавляет три ключевых улучшения: signature packets (i1–i5) для имитации легитимных протоколов, расширенный padding для всех типов пакетов (S3 для Cookie Reply и S4 для Transport Data) и range-based заголовки (H1–H4), которые генерируют случайные значения для каждого пакета. В версии 1.0 были только мусорные пакеты, padding для handshake и фиксированные заголовки.
Как настроить AmneziaWG 2.0 на своём сервере?
Для этого нужно скачать или обновить приложение AmneziaVPN до версии 4.8.12.9 или выше, затем установить протокол AmneziaWG 2.0 на сервере. Дополнительная настройка не требуется — все параметры генерируются автоматически. Вы можете вручную настроить signature packets, padding и заголовки, если хотите имитировать конкретный протокол.
Что такое CPS и как создать свою сигнатуру?
CPS (Custom Protocol Signature) — это язык для описания signature packets. Он состоит из тегов, например ** для фиксированных байт, ` для временной метки, для случайных байт, для случайных букв/цифр, для случайных цифр. Чтобы создать сигнатуру, скомбинируйте теги в цепочку, например: i1 = **` для имитации QUIC.
Какие ограничения у AmneziaWG 2.0?
Основные ограничения: диапазоны H1–H4 не должны пересекаться; модуль ядра Linux поддерживает не все теги CPS (только b, t, r, rc, rd и c); при больших значениях S4 возможна фрагментация пакетов; Jmin и Jmax не проверяются на корректность. Также AmneziaWG 2.0 пока доступен только для self-hosted установок.
Поддерживает ли AmneziaWG 2.0 обычный WireGuard?
Да, если не настраивать H1–H4, протокол полностью совместим с обычным WireGuard. Это позволяет использовать AmneziaWG 2.0 в сетях без DPI-блокировок без дополнительной настройки.
Какие протоколы можно имитировать с помощью signature packets?
С помощью CPS можно имитировать любой UDP-протокол, если вы знаете его структуру. В документации приведены примеры для DNS, QUIC и SIP. Вы также можете создать собственную сигнатуру, используя теги CPS.
Влияет ли padding на скорость соединения?
Да, padding увеличивает объём передаваемых данных, что может незначительно снизить скорость. Однако при разумных значениях (например, S4 = 16–32 байта) влияние минимально. Слишком большие значения могут вызвать фрагментацию пакетов и более заметное снижение производительности.