Call the testers: AmneziaWG protocol

Всем привет!

Во время недавних блокировок OpenVPN и WireGuard команда Amnezia VPN задумалась над созданием собственного протокола, который сможет помочь пользователям обходить блокировки при этом сильно не снижая скорость (так как OpenVPN over Cloak, который мы рекомендовали к установке - скоростью не радовал по понятным причинам).

Представляем вам нашу реализацию протокола WireGuard - AmneziaWG.

AmneziaWG (AmneziaWireGuard) - это форк обычного WireGuard-Go с добавлением функций для обхода блокировок и снижения вероятности обнаружения протокола. Одной из ключевых особенностей AmneziaWG является обратная совместимость с WireGuard. Это означает, что при использовании AmneziaWG, если в конфигурации не указаны специфические параметры для обфускации протокола, он будет работать как стандартный WireGuard.

В чем особенность?

  • Перед началом сессии клиент отправляет несколько пакетов со случайными данными (количество таких пакетов Jc и их минимальный и максимальный размер в байтах Jmin, Jmax задается в конфиге)
  • Изменен заголовок пакета рукопожатия (Initiator to Responder), и ответного пакета (Responder to Initiator), эти значения также выставляются в конфиге (H1 и H2)
  • Инит-пакеты рукопожатия дополнительно имеют мусор в начале данных,
  • размеры определяются значениями S1 и S2. (по умолчанию инициирующий пакет рукопожатия имеет фиксированный размер (148 байт), после добавления мусора его размер будет равен 148 + длина случайных байтов).
  • Изменен заголовок пакетов с данными и специальных пакетов “Under Load” - H4 и H3 соответственно.

Ещё раз подробно о новых настраиваемых полях:

  1. Jc (Junk packet count) - количество пакетов со случайными данными, которые отправляются перед началом сессии
  2. Jmin (Junk packet minimum size) - минимальный размер пакета для Junk packet. То есть все рандомно генерируемые пакеты будут иметь размер не меньше чем Jmin
  3. Jmax (Junk packet maximum size) - максимальный размер для Junk пакетов
  4. S1 (Init packet junk size) - размер случайных данных, которые будут добавлены к init пакету, размер которого изначально фиксированный
  5. S2 (Response packet junk size) - размер случайных данных, которые будут добавлены к ответу, размер которого изначально фиксированный
  6. H1 (Init packet magic header) - заголовок первого байта рукопожатия
  7. H2 (Response packet magic header) - заголовок первого байта ответа на рукопожатие
  8. H4 (Transport packet magic header) - заголовок пакета передаваемых данных
  9. H3 (Underload packet magic header) - заголовок пакета UnderLoad

Как вы можете догадаться, заголовки H1, H2, H3, H4 должны быть разными. Если выставить Jc, S1 и S2 в нули, то и мусора не будет.

Протестировать данный протокол можно 2-мя способами:

  1. Установите Amnezia VPN на своем сервере, скачав клиент с официального сайта.
  2. Написать нам на почту с просьбой выдать конфиг для тестирования данного протокола (в заголовке письма требуется указать “Тестирвоание AmneziaWG - NTC.PARTY”).

Просим всех, кому интересно, протестировать данный протокол!

Любые отзывы по работающему/не работающему протоколу и производительности приветствуются! Вопросы тоже.

English

Hello everyone!

During the recent blocking of OpenVPN and WireGuard the Amnezia VPN team thought about creating their own protocol, which could help users to bypass the blocking without slowing down the speed (since OpenVPN over Cloak, which we recommended to install, was not very fast for obvious reasons).

Here is our implementation of the WireGuard protocol - AmneziaWG.

AmneziaWG (AmneziaWireGuard) is a fork of the WireGuard-Go with added features to bypass blocking and reduce the probability of protocol detection. One of the key features of AmneziaWG is backward compatibility with WireGuard. This means that when using AmneziaWG, unless specific parameters for protocol obfuscation are specified in the configuration, it will work like standard WireGuard.

What is the feature?

  • Before starting a session the client sends several packets with random data (the number of such packets Jc and their minimum and maximum size in bytes Jmin, Jmax is set in the config).
  • The header of handshake packet (Initiator to Responder) and response packet (Responder to Initiator) has been changed, these values are also set in config (H1 and H2).
  • Handshake init packets additionally have garbage at the beginning of the data, the sizes are determined by S1 and S2 values. (by default, the handshake init packet has a fixed size (148 bytes), after adding garbage its size will be 148 + size of random bytes).
  • The header of data packets and special “Under Load” packets has been changed - H4 and H3 respectively.

More details about new customizable fields:

  1. Jc (Junk packet count) - number of packets with random data that are sent before the start of the session
  2. Jmin (Junk packet minimum size) - minimum packet size for Junk packet. That is, all randomly generated packets will have a size no smaller than Jmin.
  3. Jmax (Junk packet maximum size) - maximum size for Junk packets
  4. S1 (Init packet junk size) - the size of random data that will be added to the init packet, the size of which is initially fixed.
  5. S2 (Response packet junk size) - the size of random data that will be added to the response packet, the size of which is initially fixed.
  6. H1 (Init packet magic header) - the header of the first byte of the handshake
  7. H2 (Response packet magic header) - header of the first byte of the handshake response
  8. H4 (Transport packet magic header) - header of the packet of the data packet
  9. H3 (Underload packet magic header) - UnderLoad packet header.

As you can guess, the H1, H2, H3, H4 headers must be different. If you set Jc, S1 and S2 to zero, there will be no garbage.

There are 2 ways to test this protocol:

  1. Install Amnezia VPN on your server by downloading the client from the official website.
  2. Write to us by e-mail with a request to issue a config for testing this protocol (in the header of the e-mail you should specify “Testing AmneziaWG - NTC.PARTY”).

We ask everyone who is interested to test this protocol!

Any feedback on working/not working protocol and performance is welcome! Questions too.

Linux kernel module ожидается ? Кощунство гонять tun на роутерах с openwrt и VPS

Планируем.
На данный момент находимся на стадии поиска исполнителя.

Будет поддержка других дистрибутивов, кроме ubuntu и debian ? На арч не устанавливается, internal error.
В логах сервера установка не идёт дальше COMMAND=/usr/bin/docker ps --format ‘{{.Names}} {{.Ports}}’

Что значит обратная совместимость WG, получается для вашей серверной части нужен свой клиент? или клиент WG дефолтный подойдет

Полагаю, что обратная совместимость достигается только в случае полного отключения всех дурилок DPI, что превращает софт в оригинальный WG. В таком виде его использование лишено смысла.
А в другом стандартные клиенты не подхватят. У WG очень все строго. Если что-то неправильно, такие пакеты молча отбрасываются

Спасибо огромное за репорт.
Расширить поддержку дистрибутивов для установки планируем, да.

С обычным WG сервером может работать конфигурация AmneziaWG в которой установлены Jc, Jmin, Jmax, а остальные поля нулевые. Таким образом клиент AWG будет просто посылать мусорные пакеты перед init пакетами, что абсолютно не влияет на работу протокола WG, но может сбить с толку DPI.

Какие молодцы. Очень правильное направление. Часто обсуждаемые сейчас обертки туннелей на основе TLS (Cloak и тп) в настоящий момент сильно избыточны и неизбежно ведут к драматичному снижению скорости, огромным задержкам из-за чего пользоваться ими невыносимо.

Огромная благодарность за мобильные клиенты.

Это слегка модифицированный wireguard-go. Легко скомпилировать самостоятельно и закинуть один файл в /usr/bin

В первом посте пропущен важный момент. Для того чтобы использовать в конфигах дополнительные параметры так же потребуется собрать модифицированную утилиту wg.

Эт конечно всё хорошо. Но как быть с мобильными клиентами?

Новая версия Amnezia VPN (4.0.8), которая как раз и поддерживает новый протокол, доступна для всех платформ - Windows, MacOS, iOS, Android и Linux (в PlayMarket его еще нет, так как он проходит review от Google, поэтому вы можете установить apk с GitHub).

Попробовал, установщик ставится в /usr/local/bin, /opt/AmneziaVPN, /usr/share/applications, служба systemd AmneziaVPN, без деинсталлятора. deb пакет был бы предпочтительней.

А можно какими-то плюс-минус рекомендованными параметрами всех этих Jc, S и H поделиться?

Сейчас собрал на двух машинках с Ubuntu (сюрприз, для сборки требует Go 1.20+, в Ubuntu 22.04 - 1.18, пришлось ещё Go ставить с офсайта свежайший), в конфиги накидал значений от балды, запустил, погонял iperf - падение скорости в пределах погрешности измерения. Но это просто тестовый сервер, который первый под руку попался, и мой ноут, между ними и так всего 30-35 Мбит/с (latency ~80 ms). Буду пробовать на более толстом канале.

Вообще, если это будет стабильно работать и при не блокироваться - это спасение, конечно. У меня по WG сейчас не только пользователи инсту смотрят, но сервера между собой данные перекидывают, иногда терабайтами за раз, так что скорость канала критична.

P.S. Ну что могу сказать, впечатлён! На скоростях поприличнее (550-600 Мбит/с без VPN, latency между серверами 40 ms) падение скорости в пределах 5% (ну т.е. опять погрешности измерения), использование CPU по время запуска iperf в пределах единиц процентов (и это на древнем Xeon E5645).

Собрал , установил amnezia-wg, amnezia-wg-tools. Добавил к конфиг интерфейса Jc = 10, интерфейс не поднимается, ругается на неверный параметр. Может как-то поподробнее расскажете , как установить корректно из гитхаба ?

будет ли клиент чистый без установщика? даже в новой бета версии он очень тяжелый для обычного юзера. Какая нибудь lite версия как outline ждущая конфига или ключа

спасибо, добрый человек !

К ссылке, которую выше скинули, добавлю, что адрес собственно интерфейса, который обычный WG берёт из конфига (Interface → Address), тут надо добавлять через ip address add X.X.X.X/XX dev wgX, и у меня после всего этого потребовалось ещё пнуть ip link set dev wgX up, чтобы запустился.

Ну а я пошёл собирать под Alpine на arm32, чтобы запихнуть на Микротик :slight_smile: Собрать-то собрал, но что-то пока не особо работает, буду разбираться.

Предполагаем что при текущих условиях Jc лучше брать в интервале [3,10], Jmin = 100, Jmax = 1000, S1,S2 в [50,500], и рандомные H1-H4 < uint_max