Стандартный WireGuard блокируется системами DPI по характерному паттерну handshake: фиксированный размер инициализационного пакета, предсказуемая структура заголовка, отсутствие мусорного трафика. AmneziaWG — форк WireGuard, который модифицирует протокол на уровне пакетов, сохраняя совместимость с экосистемой и добавляя параметры рандомизации, делающие трафик неразличимым для сигнатурного и эвристического анализа.
DPI-системы распознают WireGuard по нескольким признакам:
AmneziaWG противодействует каждому из этих признаков через конфигурационные параметры, которые добавляются в секцию
Все параметры должны совпадать на сервере и клиенте — иначе handshake не завершится.
AmneziaWG состоит из двух компонентов: модуль ядра (
После установки загрузите модуль:
Проверьте, что модуль активен:
Утилита
Чтобы модуль загружался при старте системы:
Ключевая пара генерируется так же, как в WireGuard:
Создайте файл
Разбор параметров:
Чтобы клиенты получали доступ в интернет через сервер, включите форвардинг и настройте NAT:
Замените
Для сохранения правил iptables между перезагрузками:
Проверка состояния:
Вывод должен содержать публичный ключ интерфейса, listen port и список пиров.
На клиенте создайте файл
Для Android и iOS используйте приложение AmneziaVPN — оно поддерживает импорт конфигурации AmneziaWG. Конфигурационный файл можно передать через QR-код или копирование.
Для десктопных платформ (Windows, macOS, Linux) доступен отдельный клиент AmneziaWG, который работает с тем же форматом конфигурации.
Каждый клиент получает уникальную пару ключей и отдельный IP в подсети туннеля. На сервере добавляется новая секция
После изменения конфигурации перезапустите интерфейс:
Или примените изменения без полного перезапуска:
На сервере можно наблюдать входящие пакеты:
Если пакеты приходят, но handshake не завершается — проблема в конфигурации. Если пакетов нет — проблема в сети или файрволе.
Как AmneziaWG обходит детект
DPI-системы распознают WireGuard по нескольким признакам:
- Фиксированный размер handshake-пакетов. Init и response имеют предсказуемую длину.
- Отсутствие мусорного трафика. Чистый WireGuard не генерирует пакетов вне сессии.
- Характерные magic-числа в заголовке. Первые байты пакета идентифицируют тип сообщения.
AmneziaWG противодействует каждому из этих признаков через конфигурационные параметры, которые добавляются в секцию
[Interface] и [Peer]:| Параметр | Назначение |
|---|---|
Jc | Количество мусорных пакетов, отправляемых перед handshake |
Jmin | Минимальный размер мусорного пакета (байты) |
Jmax | Максимальный размер мусорного пакета (байты) |
S1 | Размер мусорных данных, добавляемых к init-пакету |
S2 | Размер мусорных данных, добавляемых к response-пакету |
H1–H4 | Заменённые magic-числа заголовков (вместо стандартных значений WireGuard) |
Все параметры должны совпадать на сервере и клиенте — иначе handshake не завершится.
Требования к серверу
- Linux с ядром 5.6+ (модуль WireGuard встроен в ядро начиная с 5.6, но AmneziaWG использует собственный модуль
amneziawg, который собирается отдельно).
- Доступ к заголовкам ядра для сборки модуля (
linux-headersсоответствующей версии).
- Права root.
- UDP-порт, доступный извне (по умолчанию 51820, но рекомендуется сменить на нестандартный).
Установка модуля ядра и утилит
AmneziaWG состоит из двух компонентов: модуль ядра (
amneziawg.ko) и пользовательские утилиты (awg, awg-quick).Сборка из исходников
Bash:
git clone https://github.com/amnezia-vpn/amneziawg-linux-kernel-module.git
cd amneziawg-linux-kernel-module/src
make -j$(nproc)
sudo make install
После установки загрузите модуль:
Bash:
sudo modprobe amneziawg
Проверьте, что модуль активен:
Bash:
lsmod | grep amneziawg
Утилиты
Bash:
git clone https://github.com/amnezia-vpn/amneziawg-tools.git
cd amneziawg-tools/src
make -j$(nproc)
sudo make install
Утилита
awg аналогична wg из стандартного WireGuard, а awg-quick — аналог wg-quick для управления интерфейсами через конфигурационные файлы.Автозагрузка модуля
Чтобы модуль загружался при старте системы:
Bash:
echo "amneziawg" | sudo tee /etc/modules-load.d/amneziawg.conf
Генерация ключей
Ключевая пара генерируется так же, как в WireGuard:
Bash:
## Приватный ключ сервера
awg genkey | tee server_private.key | awg pubkey > server_public.key
## Приватный ключ клиента
awg genkey | tee client_private.key | awg pubkey > client_public.key
Конфигурация сервера
Создайте файл
/etc/amneziawg/awg0.conf:
INI:
[Interface]
PrivateKey = <server_private_key>
Address = 10.8.0.1/24
ListenPort = 48621
## Анти-DPI параметры
Jc = 5
Jmin = 50
Jmax = 500
S1 = 46
S2 = 58
H1 = 123456789
H2 = 987654321
H3 = 112233445
H4 = 554433221
[Peer]
PublicKey = <client_public_key>
AllowedIPs = 10.8.0.2/32
Разбор параметров:
ListenPort— UDP-порт сервера. Нестандартный порт снижает вероятность того, что DPI-система целенаправленно анализирует именно этот порт.
Jc = 5— перед handshake сервер отправит 5 мусорных пакетов случайного размера.
Jmin/Jmax— диапазон размеров мусорных пакетов в байтах.
S1/S2— байты мусора, добавляемые непосредственно к init и response пакетам, меняя их длину.
H1–H4— произвольные 32-битные числа, заменяющие стандартные magic-значения заголовков WireGuard. Именно они ломают сигнатурное распознавание.
Важно: значенияH1–H4должны быть одинаковыми на сервере и всех клиентах. Если вы хотите усложнить анализ, можно использовать разные значения для разных пиров, но это требует отдельного интерфейса или дополнительной маршрутизации.
Настройка маршрутизации и NAT
Чтобы клиенты получали доступ в интернет через сервер, включите форвардинг и настройте NAT:
Bash:
## Включение IP-форвардинга
sudo sysctl -w net.ipv4.ip_forward=1
## Постоянное включение
echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.d/99-forward.conf
## NAT для подсети туннеля
sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
Замените
eth0 на имя внешнего интерфейса сервера (проверить: ip route show default).Для сохранения правил iptables между перезагрузками:
Bash:
sudo apt install iptables-persistent
sudo netfilter-persistent save
Запуск интерфейса
Bash:
sudo awg-quick up awg0
Проверка состояния:
Bash:
sudo awg show awg0
Вывод должен содержать публичный ключ интерфейса, listen port и список пиров.
Конфигурация клиента
На клиенте создайте файл
client.conf:
INI:
[Interface]
PrivateKey = <client_private_key>
Address = 10.8.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = <server_public_key>
Endpoint = <server_ip>:48621
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
## Анти-DPI параметры (должны совпадать с сервером)
Jc = 5
Jmin = 50
Jmax = 500
S1 = 46
S2 = 58
H1 = 123456789
H2 = 987654321
H3 = 112233445
H4 = 554433221
PersistentKeepalive = 25 отправляет keepalive-пакет каждые 25 секунд, что предотвращает закрытие UDP-маппинга на NAT клиента.Мобильные клиенты
Для Android и iOS используйте приложение AmneziaVPN — оно поддерживает импорт конфигурации AmneziaWG. Конфигурационный файл можно передать через QR-код или копирование.
Для десктопных платформ (Windows, macOS, Linux) доступен отдельный клиент AmneziaWG, который работает с тем же форматом конфигурации.
Добавление нескольких клиентов
Каждый клиент получает уникальную пару ключей и отдельный IP в подсети туннеля. На сервере добавляется новая секция
[Peer]:
INI:
[Peer]
PublicKey = <second_client_public_key>
AllowedIPs = 10.8.0.3/32
После изменения конфигурации перезапустите интерфейс:
Bash:
sudo awg-quick down awg0
sudo awg-quick up awg0
Или примените изменения без полного перезапуска:
Bash:
sudo awg set awg0 peer <second_client_public_key> allowed-ips 10.8.0.3/32
Диагностика и проверка
Туннель поднимается, но нет трафика
- Проверьте форвардинг:
sysctl net.ipv4.ip_forwardдолжен возвращать1.
- Проверьте NAT:
sudo iptables -t nat -L POSTROUTING -v -n— правило MASQUERADE должно быть в списке.
- Убедитесь, что
AllowedIPsна сервере содержит IP клиента, а на клиенте —0.0.0.0/0.
Handshake не завершается
- Несовпадение анти-DPI параметров. Все значения
Jc,Jmin,Jmax,S1,S2,H1–H4должны быть идентичны на обеих сторонах.
- Неверный публичный ключ. Проверьте, что ключи не перепутаны местами.
- Порт заблокирован. Убедитесь, что UDP-порт открыт в файрволе облачного провайдера и на самом сервере:
Bash:sudo ufw allow 48621/udp - Модуль не загружен. Выполните
lsmod | grep amneziawg.
Проверка через tcpdump
На сервере можно наблюдать входящие пакеты:
Bash:
sudo tcpdump -i eth0 udp port 48621 -nn
Если пакеты приходят, но handshake не завершается — проблема в конфигурации. Если пакетов нет — проблема в сети или файрволе.
Ограничения и нюансы
- AmneziaWG несовместим со стандартным WireGuard. Клиент с обычным WireGuard не подключится к серверу AmneziaWG и наоборот. Это следствие модифицированного протокола.
- Параметры H1–H4 — не криптография. Они не усиливают шифрование, а лишь меняют сигнатуру заголовков. Криптографическая стойкость остаётся на уровне WireGuard (Curve25519, ChaCha20, Poly1305, BLAKE2s).
- Обновления ядра. После обновления ядра модуль
amneziawgможет потребовать пересборки. Если используете DKMS, пересборка происходит автоматически; при ручной сборке — повторитеmake && sudo make install.
- Производительность. Мусорные пакеты (
Jc,S1,S2) добавляют незначительный оверхед. На практике влияние на пропускную способность минимально при разумных значениях параметров.
Чек-лист развёртывания
- [ ] Модуль
amneziawgзагружен (lsmod | grep amneziawg)
- [ ] Утилиты
awgиawg-quickдоступны в PATH
- [ ] Конфигурация сервера содержит анти-DPI параметры
- [ ] IP-форвардинг включён
- [ ] NAT настроен для подсети туннеля
- [ ] UDP-порт открыт в файрволе (и в панели облачного провайдера)
- [ ] Клиентская конфигурация содержит те же значения
Jc,Jmin,Jmax,S1,S2,H1–H4
- [ ]
awg show awg0отображаетlatest handshakeпосле подключения клиента
- [ ] Трафик через туннель проходит (
ping 10.8.0.1с клиента, доступ к внешним ресурсам)
