Что такое AmneziaWG и зачем он нужен
AmneziaWG (AWG) — это форк WireGuard, дополненный механизмами обфускации трафика для противодействия системам глубокого анализа пакетов (DPI). В отличие от классического WireGuard, который легко детектируется по характерным сигнатурам, AWG маскирует свои пакеты под случайный шум, что позволяет использовать VPN в сетях с агрессивной фильтрацией.
Основная цель AWG — сохранить все преимущества WireGuard: высокую производительность, простоту настройки и современную криптографию, добавив при этом возможность настраивать параметры обфускации. Это делает его востребованным инструментом для построения защищённых каналов в условиях, когда обычный WireGuard блокируется или замедляется.
Важно понимать, что AWG не является полностью самостоятельным протоколом — это модификация WireGuard, использующая тот же протокол Noise_IKpsk2 и те же криптографические примитивы (ChaCha20Poly1305, Curve25519, BLAKE2s). Отличия заключаются в дополнительных полях и junk-пакетах, которые вставляются в поток данных для затруднения анализа.
Ключевые отличия AmneziaWG от WireGuard
Главное отличие AWG от WireGuard — наличие настраиваемых параметров обфускации, которые позволяют изменять внешний вид трафика. Эти параметры включают:
- Jc — количество «мусорных» пакетов, отправляемых перед handshake (от 1 до 128, рекомендуемые значения 4–12).
- Jmin и Jmax — минимальный и максимальный размер junk-пакетов (Jmin < 1280, Jmax от Jmin до 1280).
- S1 и S2 — размеры padding для сообщений инициации и ответа (рекомендуется 15–150, при этом S1+56 не должно равняться S2).
- H1–H4 — «магические» заголовки, которые проверяются при приёме пакетов (уникальные значения от 5 до 2147483647).
Эти параметры должны быть согласованы между сервером и клиентом, за исключением Jc, Jmin и Jmax, которые могут различаться. Благодаря такой гибкости можно подобрать конфигурацию, которая будет выглядеть как случайный UDP-трафик, что значительно усложняет детектирование.
В остальном AWG полностью совместим с WireGuard: используются те же ключи, та же модель конфигурации (AllowedIPs, Endpoint, ListenPort), а утилиты awg и awg-quick повторяют функциональность wg и wg-quick.
Архитектура модуля ядра AmneziaWG
AmneziaWG реализован как модуль ядра Linux (amneziawg.ko), который создаёт виртуальный сетевой интерфейс amneziawg. Модуль состоит из нескольких подсистем, каждая из которых отвечает за свою часть работы:
- device.c — управление виртуальными устройствами.
- peer.c — жизненный цикл пиров (peer).
- noise.c — реализация Noise-протокола для handshake.
- send.c / receive.c — обработка входящих и исходящих пакетов.
- socket.c — управление UDP-сокетами.
- allowedips.c — маршрутизация на основе IP-адресов (radix trie).
- timers.c — таймеры keepalive и rekey.
- cookie.c / ratelimiter.c — защита от DoS-атак.
- netlink.c — API для настройки через Generic Netlink.
- junk.c / magic_header.c — реализация обфускации.
Модуль поддерживает ядра от 3.10 до 6.x и новее, что делает его пригодным для большинства дистрибутивов Linux. Инициализация проходит в строгом порядке: сначала криптографические примитивы, затем slab-аллокатор для allowedips, потом Noise, пиры, устройства и netlink. При ошибке на любом этапе происходит откат.
Для установки модуля можно использовать DKMS, который автоматически пересобирает модуль при обновлении ядра, либо собрать вручную. DKMS предпочтителен для продакшн-систем, так как избавляет от необходимости вручную перекомпилировать модуль после каждого обновления ядра.
Подготовка системы к установке AmneziaWG
Перед установкой AWG необходимо подготовить систему. В зависимости от дистрибутива и способа установки (из репозитория или из исходников) потребуются разные пакеты.
Для установки из PPA-репозитория (на Debian/Ubuntu) понадобятся:
sudo apt install -y software-properties-common python3-launchpadlib gnupg2 linux-headers-$(uname -r)Затем добавить ключ и репозиторий:
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 57290828
echo "deb https://ppa.launchpadcontent.net/amnezia/ppa/ubuntu focal main" | sudo tee -a /etc/apt/sources.list
sudo apt-get update
sudo apt-get install -y amneziawg amneziawg-toolsЕсли вы предпочитаете собирать из исходников, потребуются git, gcc, make, build-essential и заголовки ядра:
sudo apt install git make gcc build-essential
sudo apt install linux-headers-$(uname -r)Также рекомендуется установить мета-пакет linux-headers-amd64 (или аналог для вашей архитектуры), чтобы заголовки автоматически обновлялись при обновлении ядра.
Установка модуля ядра AmneziaWG из исходников
Ручная сборка модуля ядра даёт полный контроль над процессом и гарантирует, что вы используете именно тот код, который хотите. Рассмотрим два способа: через DKMS и вручную.
Установка через DKMS
- Клонируйте репозиторий:
mkdir -p ~/git && cd ~/git
git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git- Установите DKMS:
sudo apt install dkms- Подготовьте исходники:
sudo mkdir -p /usr/src/amneziawg-1.0.0/
cd amneziawg-linux-kernel-module
sudo cp -r src/* /usr/src/amneziawg-1.0.0/- Добавьте модуль в DKMS, соберите и установите:
sudo dkms add -m amneziawg -v 1.0.0
sudo dkms build -m amneziawg -v 1.0.0
sudo dkms install -m amneziawg -v 1.0.0После этого модуль будет автоматически пересобираться при каждом обновлении ядра.
Ручная сборка
Если вы не хотите использовать DKMS, можно собрать модуль напрямую:
cd ~/git/amneziawg-linux-kernel-module/src
make
sudo make install
sudo modprobe amneziawgПроверьте, что модуль загружен:
lsmod | grep amneziawgРучная сборка удобна для тестирования, но при обновлении ядра модуль придётся пересобирать вручную.
Установка утилит awg и awg-quick
Для управления туннелями AmneziaWG необходимы утилиты awg и awg-quick, которые являются аналогами wg и wg-quick из WireGuard. Они позволяют создавать, настраивать и запускать туннели, а также управлять ключами.
Утилиты можно установить из того же PPA-репозитория (пакет amneziawg-tools) или собрать из исходников.
Сборка из исходников
- Клонируйте репозиторий:
cd ~/git
git clone https://github.com/amnezia-vpn/amneziawg-tools.git- Соберите и установите:
cd amneziawg-tools/src
make
sudo make installВ результате утилиты будут установлены в /usr/bin/, скрипты bash-дополнения — в /usr/share/bash-completion/completions/, а systemd-юниты — в /usr/lib/systemd/system/.
После установки вы можете использовать awg и awg-quick точно так же, как wg и wg-quick. Например, для генерации ключей:
wg genkey | tee privatekey | wg pubkey > publickeyОбратите внимание, что утилиты awg используют те же алгоритмы генерации ключей, что и WireGuard, поэтому ключи совместимы.
Настройка сервера AmneziaWG
Настройка сервера AWG во многом повторяет настройку WireGuard, но с добавлением параметров обфускации. Конфигурационные файлы хранятся в /etc/amnezia/amneziawg/.
- Создайте каталог и сгенерируйте ключи:
sudo mkdir -p /etc/amnezia/amneziawg
wg genkey | sudo tee /etc/amnezia/amneziawg/privatekey | wg pubkey | sudo tee /etc/amnezia/amneziawg/publickey- Создайте файл конфигурации, например /etc/amnezia/amneziawg/wg0.conf:
[Interface]
Address = 10.0.8.1/24
ListenPort = 33733
PrivateKey = <приватный ключ сервера>
# Параметры обфускации (должны совпадать с клиентом, кроме Jc, Jmin, Jmax)
Jc = 5
Jmin = 50
Jmax = 1000
S1 = 80
S2 = 120
H1 = 123456789
H2 = 987654321
H3 = 111111111
H4 = 222222222
# Включение NAT, если нужно предоставить доступ в интернет
# PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o ens3 -j MASQUERADE
# PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o ens3 -j MASQUERADE
[Peer]
PublicKey = <публичный ключ клиента>
AllowedIPs = 10.0.8.2/32- Включите IP forwarding, если планируете использовать сервер как шлюз:
sudo sysctl -w net.ipv4.ip_forward=1Для постоянного включения добавьте строку net.ipv4.ip_forward=1 в /etc/sysctl.conf.
- Запустите туннель:
sudo awg-quick up wg0Проверить статус можно командой sudo awg show.
Настройка клиента AmneziaWG
Клиентская настройка аналогична серверной, но с другими параметрами. Конфигурационный файл клиента также должен находиться в /etc/amnezia/amneziawg/.
Пример конфигурации клиента (wg0-client.conf):
[Interface]
Address = 10.0.8.2/24
PrivateKey = <приватный ключ клиента>
# Параметры обфускации должны совпадать с сервером (кроме Jc, Jmin, Jmax)
Jc = 5
Jmin = 50
Jmax = 1000
S1 = 80
S2 = 120
H1 = 123456789
H2 = 987654321
H3 = 111111111
H4 = 222222222
[Peer]
PublicKey = <публичный ключ сервера>
Endpoint = <IP-адрес сервера>:33733
AllowedIPs = 0.0.0.0/0, ::/0Если вы хотите перенести существующие конфигурации WireGuard, просто скопируйте файлы из /etc/wireguard/ в /etc/amnezia/amneziawg/ и добавьте параметры обфускации.
Запуск клиента:
sudo awg-quick up wg0-clientПроверьте соединение:
sudo awg show
ping 10.0.8.1Важно: параметры S1, S2, H1–H4 должны быть идентичны на сервере и клиенте, иначе соединение не установится. Jc, Jmin и Jmax могут различаться, но для простоты лучше использовать одинаковые значения.
Интеграция с systemd и автозапуск
Хотя AWG не имеет встроенной интеграции с systemd, её легко создать самостоятельно. Это позволит автоматически запускать туннель при загрузке системы и управлять им через systemctl.
Создайте файл /etc/systemd/system/awg-quick@.service:
[Unit]
Description=WireGuard via awg-quick(8) for %I
After=network-online.target nss-lookup.target
Wants=network-online.target nss-lookup.target
Documentation=man:awg-quick(8)
Documentation=man:awg(8)
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/usr/bin/awg-quick up %i
ExecStop=/usr/bin/awg-quick down %i
ExecReload=/bin/bash -c 'exec /usr/bin/awg syncconf %i <(exec /usr/bin/awg-quick strip %i)'
Environment=WG_ENDPOINT_RESOLUTION_RETRIES=infinity
[Install]
WantedBy=multi-user.targetЗатем выполните:
sudo systemctl daemon-reload
sudo systemctl enable awg-quick@wg0.service
sudo systemctl start awg-quick@wg0.serviceПроверьте статус:
sudo systemctl status awg-quick@wg0.serviceТеперь туннель будет автоматически подниматься при старте системы. Обратите внимание, что имя интерфейса в команде должно соответствовать имени вашего конфигурационного файла (без .conf).
Удаление AmneziaWG
Если вам больше не нужен AmneziaWG, его можно полностью удалить. Процесс зависит от способа установки.
Удаление модуля ядра, установленного через DKMS:
sudo dkms remove -m amneziawg -v 1.0.0 --all
sudo rm -rf /usr/src/amneziawg-1.0.0/Удаление утилит, установленных из исходников:
sudo rm -v /usr/bin/awg /usr/share/man/man8/awg.8 /usr/share/bash-completion/completions/awg
sudo rm -v /usr/bin/awg-quick /usr/share/man/man8/awg-quick.8 /usr/share/bash-completion/completions/awg-quick
sudo rm -v /usr/lib/systemd/system/awg-quick.target /usr/lib/systemd/system/awg-quick@.serviceЕсли вы устанавливали через PPA, удалите пакеты:
sudo apt remove --purge amneziawg amneziawg-toolsТакже не забудьте удалить конфигурационные файлы в /etc/amnezia/amneziawg/, если они больше не нужны.
Вопросы и ответы
Чем AmneziaWG отличается от обычного WireGuard?
AmneziaWG — это форк WireGuard, который добавляет механизмы обфускации трафика для противодействия DPI. В отличие от WireGuard, AWG позволяет настраивать параметры junk-пакетов и магических заголовков, что делает трафик менее детектируемым. При этом сохраняется совместимость с ключами и основными принципами настройки WireGuard.
Какие параметры обфускации нужно указывать в конфигурации?
Основные параметры: Jc (количество junk-пакетов перед handshake), Jmin и Jmax (минимальный и максимальный размер junk-пакетов), S1 и S2 (размеры padding для сообщений handshake), H1–H4 (магические заголовки). Все параметры, кроме Jc, Jmin и Jmax, должны быть одинаковыми на сервере и клиенте. Рекомендуемые значения: Jc от 4 до 12, Jmin 50, Jmax 1000, S1 и S2 от 15 до 150, H1–H4 — случайные числа от 5 до 2147483647.
Можно ли использовать ключи WireGuard для AmneziaWG?
Да, ключи полностью совместимы. AmneziaWG использует те же криптографические алгоритмы (Curve25519, ChaCha20Poly1305, BLAKE2s), поэтому вы можете сгенерировать ключи с помощью wg genkey или awg genkey, и они будут работать в обоих протоколах.
Как перенести конфигурацию WireGuard на AmneziaWG?
Скопируйте файлы конфигурации из /etc/wireguard/ в /etc/amnezia/amneziawg/ и добавьте в секцию [Interface] параметры обфускации (Jc, Jmin, Jmax, S1, S2, H1–H4). Убедитесь, что эти параметры совпадают на всех пирах. После этого используйте awg-quick up <имя_интерфейса> для запуска.
Нужно ли пересобирать модуль ядра при обновлении ядра Linux?
Если вы установили модуль через DKMS, он будет автоматически пересобран при обновлении ядра. Если вы собирали модуль вручную, то после обновления ядра его нужно пересобрать и переустановить. Рекомендуется использовать DKMS для упрощения обслуживания.
Какие системные требования у AmneziaWG?
AmneziaWG требует Linux-ядро версии от 3.10 до 6.x и новее. Для сборки модуля необходимы заголовки ядра, компилятор gcc и утилита make. Для работы утилит awg и awg-quick достаточно стандартного окружения. Ресурсоёмкость минимальна, так как модуль работает в пространстве ядра.
Можно ли использовать AmneziaWG на сервере и клиенте с разными параметрами Jc?
Да, параметры Jc, Jmin и Jmax могут различаться между пирами. Однако параметры S1, S2 и H1–H4 должны быть одинаковыми на всех пирах, иначе handshake не будет завершён. Рекомендуется для простоты использовать одинаковые значения на всех устройствах.