MAATRIX / Блог / AmneziaWG (обфусцированный WireGuard): установка

AmneziaWG (обфусцированный WireGuard): установка

MAATRIX

Если WireGuard на вашем сервере уже опознают и режут по DPI, а ставить громоздкое приложение Amnezia не хочется — можно поднять протокол AmneziaWG напрямую: тем же способом, что и обычный WireGuard, только с другими бинарниками и парой строк в конфиге. Ниже — установка ядра/модуля и утилит AmneziaWG отдельно от GUI, и честный разбор, чем этот протокол отличается от ванильного WireGuard на уровне пакетов.

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

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →

Чем AmneziaWG отличается от WireGuard на уровне протокола

Внешне AmneziaWG — тот же WireGuard: тот же Noise-хендшейк, та же криптография (Curve25519, ChaCha20-Poly1305, BLAKE2s), тот же формат [Interface]/[Peer] в конфиге. Меняется не безопасность, а «форма» пакетов на проводе — то, по чему DPI отличает WireGuard от прочего UDP-трафика.

У ванильного WireGuard первый байт каждого пакета — фиксированный тип сообщения (1 — initiation, 2 — response, 3 — cookie reply, 4 — данные), а пакеты хендшейка имеют строго определённую длину. Для DPI это готовая сигнатура: не нужно расшифровывать содержимое, достаточно увидеть характерную структуру на первых байтах UDP-пакета. Именно так системы глубокого анализа трафика в разных странах научились опознавать и глушить WireGuard, даже не вскрывая шифрование.

AmneziaWG убирает эту сигнатуру, не оборачивая трафик в другой протокол (как делают XRay или Shadowsocks, маскируясь под HTTPS), а меняя саму раскладку WireGuard-пакетов:

  • Jc — сколько «мусорных» UDP-пакетов отправляется перед реальным хендшейком;
  • Jmin/Jmax — диапазон размера этого мусора в байтах;
  • S1/S2 — сколько случайных байт довешивается к initiation- и response-пакетам хендшейка, чтобы убрать фиксированную длину;
  • H1–H4 — замена тех самых констант 1–4 на произвольные числа, одинаковые у сервера и клиента.

Криптографическое ядро протокола не меняется — значит, и уровень защищённости данных остаётся тем же, что у обычного WireGuard, а накладные расходы на обфускацию минимальны по сравнению с оборачиванием в TLS-туннель. Это не серебряная пуля: если все возьмут значения из примера в документации, набор из «стандартного мусора» сам станет новой сигнатурой. Смысл в том, чтобы параметры были свои на каждом сервере, и в том, что DPI-эвристики со временем тоже меняются — гарантии «навсегда» тут никто не даёт.

Что понадобится перед установкой

Подойдёт чистый VPS с Ubuntu 22.04/24.04 или Debian 12, root-доступ по SSH и актуальное ядро с установленными заголовками. Два пути установки:

  • Модуль ядра (DKMS) — тот же принцип, что у штатного WireGuard: шифрование выполняется в ядре, накладные расходы минимальны. Требует заголовки ядра и пересборку модуля при обновлении ядра — DKMS делает это автоматически.
  • Userspace-реализация amneziawg-go — аналог wireguard-go: работает без сборки модуля, годится для контейнеров, урезанных или нестандартных ядер, где DKMS не соберётся. Нагрузка на CPU выше, поскольку шифрование идёт не в ядре, а в обычном процессе.

Для личного туннеля разница в производительности едва ли будет заметна на глаз, поэтому начните с модуля ядра, а на userspace-вариант переходите только если сборка не задалась.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Установка ядра/модуля AmneziaWG (DKMS)

Ставим инструменты сборки и заголовки под текущее ядро:

apt update
apt install -y build-essential dkms git linux-headers-$(uname -r)

Клонируем исходники модуля с GitHub и собираем через DKMS:

git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git
cd amneziawg-linux-kernel-module

VERSION=$(grep -m1 PACKAGE_VERSION dkms.conf | cut -d'"' -f2)
mkdir -p /usr/src/amneziawg-$VERSION
cp -r . /usr/src/amneziawg-$VERSION

dkms add -m amneziawg -v $VERSION
dkms build -m amneziawg -v $VERSION
dkms install -m amneziawg -v $VERSION

modprobe amneziawg

Точные имена make-целей и структура dkms.conf иногда меняются между релизами проекта — если что-то из команд выше не совпадёт с вашей версией репозитория, сверьтесь с README на странице проекта перед сборкой. Успешную загрузку модуля проверяет:

lsmod | grep amneziawg

Если модуль не поднимается — почти всегда причина в несовпадении версии заголовков (linux-headers) с реально запущенным ядром. Проверьте uname -r и убедитесь, что заголовки установлены именно под эту версию, а не под ту, что подтянулась по умолчанию из репозитория.

Установка amneziawg-tools (утилиты awg и awg-quick)

Модуль ядра сам по себе бесполезен без утилит управления — их тоже собираем из исходников, аналогично wireguard-tools:

apt install -y build-essential libmnl-dev pkg-config

git clone https://github.com/amnezia-vpn/amneziawg-tools.git
cd amneziawg-tools/src
make
make install

После установки в системе появятся awg (аналог wg — генерация ключей, просмотр статуса) и awg-quick (аналог wg-quick — поднятие интерфейса из конфига). Если хотите userspace-вариант вместо модуля ядра, вместо шагов с DKMS соберите amneziawg-go:

apt install -y golang-go
git clone https://github.com/amnezia-vpn/amneziawg-go.git
cd amneziawg-go
make
cp amneziawg-go /usr/bin/

awg-quick умеет работать поверх обеих реализаций — команды дальше одинаковы что для модуля ядра, что для userspace-бинарника.

Настройка awg0.conf: параметры обфускации

Каталог конфигов — /etc/amnezia/amneziawg/ (в отдельных сборках может остаться привычный /etc/wireguard/ — если awg-quick не находит файл, проверьте вывод awg-quick --help вашей версии). Ключи генерируются так же, как в обычном WireGuard, только утилитой awg:

mkdir -p /etc/amnezia/amneziawg
cd /etc/amnezia/amneziawg

awg genkey | tee server_private.key | awg pubkey > server_public.key
awg genkey | tee client_private.key | awg pubkey > client_public.key

Конфиг сервера /etc/amnezia/amneziawg/awg0.conf:

[Interface]
PrivateKey = <server_private.key>
Address = 10.9.0.1/24
ListenPort = 51820
Jc = 4
Jmin = 40
Jmax = 70
S1 = 68
S2 = 88
H1 = 1548265631
H2 = 861929961
H3 = 2530269966
H4 = 1516970699
PostUp = iptables -A FORWARD -i awg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i awg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
PublicKey = <client_public.key>
AllowedIPs = 10.9.0.2/32

Значения H1H4 в примере — просто случайные 32-битные числа для иллюстрации. Сгенерируйте свои на каждом сервере (подойдёт echo $RANDOM$RANDOM) — если оставить чужие значения из туториала, вы получите ту же проблему, от которой уходите: узнаваемый паттерн, только другой. Jc/Jmin/Jmax/S1/S2 тоже можно менять — чем ближе к «обычному шумному UDP», тем лучше, но экспериментальных ориентиров по оптимальным значениям для конкретно вашей сети никто не даст: DPI разных операторов и стран ведёт себя по-разному, поэтому это подбирается на практике.

Клиентский awg0.conf собирается по тому же принципу, что и для WireGuard, но с теми же параметрами обфускации, что на сервере — они обязаны совпадать побайтово:

[Interface]
PrivateKey = <client_private.key>
Address = 10.9.0.2/24
DNS = 1.1.1.1
Jc = 4
Jmin = 40
Jmax = 70
S1 = 68
S2 = 88
H1 = 1548265631
H2 = 861929961
H3 = 2530269966
H4 = 1516970699

[Peer]
PublicKey = <server_public.key>
Endpoint = <IP_сервера>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Этот же клиентский конфиг можно импортировать в приложение AmneziaVPN — оно понимает формат AmneziaWG нативно, если вам когда-нибудь захочется GUI-клиент вместо awg-quick.

Автозапуск, фаервол и проверка туннеля

Поднять интерфейс вручную:

sysctl -w net.ipv4.ip_forward=1
echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
awg-quick up awg0

Для автозапуска при загрузке нужен systemd-юнит. Если make install из amneziawg-tools его не поставил, создайте /etc/systemd/system/awg-quick@.service по образцу штатного wg-quick@.service, заменив в нём путь к бинарнику wg-quick на awg-quick, и включите:

systemctl enable --now awg-quick@awg0

Откройте порт во внешнем фаерволе — и в ufw на сервере, и в security groups облака, если провайдер их использует:

ufw allow 51820/udp
ufw enable

Проверка статуса — та же логика, что у wg show:

awg show
journalctl -u awg-quick@awg0 -n 50

С клиента подключитесь и проверьте внешний IP — он должен стать адресом сервера. Если хендшейк не проходит, в первую очередь сверьте, что H1H4 и Jc/Jmin/Jmax/S1/S2 совпадают между сервером и клиентом посимвольно: расхождение хотя бы в одной цифре ломает совместимость пакетов, а сообщение об ошибке при этом будет таким же невнятным, как обычный таймаут.

Арендуйте сервер под свои задачи!

Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.

Арендовать сервер

Нужны сами нейросети для контента?

Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.

Частые вопросы

Чем это отличается от установки Amnezia через приложение?

Здесь вы ставите ядро/модуль и утилиты awg/awg-quick вручную, без GUI AmneziaVPN — так удобнее для автоматизации, нестандартных дистрибутивов или когда просто не нужен графический клиент. Ручной путь к самому приложению разобран в статье про установку Amnezia на VPS.

Можно ли просто взять обычный WireGuard и добавить эти параметры?

Нет, ванильные wg/wg-quick не понимают Jc, Jmin, Jmax, S1, S2, H1H4 — нужны именно бинарники AmneziaWG. Как ставится обычный WireGuard, описано в пошаговой установке WireGuard на VPS.

Стоит ли сразу ставить AmneziaWG вместо обычного WireGuard?

Если блокировок пока нет, начните с обычного WireGuard — он проще в сборке и не требует компиляции модуля из исходников. Переходите на AmneziaWG, когда увидите, что провайдер режет туннель по DPI — подробнее о признаках такой блокировки в статье про WireGuard на сервере в России.

Что делать, если модуль ядра не собирается на конкретном VPS?

Переходите на userspace-вариант amneziawg-go — он не требует сборки под ядро и работает там, где DKMS отказывается, ценой чуть большей нагрузки на CPU.

Ломается ли модуль после обновления ядра?

Собранный через DKMS модуль пересобирается автоматически при установке нового ядра — dkms autoinstall подключается к хуку linux-image. Если ставили модуль без DKMS, руками через make/make install, пересобирать придётся вручную после каждого обновления ядра.

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

Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →