Перейти к основному содержимому

AmneziaWG

AmneziaWG — это форк WireGuard-Go, который унаследовал простоту архитектуры и высокую производительность оригинала, но избавился от характерных сетевых «подписей», благодаря которым WireGuard легко определяется системами DPI (Deep Packet Inspection). 

Версия 1.5 вывела маскировку на новый уровень: трафик стал маскироваться под наиболее распространённые UDP‑протоколы (QUIC, DNS и др.).

Версия 2.0 развивает этот подход до «мимикрии»: трафик становится ещё менее узнаваемым для DPI не только в момент подключения, но и во время передачи данных за счёт постоянно меняющихся заголовков и размеров пакетов данных. В результате снижается вероятность распознавания VPN-трафика по характерным признакам и усложняется его эвристический анализ.

Версия 3.1 появилась как ответ на массовые блокировки в России в июне и июле 2026 года, которые показали, что одной маскировки отдельных признаков трафика уже недостаточно. В новой версии мы усложнили статистический анализ соединения: меняются размеры, последовательность и интервалы между пакетами, а также часть служебных данных. Это делает поведение разных сессий менее повторяемым и снижает вероятность распознавания протокола AmneziaWG по совокупности признаков.

Прародитель AmneziaWG — WireGuard зарекомендовал себя как быстрый и надежный VPN-протокол благодаря компактному коду и высокой эффективности. Однако его фиксированные заголовки пакетов и предсказуемые размеры образуют легко узнаваемую сигнатуру. DPI‑системы без труда идентифицируют такие пакеты и могут мгновенно разрывать соединение — серьёзная проблема в странах с интернет-цензурой.

AmneziaWG 1.5 решал эту проблему через многоуровневую обфускацию на транспортном уровне: модифицировал заголовки пакетов, рандомизировал размеры handshake-сообщений и позволял маскировать трафик под популярные UDP‑протоколы.

AmneziaWG 2.0 ещё больше усиливает обфускацию: использует динамические диапазоны для заголовков вместо статических, добавляет случайные байты информации к специальным Wireguard-пакетам, а также расширяет сигнатурные CPS-пакеты перед рукопожатием, чтобы ещё более правдоподобно имитировать UDP-протоколы. При этом базовое криптографическое ядро WireGuard остается неизменным, сохраняя его производительность и безопасность.

AmneziaWG 3.1 защищает трафик от детекции не только по отдельным заголовкам или размерам пакетов, но и по поведению соединения: новые механизмы скрывают часть служебных данных, добавляют случайный паддинг к содержимому, меняют тайминги служебных событий и уменьшают повторяемость packet flow. Также эта версия снижает узнаваемость cookie-поведения WireGuard, которое может использоваться при активном зондировании как дополнительный fingerprint. Это усложняет распознавание протокола DPI-системами и поведенческим анализом, но сохраняет криптографическое ядро WireGuard без изменений.


Ключевые преимущества

  • Невидимость для DPI — динамические заголовки из заданных диапазонов и рандомизация размеров всех пакетов.
  • Маскировка протоколов — имитация QUIC, DNS, SIP и других UDP-протоколов.
  • Высокая производительность — работает как модуль ядра Linux, а шифрование использует однопроходный AEAD-алгоритм ChaCha20‑Poly1305 с SIMD‑оптимизацией, что и у WireGuard.
  • Энергоэффективность — код на Go исполняется в пользовательском пространстве без тяжёлых шифров, то есть подходит для мобильных устройств и роутеров.
  • Кроссплатформенность — поддержка всех основных операционных систем.
  • UDP‑транспорт — весь трафик передаётся поверх UDP, что упрощает обход блокировок и снижает задержку.
  • Простота настроек — достаточно указать сигнатуру маскировочного протокола; остальные параметры заполняются автоматически.
  • Обратная совместимость — при отключенных параметрах маскировки конфигурация AmneziaWG полностью совместима с WireGuard.

Как это работает

Ниже описаны основные механизмы, за счёт которых AmneziaWG 3.1 меняет характерные признаки WireGuard-трафика и делает его менее узнаваемым для DPI.

  1. Динамические заголовки всех типов пакетов (H1-H4)

    При инициализации туннеля библиотека генерирует набор случайных значений из заданных диапазонов, которые применяются к каждому из четырёх форматов пакета WireGuard: Init, Response, Cookie и Data. Эти значения:

    • подставляются вместо предсказуемых идентификаторов пакетов WireGuard;
    • сдвигают офсеты полей Version/Type;
    • изменяют зарезервированные биты.

    При отправке каждого пакета из диапазона выбирается случайное значение; при приёме допускается любое значение из диапазона. Это делает заголовок непредсказуемым даже для одного и того же типа пакета.

    Важно: диапазоны H1-H4 не должны пересекаться между собой.

    Таким образом, у двух разных клиентов не бывает совпадающих заголовков — универсальное DPI‑правило написать невозможно.

  2. Рандомизация длины пакетов (S1-S4)

    В WireGuard пакет Init занимает ровно 148 байт, Response — 92 байта, Cookie — 64 байта, Data — переменный размер (payload). AmneziaWG добавляет к ним псевдослучайные префиксы S1, S2, S3 и S4 (от 0 до 32/64 байт):

    len(init) = 148 + S1
    len(resp) = 92 + S2
    len(cookie) = 64 + S3
    len(data) = payload + S4

    Эти префиксы скрывают стандартные размеры WireGuard-сообщений и сдвигают служебные поля глубже внутрь пакета.

  3. Маскировочные пакеты I1-I5 (Signature Chain) и CPS (Custom Protocol Signature)

    Перед рукопожатием (каждые 120 секунд) клиент может послать до пяти разных UDP‑пакетов, полностью описанных пользователем в формате CPS. Главный элемент — I1 — содержит hex‑снимок реального протокола (например, QUIC Initial handshake), который также можно рандомизировать. Остальные I2-I5 наращивают энтропию за счёт счётчика, метки времени и случайных данных.

    Данный формат мы назвали CPS — Custom Protocol Signature:

    i{n} = <tag1><tag2><tag3>...<tagN>

    Типы тегов

    ТегФорматОписаниеОграниченияПример
    b<b hex_data>Статические байты для имитации протоколовПроизвольная длина<b 0xf6ab3267fa>
    t<t>Unix timestamp (32-bit, network byte order)Уникален в рамках последовательностиUnix time
    r<r length>Криптостойкие случайные байтыlength ≤ 1000<r 20>
    rc<rc N>Случайные ASCII-буквы [A-Za-z] — для имитации текстовых протоколовN ≤ 1000<rc 10> → "aBcDeFgHiJ"
    rd<rd N>Случайные десятичные цифры [0-9] — для имитации числовых полейN ≤ 1000<rd 5> → "13654"

    Пример CPS-пакета:

    i1 = <b 0xd100000001><rc 8><t><r 50>

    Пример выше лишь демонстрирует синтаксис CPS в качестве примера и не является примером сигнатуры. Не используйте его в роли значения параметров I1-I5.

    Пакеты I1-I5 отправляются независимо, по порядку от I1 до I5. Для каждого заданного параметра отправляется соответствующий пакет. Если один из параметров отсутствует, остальные заданные пакеты всё равно отправляются. Если не задан ни один из параметров I1-I5, CPS-пакеты не отправляются.

  4. Junk‑train (Jc)

    Сразу после цепочки I‑пакетов отправляется Jc псевдослучайных пакетов длиной от Jmin до Jmax. Они размывают начало сессии во времени и по габаритам, ещё сильнее затрудняя определение рукопожатия.

  5. Header Protection

    В AmneziaWG 3.1 появился механизм Header Protection. Он дополнительно скрывает незашифрованные служебные части WireGuard-пакетов, которые могут использоваться как статические признаки протокола.

    Для обфускации используется ChaCha20. Nonce берётся из первых 12 байт соответствующего префикса S1-S4, а ключ задаётся параметром HeaderProtectionKey.

    Обратите внимание: при использовании Header Protection рекомендуется оставлять H1-H4 в стандартных значениях совместимости: H1 = 1, H2 = 2, H3 = 3, H4 = 4. В этом режиме механизм пользовательских заголовков отключается, а скрытие типа сообщения выполняет Header Protection.

    Header Protection применяется к следующим частям пакетов после Sx:

    Init     — 148 байт
    Response — 92 байта
    Cookie — 64 байта
    Data — 16 байт

    Для работы Header Protection значения S1-S4 должны быть не меньше 12 байт, а HeaderProtectionKey должен быть задан.

  6. Content Padding

    WireGuard дополняет транспортные данные до размера, кратного 16 байтам. Такой повторяющийся паттерн может использоваться при статистическом анализе.

    Параметр ContentPaddingAddition добавляет к transport-пакетам случайное количество байтов в заданном диапазоне. Дополнение использует свободное место до внутреннего MTU и не превышает его.

  7. Настраиваемые тайминги

    WireGuard использует фиксированные интервалы для повторного handshake, keepalive, timeout и повторных попыток установки соединения. В AmneziaWG 3.1 эти значения можно задавать диапазонами.

    Когда протоколу нужно выставить один из таких таймеров, выбирается случайное значение из заданного диапазона. Это делает поведение разных сессий менее повторяемым во времени.

  8. Random Trailers

    Даже при использовании S1-S4 последовательности пакетов могут оставаться похожими по размеру. Например, связка Handshake Initiation + Handshake Response может повторяться достаточно стабильно.

    RandomTrailers добавляет случайное количество байтов в конец пакетов. Для handshake-пакетов добавляются случайные данные, а для transport-пакетов — нули в конец внутреннего IP-пакета.

    Размер trailer выбирается с учётом текущего UDP-окна, которое изменяется в процессе обмена данными между сторонами, предотвращая нарушение MTU обоих.

    При использовании RandomTrailers рекомендуется задавать одинаковые значения для S1, S2, S3 и S4. Так снижается риск неправильного определения типа пакета. Это связано с тем, что пакеты имеют случайный размер и могут быть интерпретированы неверно.

  9. Отключение Cookie Reply

    В WireGuard механизм Cookie Reply используется для защиты от DoS-атак: вместо обычного Handshake Response принимающая сторона может отправить специальное Handshake Cookie Reply-сообщение.

    В обычных условиях этот механизм работает хорошо, но в средах с цензурой cookie-поведение может использоваться при активном зондировании и становиться отдельным fingerprint протокола.

    Параметр DisableCookies отключает только отправку Handshake Cookie Reply-сообщений. При этом обработка входящих cookie-сообщений и остальные cookie-related механизмы работают так же, как в оригинальной реализации WireGuard.


Параметры конфигурации

range<uint16> и range<uint32> — это диапазоны числовых значений. Их можно указать как a-b или как одно фиксированное значение a. uint16 принимает значения от 0 до 65 535, uint32 — от 0 до 4 294 967 295.

ПараметрТип / значениеНазначение
I1-I5CPS-descriptionМаскировочные пакеты перед handshake
S1-S4uint16Случайные префиксы для Init, Response, Cookie и Data
Jcuint16Количество junk-пакетов
Jmin, Jmaxuint16Минимальный и максимальный размер junk-пакетов
H1-H4range<uint32>Пользовательские идентификаторы типов сообщений
HeaderProtectionKey32-байтный ключКлюч для Header Protection
ContentPaddingAdditionrange<uint16>Случайное дополнение transport payload
RekeyAfterTimerange<uint16>Интервал до повторного handshake
RekeyTimeoutrange<uint16>Таймаут ожидания handshake
RejectAfterTimerange<uint16>Интервал, после которого соединение инициирует новый handshake при отсутствии данных
KeepaliveTimeoutrange<uint16>Интервал до отправки keepalive
MaxHandshakeAttemptsrange<uint16>Максимальное количество повторов handshake
RandomTrailerson / offДобавление случайных окончаний пакетов
DisableCookieson / offОтключение отправки Cookie Reply

Если значение механизма равно 0, off или диапазону 0-0, механизм отключается и используется стандартное поведение WireGuard.

Для H1-H4 действует отдельное правило совместимости:

  • H1 отключён при значении 1
  • H2 отключён при значении 2
  • H3 отключён при значении 3
  • H4 отключён при значении 4

Безопасность

AmneziaWG 3.1 не меняет криптографическое ядро WireGuard. Обмен ключами, шифрование пользовательских данных и базовая модель безопасности остаются такими же, как в WireGuard: Noise_IK, Curve25519 и AEAD ChaCha20-Poly1305.

Новые механизмы AmneziaWG работают на уровне обфускации транспорта. Они скрывают или изменяют внешние признаки соединения: типы сообщений, размеры пакетов, служебные последовательности и тайминги. Это помогает усложнить распознавание протокола DPI-системами, но не заменяет основное шифрование WireGuard.

Header Protection использует ChaCha20 для дополнительного скрытия служебных частей пакета. Этот механизм нужен не для защиты пользовательского payload, а для уменьшения количества стабильных признаков, по которым можно определить протокол.

Поскольку криптографическая основа WireGuard остаётся неизменной, к AmneziaWG применимы существующие анализы безопасности WireGuard. Новые параметры следует рассматривать как механизмы маскировки и устойчивости к DPI, а не как отдельную криптографическую схему.


Дополнительные ресурсы

Нативные клиенты AmneziaWG

Файлы конфигурации AmneziaWG можно использовать и в специализированных клиентах, если клиент поддерживает версию протокола, для которой выпущен файл:

Обращайтесь в чат за помощью, если что-то не получается