Развертывание AmneziaWG на Ubuntu / Debian: ручная настройка ключей и обфускации
- Стандартный WireGuard туннель блокируется системами глубокого анализа пакетов (DPI/ТСПУ) по сигнатуре первого пакета Handshake Initiation.
- Клиент AmneziaWG отправляет рукопожатия, но сервер не отвечает (0 байт в поле
latest handshake). - Ошибка компиляции модуля ядра DKMS при обновлении версии Linux Kernel.
- Ошибки валидации заголовков обфускации в логах демона
dmesg | grep amnezia.
1. Архитектура AmneziaWG
AmneziaWG — это форк протокола WireGuard, реализующий защиту от DPI-анализаторов с помощью добавления случайных мусорных байтов (Junk Packet) в начало сессии, рандомизации размеров системных пакетов рукопожатия и модификации стандартных 4-байтных магических заголовков протокола (Init, Response, Cookie, Transport Data).
2. Установка DKMS модуля ядра и утилит
# Добавление официального репозитория Amnezia
apt-get update && apt-get install -y software-properties-common
add-apt-repository -y ppa:amnezia/ppa
apt-get update
# Установка модуля ядра и инструмента управления awg
apt-get install -y amneziawg amneziawg-tools iptables
# Проверка загрузки модуля
modprobe amneziawg && lsmod | grep amneziawg3. Генерация ключей и параметров обфускации
# Генерация приватного и публичного ключей сервера
umask 077
awg genkey | tee /etc/amnezia/amneziawg/server_private.key | awg pubkey > /etc/amnezia/amneziawg/server_public.key
# Генерация ключей клиента
awg genkey | tee /etc/amnezia/amneziawg/client_private.key | awg pubkey > /etc/amnezia/amneziawg/client_public.key4. Конфигурация сервера (/etc/amnezia/amneziawg/awg0.conf)
[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = <СОДЕРЖИМОЕ_server_private.key>
# --- Параметры обфускации AmneziaWG ---
Jc = 4 # Количество мусорных пакетов перед хендшейком (1-128)
Jmin = 40 # Минимальный размер случайного мусора (байты)
Jmax = 70 # Максимальный размер случайного мусора (байты)
S1 = 15 # Смещение заголовка инициализации
S2 = 20 # Смещение заголовка ответа
H1 = 1 # Кастомный магический заголовок типа 1
H2 = 2 # Кастомный магический заголовок типа 2
H3 = 3 # Кастомный магический заголовок типа 3
H4 = 4 # Кастомный магический заголовок типа 4
# Правила NAT и маршрутизации
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.8.0.2/325. Включение маршрутизации и запуск сервиса
# Включение IPv4 Forwarding в ядре
echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/99-awg.conf
sysctl --system
# Запуск интерфейса через systemd
systemctl enable --now awg-quick@awg0
# Проверка статуса работы и хендшейков
awg show6. Создание конфигурационного файла клиента (client.conf)
[Interface]
PrivateKey = <СОДЕРЖИМОЕ_client_private.key>
Address = 10.8.0.2/24
DNS = 1.1.1.1
Jc = 4
Jmin = 40
Jmax = 70
S1 = 15
S2 = 20
H1 = 1
H2 = 2
H3 = 3
H4 = 4
[Peer]
PublicKey = <СОДЕРЖИМОЕ_server_public.key>
Endpoint = 203.0.113.10:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25 Частые вопросы (FAQ)
Почему клиент AmneziaWG не соединяется со стандартным сервером WireGuard?
Если на сервере или клиенте настроены параметры обфускации (Jc, S1, H1 и др.), протокол меняет структуру пакетов. Обе стороны должны использовать бинарники AmneziaWG с абсолютно идентичными числовыми значениями обфускации.
Что означают параметры S1 и S2?
S1 и S2 задают фиксированный размер дополнительного случайного шума (padding) в байтах, добавляемого к пакетам Handshake Initiation и Handshake Response для изменения их стандартной длины.
Как проверить, блокирует ли провайдер порт AmneziaWG?
Запустите утилиту tcpdump на сервере (tcpdump -nn -i eth0 port 51820) и попробуйте подключиться с клиента. Если входящие UDP-пакеты отсутствуют, порт блокируется вышестоящим провайдером — смените ListenPort на диапазон 10000–60000.
Работает ли AmneziaWG внутри непривилегированного Docker-контейнера?
Модуль ядра amneziawg должен быть предварительно скомпилирован и загружен на хост-ноде. Контейнеру требуются capabilities NET_ADMIN и доступ к устройству /dev/net/tun.