AmneziaWG kernel module: установка и решение проблем

Команда modprobe amneziawg возвращает «module not found», а интерфейс awg0 не поднимается — типичный признак того, что kernel module для AmneziaWG не собран под текущую версию ядра либо не установлен вовсе. Эта ситуация особенно часто возникает после обновления ядра Linux, когда механизм DKMS не успел или не смог пересобрать модуль.

AmneziaWG — это форк протокола WireGuard с дополнительной обфускацией заголовков пакетов, призванный затруднить детектирование VPN трафика системами DPI. В отличие от userspace-реализации на Go (amneziawg-go), модуль ядра работает в пространстве ядра Linux и обычно обеспечивает более высокую производительность и меньшую нагрузку на процессор. Ниже разберём, как работает модуль, как его установить и что делать при типовых ошибках.

Что такое AmneziaWG kernel module и чем он отличается от userspace

Модуль ядра — это код, загружаемый непосредственно в ядро Linux и обрабатывающий сетевые пакеты без переключения контекста в пользовательское пространство. Для AmneziaWG это означает, что шифрование, обфускация и маршрутизация пакетов выполняются на уровне ядра, что снижает задержки и накладные расходы.

Userspace-вариант (amneziawg-go) запускается как обычный процесс и использует интерфейс /dev/net/tun. Его проще установить — не требуется компиляция под конкретное ядро, — но производительность на слабых устройствах (роутеры, VPS с ограниченными ресурсами) может быть заметно ниже.

  • 🚀 Kernel module — выше скорость, ниже нагрузка на CPU, требует сборки под ядро
  • 📦 Userspace (Go) — проще установка, переносимость между системами
  • 🔧 Утилита awg — инструмент управления, общий для обоих вариантов
  • 🛡️ Обфускация — параметры Jc, Jmin, Jmax, S1, S2, H1–H4 работают в обеих реализациях
КритерийKernel moduleUserspace (Go)
ПроизводительностьВысокаяСредняя
Сложность установкиТребует заголовков ядра и сборкиМинимальная
Зависимость от версии ядраДа, пересборка при обновленииНет
Подходит для роутеровДа, при наличии сборкиОграниченно

Когда нужен именно модуль ядра

Если сервер или маршрутизатор обслуживает десятки клиентов одновременно, userspace-реализация может стать узким местом: каждый пакет проходит путь ядро → процесс → ядро. В таких сценариях установка kernel module оправдана, даже несмотря на дополнительные сложности с поддержкой.

Для одиночного пользователя на десктопе или ноутбуке разница часто незаметна, и проще остаться на amneziawg-go. Решение стоит принимать исходя из нагрузки и готовности пересобирать модуль после каждого обновления ядра.

Установка модуля через DKMS

Рекомендуемый способ установки — через DKMS (Dynamic Kernel Module Support), который автоматически пересобирает модуль при обновлении ядра. Понадобятся заголовки ядра и инструменты сборки. Точные имена пакетов зависят от дистрибутива, поэтому сверяйтесь с документацией вашей системы и репозиторием проекта Amnezia.

Общий порядок действий выглядит так:

apt install linux-headers-$(uname -r) dkms git

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

cd amneziawg-linux-kernel-module/src

sudo dkms add .

sudo dkms install amneziawg/1.0.0

После установки проверьте, что модуль загружается:

sudo modprobe amneziawg

lsmod | grep amneziawg

⚠️ Внимание: версия модуля в команде dkms install должна соответствовать фактической версии из файла dkms.conf в исходниках. Не копируйте номер версии из примеров вслепую — проверьте его в репозитории.

☑️ Проверка перед установкой модуля

Выполнено: 0 / 5

Типичные ошибки и их решение

Самая частая проблема — ошибка сборки вида «kernel headers not found» или «bad return status for module build». Причина почти всегда одна: заголовки ядра не соответствуют запущенной версии. Это происходит, когда система обновила ядро, но перезагрузка не выполнялась, либо заголовки не установлены вовсе.

Проверить соответствие можно сравнением вывода uname -r с содержимым каталога /lib/modules/. Если каталога для текущей версии ядра нет — модуль собрать не получится, пока не будут установлены нужные заголовки.

  • modprobe: FATAL: Module amneziawg not found — модуль не установлен или собран под другую версию ядра
  • 🔨 Ошибка сборки DKMS — смотрите лог в /var/lib/dkms/amneziawg/ для точной причины
  • 🔐 Ошибка подписи модуля — Secure Boot блокирует неподписанные модули
  • 📡 Интерфейс не поднимается — проверьте конфигурацию через awg show и права на файл конфигурации
⚠️ Внимание: на системах с включённым Secure Boot неподписанный модуль ядра не загрузится. Нужно либо подписать модуль собственным ключом (MOK), либо отключить Secure Boot в настройках UEFI. Действия с Secure Boot выполняйте осознанно — это влияет на безопасность системы.
📊 Какой вариант AmneziaWG вы используете?
Kernel module (DKMS)
Userspace amneziawg-go
Через приложение AmneziaVPN
Ещё только выбираю

Проверка работоспособности после установки

После загрузки модуля создайте конфигурацию интерфейса и поднимите его утилитой awg-quick или вручную через ip link и awg setconf. Успешная настройка подтверждается выводом awg show, где отображаются пиры, ключи и счётчики переданных данных.

Наличие handshake у пира — главный индикатор того, что соединение установлено. Если handshake отсутствует, проверьте доступность UDP-порта на стороне сервера, корректность ключей и параметры обфускации: значения Jc, Jmin, Jmax, S1, S2 и H1–H4 должны полностью совпадать на клиенте и сервере, иначе соединение не установится.

Совместимость и ограничения

Модуль ядра AmneziaWG основан на коде WireGuard, но из-за изменённого формата пакетов он несовместим с обычным WireGuard: клиент на чистом WireGuard не сможет подключиться к серверу AmneziaWG и наоборот. Обе стороны должны использовать одну реализацию протокола.

Также учитывайте, что модуль требует относительно свежего ядра. На очень старых LTS-ядрах сборка может завершаться ошибками из-за отсутствия нужных API ядра — в этом случае практичнее перейти на userspace-реализацию.

Почему пакеты AmneziaWG отличаются от WireGuard

AmneziaWG добавляет «мусорные» junk-пакеты перед handshake (параметры Jc, Jmin, Jmax), изменяет сигнатуры заголовков (H1–H4) и размеры пакетов инициации (S1, S2). Это ломает сигнатурный анализ DPI, но делает протокол несовместимым с оригинальным WireGuard.

Обновление и удаление модуля

При обновлении ядра DKMS обычно пересобирает модуль автоматически. Если после перезагрузки модуль не загружается, проверьте статус командой dkms status: состояние должно быть «installed» для текущей версии ядра. При статусе «added» выполните повторную сборку и установку.

Для полного удаления модуля из системы используется обратная последовательность: сначала dkms remove с указанием версии, затем при необходимости удаление каталога с исходниками из /usr/src/. Перед удалением убедитесь, что все интерфейсы AmneziaWG остановлены.

Часто задаваемые вопросы

Чем AmneziaWG отличается от обычного WireGuard?

AmneziaWG — форк WireGuard с обфускацией: изменённые заголовки пакетов и «мусорные» пакеты затрудняют детектирование VPN системами DPI. Криптографическая основа при этом остаётся той же.

Обязательно ли ставить kernel module или хватит userspace?

Нет, не обязательно. Userspace-реализация amneziawg-go полностью функциональна. Модуль ядра даёт преимущество в производительности, что важно на серверах с большим числом клиентов.

Модуль не загружается после обновления ядра — что делать?

Проверьте dkms status и логи сборки в /var/lib/dkms/. Чаще всего помогает установка заголовков нового ядра и повторная сборка через dkms install.

Работает ли модуль при включённом Secure Boot?

Неподписанный модуль — нет. Требуется либо подписать модуль собственным ключом и зарегистрировать его через MOK, либо отключить Secure Boot в настройках UEFI.

Совместим ли AmneziaWG с клиентами WireGuard?

Нет. Из-за изменённого формата пакетов обе стороны соединения должны использовать AmneziaWG — подключение между AmneziaWG и чистым WireGuard невозможно.