Amnezia VPN на своём сервере: AmneziaWG вместо WireGuard

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

Для подключения из России нужен AmneziaWG, а не обычный WireGuard. ТСПУ распознаёт рукопожатие WireGuard и режет его: на IP ForestsNet Cloud чистый WireGuard из России не подключается вообще. AmneziaWG работает, потому что перед рукопожатием отправляет «шум» и меняет служебные поля пакетов. Обычный WireGuard по-прежнему хорош для связи между своими серверами и в сетях без DPI — см. «WireGuard VPN: сервер и клиенты».

Актуально на сентябрь 2026 года: приложение AmneziaVPN 5.0.3.0, протокол AmneziaWG 3.1 (amneziawg-tools 3.1.20260812, модуль ядра 3.1.20260906, amneziawg-go 3.1.20260828).

Что понадобится

  • VPS ForestsNet Cloud в Нидерландах или Германии на Ubuntu 22.04/24.04 или Debian 12/13 — их Amnezia поддерживает официально. Хватит 1 vCPU и 1 ГБ RAM, от 10 подключений лучше 2 ГБ.
  • SSH под root или пользователем с sudo без пароля — см. «Консоль VNC и первое подключение».
  • Приложение AmneziaVPN (шаг 2) или AmneziaWG (шаг 3).
  • Запас трафика: в пакет идёт только исходящий, а у VPN он примерно равен тому, что скачивают клиенты.

Шаг 1. Разберитесь, почему WireGuard блокируется

Что DPI видит в WireGuard

WireGuard никогда не маскировался. Каждый его пакет начинается с номера типа (1–4) и трёх нулевых байтов, а служебные пакеты фиксированного размера: инициация рукопожатия — 148 байт, ответ — 92, cookie — 64. Первый UDP-пакет нового соединения — 148 байт, начинающиеся с 01 00 00 00. Ровно эти признаки проверяет открытый DPI-движок nDPI.

Массовая волна блокировок WireGuard и OpenVPN в России прошла в августе 2023 года, к 2025-му WireGuard заблокирован в большинстве регионов. У одних операторов не проходит рукопожатие, у других поток замирает после пары пакетов данных.

Что меняет AmneziaWG

AmneziaWG (AWG) — форк WireGuard от команды Amnezia: криптография та же, меняется только внешний вид пакетов. Перед каждым рукопожатием инициатор, обычно клиент, отправляет с того же UDP-порта:

  • I1–I5 — сигнатурные пакеты: шаблоны байтов, имитирующие начало другого протокола, например DNS или QUIC;
  • затем Jc пакетов мусора случайного размера от Jmin до Jmax байт.

Меняются и сами пакеты WireGuard:

  • S1–S4 — случайный префикс к инициации, ответу, cookie и пакетам данных: размеры 148/92/64 перестают быть постоянными.
  • H1–H4 — замена номеров типов 1–4. С версии 2.0 это диапазоны, каждый пакет получает случайное значение.
  • HeaderProtectionKey (3.x) шифрует поля заголовков, которые у WireGuard идут открытым текстом. Nonce берётся из префикса, поэтому S1–S4 не меньше 12.
  • ContentPaddingAddition и RandomTrailers добавляют случайное число байтов, DisableCookies запрещает cookie-ответы, таймеры задаются диапазонами.

В итоге первый пакет потока — мусор или имитация другого протокола, а не рукопожатие WireGuard. На наших адресах именно это отличает рабочее подключение из России от нерабочего.

Совет: AmneziaWG с незаполненными параметрами — это обычный WireGuard: всё незаданное считается нулём, номера типов остаются 1–4, и блокируется такой «AWG» точно так же.

Версии протокола

  • 1.0 (конец 2023) — Jc, Jmin, Jmax, S1, S2, одиночные H1–H4.
  • 1.5 (июль 2025) — I1–I5.
  • 2.0 (сентябрь 2025, в приложении — январь 2026) — S3, S4 и диапазоны H.
  • 3.0 и 3.1 (июль–август 2026) — защита заголовков, случайные размеры и таймеры, в 3.1 — RandomTrailers и DisableCookies. Amnezia выпустила 3.1 после волны блокировок в июне–июле 2026 года и называет 2.0 уязвимой.

Клиент должен поддерживать версию конфига: 3.1 в старом приложении не заработает.

Какие параметры должны совпадать

Одинаковыми на сервере и клиенте должны быть S1–S4, H1–H4, HeaderProtectionKey и RandomTrailers. Различаться могут Jc, Jmin, Jmax, I1–I5, ContentPaddingAddition, таймеры и DisableCookies; мусор и сигнатурные пакеты разработчики советуют задавать только на клиенте.

Проверено на стенде: при расхождении в S1 или ключе заголовков рукопожатия нет совсем, при расхождении в S4 клиент показывает рукопожатие, но данные не идут.

Важно: не берите параметры из чужих инструкций. В профиле 2.0 одинаковые S и H на тысячах серверов снова становятся сигнатурой; в 3.1 защиту держит ключ заголовков, свой у каждого сервера.

Шаг 2. Установка через приложение AmneziaVPN

Дальше два пути: приложение (этот шаг) или вручную (шаг 3).

Подключите сервер

  1. Скачайте AmneziaVPN 5.0.3.0+ с amnezia.org или GitHub.
  2. Выберите «Настроить свой сервер» и введите IP, логин и пароль или приватный ключ (ED25519 или RSA в PEM).
  3. Режим «Автоматическая» ставит AmneziaWG.

Для входа не под root нужен sudo без пароля, как в документации Amnezia:

echo 'USERNAME ALL=(ALL) NOPASSWD:ALL' | sudo tee /etc/sudoers.d/USERNAME

Что приложение делает с сервером

  1. Проверяет права через sudo -n. Если работает apt, ждёт — на свежем VPS это обычно автообновления.
  2. Ставит Docker из репозитория дистрибутива (docker.io). С podman работать откажется.
  3. Создаёт docker-сеть amnezia-dns-net (172.29.172.0/24, мост amn0) и каталоги /opt/amnezia/<контейнер>.
  4. Меняет хост: включает ip_forward, запрещает ответ на ping, поднимает nf_conntrack_max до 262144, увеличивает буферы и включает hybla.
  5. Собирает контейнер amnezia-awg2 из amneziavpn/amneziawg-go — реализации на Go без модуля ядра. Контейнер работает с --privileged и --restart always, без логов, наружу — один UDP-порт.
  6. Внутри контейнера генерирует ключи, пишет /opt/amnezia/awg/awg0.conf, поднимает интерфейс и NAT, затем собирает профиль устройства.

Параметры по умолчанию — AWG 3.1: случайный UDP-порт 30000–49999, Jc 4–6, Jmin 10, Jmax 50, S1–S4 по 12 байт, H1–H4 = 1–4, свой HeaderProtectionKey, ContentPaddingAddition 10–100, включённые RandomTrailers и DisableCookies, таймеры диапазонами (RekeyAfterTime 100–120 с, KeepaliveTimeout 5–15 с, PersistentKeepalive 25–35 с). I1 — 44-байтный пакет, похожий на DNS-ответ.

Стандартные H1–H4 здесь не слабость: заголовки зашифрованы ключом, и документация Amnezia сама советует в этом режиме оставлять 1–4. Случайные H были маскировкой до версии 3.0.

Важно: после установки сервер не отвечает на ping. Это правило Amnezia, а не сбой хостинга; оно живёт до перезагрузки и возвращается при каждой установке или правке протокола. Убрать сразу: sudo iptables -D INPUT -p icmp --icmp-type echo-request -j DROP

Docker публикует UDP-порт в обход цепочки INPUT, поэтому ufw обычно не мешает, а внешний файрвол порт должен пропускать; документация Amnezia советует порт ниже 9999 — часть провайдеров режет UDP на высоких портах. Ключи и пользователи живут только в контейнере: удалили его — потеряли все подключения.

Какой протокол выбрать

  • AmneziaWG — основной: UDP, высокая скорость, умеренный расход батареи.
  • XRay (VLESS + Reality) — запасной: TCP 443, выручает, когда режут UDP. На серверах ForestsNet Cloud нельзя выдавать себя за чужой сайт, поэтому в SNI и dest указывайте свой домен, а не подставленный приложением, — см. Условия использования. VLESS с панелью — «3x-ui: установка и настройка VLESS + Reality».
  • WireGuard, OpenVPN, IKEv2 — только для сетей без DPI. OpenVPN over Cloak и over Shadowsocks в 5.x помечены как неподдерживаемые.

Сервисы — AmneziaDNS, SFTP, SOCKS5, прокси для Telegram (см. «MTProto-прокси для Telegram на своём сервере»). Сравнение протоколов — «Свой VPN на VPS: какой протокол выбрать».

Как раздать доступ и что с ограничениями

«Поделиться» работает в двух режимах:

  • Доступ к VPN без управления сервером — для людей: один протокол, одно устройство. Ключ vpn:// — для приложений Amnezia; для AmneziaWG и роутеров выгружайте «оригинальный формат AmneziaWG» — обычный .conf.
  • Полный доступ к серверу и VPN — в ключе лежат SSH-логин и пароль или приватный ключ, то есть сервер целиком. Отозвать его нельзя, только сменить доступ по SSH. Только для своих устройств.

На вкладке «Пользователи» видны последнее рукопожатие и трафик каждого подключения, там же их отзывают. Лимитов скорости, трафика и срока в приложении нет — нужна отдельная панель, например Remnawave для VLESS.

Важно: любое изменение серверных настроек протокола (порт, подсеть, обфускация) пересоздаёт контейнер, и все выданные подключения перестают работать.

Параметры и переход на 3.1

Параметры — в настройках сервера: «Протоколы» → AmneziaWG. Раздел сервера меняет порт, подсеть и обфускацию, раздел подключения — I1, мусор и MTU этого устройства.

Если AWG ставили до августа 2026 года, на сервере, скорее всего, 2.0. Переход по документации: обновить приложение, удалить AmneziaWG вместе с пользователями, установить заново на порт ниже 9999 и раздать доступ.

Шаг 3. Ручная установка AmneziaWG

Этот путь — если нужны модуль ядра вместо Docker и полный контроль над конфигами. Параметры те же, что ставит приложение, поэтому клиентам нужна поддержка AWG 3: подойдут текущие AmneziaVPN и AmneziaWG.

Поставьте модуль ядра и утилиты

Сначала обновите систему и перезагрузитесь, если обновилось ядро. Ubuntu:

sudo apt update
sudo apt install -y software-properties-common python3-launchpadlib gnupg2 linux-headers-$(uname -r)
sudo add-apt-repository -y ppa:amnezia/ppa
sudo apt install -y amneziawg

Debian использует тот же PPA с веткой focal. Утилиты apt-key из официальной инструкции в Debian 13 нет, поэтому ключ подключаем через signed-by:

sudo apt update && sudo apt install -y curl gnupg linux-headers-$(uname -r)
sudo install -d -m 0755 /etc/apt/keyrings
curl -fsSL 'https://keyserver.ubuntu.com/pks/lookup?op=get&search=0x75C9DD72C799870E310542E24166F2C257290828' | sudo gpg --dearmor -o /etc/apt/keyrings/amnezia.gpg
echo 'deb [signed-by=/etc/apt/keyrings/amnezia.gpg] https://ppa.launchpadcontent.net/amnezia/ppa/ubuntu focal main' | sudo tee /etc/apt/sources.list.d/amnezia.list
sudo apt update && sudo apt install -y amneziawg

awg --version должен показать amneziawg-tools v3.1…, а sudo modprobe amneziawg пройти без ошибок; версия пакета 1.0.20210914-… о протоколе ничего не говорит. DKMS пересобирает модуль после обновления ядра, если есть его заголовки, — поставьте мета-пакет, например linux-headers-generic или linux-headers-amd64.

Совет: если модуль не собирается, awg-quick переключится на userspace-реализацию amneziawg-go, когда найдёт её в PATH. Она медленнее, но от ядра не зависит.

Сгенерируйте ключи и параметры

Дальше — под root в /etc/amnezia/amneziawg, пакет уже создал этот каталог с правами 700:

sudo -i
cd /etc/amnezia/amneziawg && umask 077
awg genkey | tee server.key | awg pubkey > server.pub
awg genkey | tee client1.key | awg pubkey > client1.pub
awg genpsk > client1.psk
awg genkey > hpk.key
r() { shuf -i "$1-$2" -n 1; }
while :; do
  S1=$(r 12 64); S2=$(r 12 64); S3=$(r 12 64); S4=$(r 12 24)
  [ $((S2 + 28)) -ne "$S3" ] && break
done
cat > common.txt <<EOF
S1 = $S1
S2 = $S2
S3 = $S3
S4 = $S4
H1 = 1
H2 = 2
H3 = 3
H4 = 4
HeaderProtectionKey = $(cat hpk.key)
RandomTrailers = on
EOF

common.txt — общий блок для сервера и всех клиентов. S не меньше 12, иначе ключ заголовков не примется; S4 добавляется к каждому пакету данных, поэтому он маленький. Цикл следит, чтобы служебные пакеты не совпали по размеру (92 + S2 ≠ 64 + S3) — приложение Amnezia проверяет то же. RandomTrailers включают с обеих сторон, иначе сервер отбросит удлинённое рукопожатие.

Соберите конфиг сервера

PORT=$(r 1025 9999); echo "$PORT" > port.txt
WAN=$(ip route get 1.1.1.1 | sed -n 's/.* dev \([^ ]*\).*/\1/p')
cat > awg0.conf <<EOF
[Interface]
Address = 10.66.66.1/24
ListenPort = $PORT
PrivateKey = $(cat server.key)
MTU = 1400
$(cat common.txt)
DisableCookies = on
PostUp = iptables -I FORWARD -i %i -j ACCEPT
PostUp = iptables -I FORWARD -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostUp = iptables -t nat -A POSTROUTING -s 10.66.66.0/24 -o $WAN -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
PostDown = iptables -t nat -D POSTROUTING -s 10.66.66.0/24 -o $WAN -j MASQUERADE

[Peer]
# client1
PublicKey = $(cat client1.pub)
PresharedKey = $(cat client1.psk)
AllowedIPs = 10.66.66.2/32
EOF
echo 'net.ipv4.ip_forward = 1' > /etc/sysctl.d/99-amneziawg.conf && sysctl --system
ufw allow "$PORT"/udp    # если включён ufw
systemctl enable --now awg-quick@awg0
  • Порт — случайный ниже 9999. WAN — внешний интерфейс: MASQUERADE на eth0 при реальном ens3 — частая причина «подключено, интернета нет».
  • MTU = 1400 оставляет запас под S4. Правила FORWARD стоят в начале цепочки, чтобы их не перехватили ufw и Docker.
  • Мусора и I1 на сервере нет — их отправляет клиент.

Соберите конфиг клиента

I1 собираем как DNS-ответ — по принципу приложения Amnezia, но со своим доменом, случайными ID и адресом. Вместо 203.0.113.10 подставьте IP вашего VPS:

dns_i1() {
  local q="" l
  for l in ${1//./ }; do
    q+=$(printf '%02x' "${#l}")$(printf '%s' "$l" | od -An -tx1 | tr -d ' \n')
  done
  echo "<r 2><b 0x81800001000100000000${q}0000010001c00c000100010000012c0004><r 4>"
}
SERVER_IP=203.0.113.10
cat > client1.conf <<EOF
[Interface]
PrivateKey = $(cat client1.key)
Address = 10.66.66.2/32
DNS = 1.1.1.1, 1.0.0.1
MTU = 1280
Jc = $(r 4 6)
Jmin = $(r 10 30)
Jmax = $(r 60 120)
I1 = $(dns_i1 yandex.ru)
$(cat common.txt)
ContentPaddingAddition = 10-100
RekeyAfterTime = 100-120
KeepaliveTimeout = 5-15

[Peer]
PublicKey = $(cat server.pub)
PresharedKey = $(cat client1.psk)
Endpoint = $SERVER_IP:$(cat port.txt)
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25-35
EOF
qrencode -t ansiutf8 < client1.conf

Мусор держим небольшим: крупный мобильные операторы пропускают хуже, а Jmax больше MTU ведёт к фрагментации. MTU = 1280 безопасен для мобильных сетей, ::/0 не пускает IPv6 мимо туннеля, qrencode ставится из apt.

Проверьте и добавьте клиентов

Готово: после импорта client1.conf на сервере в awg show awg0 появляется свежий latest handshake.

Новому клиенту сгенерируйте ключи и PSK, допишите в awg0.conf секцию [Peer] со следующим адресом (10.66.66.3/32) и выполните systemctl reload awg-quick@awg0 — изменения применятся через awg syncconf без обрыва соединений.

Профиль 2.0 для роутеров

Keenetic в стабильной ветке 5.1 и большинство сборок для OpenWrt понимают только параметры 2.0. Для них поднимите второй интерфейс awg1 с другими подсетью и портом, без HeaderProtectionKey, RandomTrailers, DisableCookies, ContentPaddingAddition и таймеров, с обычным PersistentKeepalive = 25. Защиту здесь дают случайные S и непересекающиеся диапазоны H:

while :; do
  S1=$(r 15 150); S2=$(r 15 150); S3=$(r 15 150); S4=$(r 12 32)
  [ $((S1 + 56)) -ne "$S2" ] && [ $((S2 + 28)) -ne "$S3" ] && [ $((S1 + 84)) -ne "$S3" ] && break
done
read -r a b c d e f g h <<< "$(shuf -i 5-2147483647 -n 8 | sort -n | tr '\n' ' ')"
printf 'S1 = %s\nS2 = %s\nS3 = %s\nS4 = %s\nH1 = %s-%s\nH2 = %s-%s\nH3 = %s-%s\nH4 = %s-%s\n' \
  "$S1" "$S2" "$S3" "$S4" "$a" "$b" "$c" "$d" "$e" "$f" "$g" "$h" > common-v2.txt

Шаг 4. Подключите клиентов

  • Windows — AmneziaWG 3.1.0 (MSI с GitHub) или AmneziaVPN 5.0.3.0.
  • macOS — AmneziaWG 3.1.4 из App Store или AmneziaVPN для macOS 13+.
  • Android — AmneziaWG 3.1.4 из Google Play (файл или QR) или AmneziaVPN, который ставится и на Android TV.
  • iOS — AmneziaWG 3.1.4 есть в российском App Store, в него импортируется .conf. AmneziaVPN там нет, а DefaultVPN от Amnezia управлять своим сервером не умеет.
  • Linux — awg-quick из того же PPA или AmneziaVPN.
  • Keenetic — S3, S4 и I1–I5 с KeeneticOS 5.1, AWG 3.1 пока только в тестовой 5.2 Alpha 11. Конфиг загружается в «Других подключениях», нужен компонент WireGuard VPN.
  • OpenWrt — сборки Slava-Shchipunov/awg-openwrt, на которые ссылается Amnezia: 2.0 для 23.05.6, 24.10.3–24.10.7 и 25.12.0–25.12.4, 3.1 — для 24.10.8 и 25.12.5.
  • GL.iNet — AWG 2.0 с прошивки 4.9. У MikroTik нативной поддержки нет, у Apple TV — официального клиента.

Диагностика

Обфускация или сеть

Смотрите на сервер во время подключения. При установке через приложение: sudo docker exec amnezia-awg2 awg show.

awg show awg0
tcpdump -ni any udp port "$(cat /etc/amnezia/amneziawg/port.txt)"
  • Пакеты не приходят — неверный IP или порт, закрытый порт, блокировка по пути. Проверьте с другой сети.
  • Пакеты приходят, сервер молчит — latest handshake нет, сервер не может их разобрать: не совпадают ключи, S1/S2, HeaderProtectionKey или RandomTrailers. Такие пакеты AWG отбрасывает молча, в логах пусто.
  • На сервере есть адрес клиента, но нет рукопожатия, а клиент «подключён» — у пира видны endpoint и байты в transfer, но нет latest handshake. Сервер ответил на рукопожатие, но не принимает данные: расходятся S3/S4 или H3/H4, либо DPI режет данные после рукопожатия.
  • Рукопожатие есть, счётчики растут, сайты не открываются — проблема за туннелем: NAT, форвардинг, DNS, MTU.

Симптом → причина → что сделать

  • Подключается, но нет трафика. Проверьте sysctl net.ipv4.ip_forward, интерфейс в MASQUERADE и счётчик правила: iptables -t nat -L POSTROUTING -v -n. Если данные идут несколько секунд и замирают, DPI режет поток после рукопожатия — смените I1.
  • Работает на Wi-Fi, но не на мобильном. Мобильные операторы строже к UDP. По замерам сообщества в 2026 году, у части операторов одного мусора мало: DNS-подобный I1 проходит, случайные байты — нет, а поддельный QUIC ТСПУ проверяет и отбрасывает. Поставьте MTU = 1280, попробуйте другой порт. При «белых списках» мобильного интернета зарубежный UDP не проходит вовсе — не поможет ни AWG, ни VLESS. Держите XRay запасным протоколом.
  • Скорость низкая. Мелкие запросы идут, а большие страницы встают — это MTU, снизьте его на клиенте. Контейнер Amnezia работает в userspace и на 1 vCPU упирается в процессор (top), модуль ядра быстрее. Если XRay по TCP заметно быстрее, оператор шейпит UDP.
  • Перестало работать после обновления. Сервер на 3.1, клиент старый — нужны AmneziaVPN от 5.0.1.5 или AmneziaWG 3.1 и новый конфиг. Line unrecognized — устарели amneziawg-tools. Module amneziawg not found после обновления ядра — DKMS не собрал модуль: dkms status, заголовки ядра, dkms autoinstall. Keenetic после обновления серверного модуля видит рукопожатие без данных — открытый issue #215, оставьте роутерам профиль 2.0.

Если не подключается ни из одной российской сети, а из-за рубежа работает, возможна блокировка IP. ForestsNet ежедневно проверяет адреса на блокировки ТСПУ — напишите в поддержку.

Безопасность и обслуживание

  • SSH — только по ключу: «Усиление SSH». AmneziaVPN хранит SSH-доступ к серверу — берегите устройство с ним как сам ключ.
  • Файрвол — в ufw сначала SSH, потом порт AWG: «Файрвол ufw: порты».
  • Обновления — держите AmneziaVPN свежим: в 5.0.1.5 закрыта уязвимость, найденная Positive Technologies. После apt upgrade с новым модулем перезагрузите сервер.
  • Ротация ключей — потерянное устройство отзовите сразу: удалите его [Peer] и выполните systemctl reload awg-quick@awg0. Ключ сервера и HeaderProtectionKey меняются только вместе с перевыпуском всех клиентских конфигов.
  • Бэкап — /etc/amnezia/amneziawg при ручной установке; в Docker ключи только в контейнере: sudo docker cp amnezia-awg2:/opt/amnezia/awg ./awg-backup.

Раздаёте VPN другим — закройте торренты: «Как заблокировать торренты на своём VPN или прокси». Остальное — в «Чеклисте базовой защиты VPS».

Источники