Скрипт для автоустановки AmneziaWG 2.0 на Ubuntu

Привет!

Поделюсь скриптом, который написал для автоматической установки и настройки AmneziaWG 2.0 на выделенном Ubuntu-сервере (24.04 / 25.10). Рассчитан на тех, кто хочет быстро поднять VPN одной командой на чистом сервере без глубоких знаний Linux, не упустив при этом важных моментов.

Что делает

  • Полная установка AmneziaWG 2.0 с нуля (PPA, DKMS, ядерный модуль)

  • Генерация параметров обфускации AWG 2.0 (H1–H4 ranges, S1–S4, I1 CPS, Jc/Jmin/Jmax)

  • Создание клиентских конфигов с QR-кодами

  • Настройка UFW, Fail2Ban, sysctl-харденинг

  • Обновление и оптимизация OS под железо сервера (BBR, буферы, swap)

  • Управление клиентами: add/remove/list/regen/backup/restore

Особенности

  • AWG 2.0: поддержка новых параметров протокола (H1–H4 ranges, S3–S4, I1–I5 CPS concealment)

  • State machine с resume: установка переживает ребуты сервера и продолжается с того же шага

  • Неинтерактивный режим: все параметры через CLI-флаги для автоматизации

  • Двуязычный: русская и английская версии скриптов

  • Один сервер — одна задача: скрипт считает VPN единственной задачей сервера и оптимизирует всё под это

Установка

wget -O install_amneziawg.sh https://raw.githubusercontent.com/bivlked/amneziawg-installer/main/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo ./install_amneziawg.sh

Или неинтерактивно:

sudo ./install_amneziawg.sh --port=51820 --disallow-ipv6 --route-amnezia --yes

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

sudo ./manage_amneziawg.sh add client2
sudo ./manage_amneziawg.sh list
sudo ./manage_amneziawg.sh remove client2

Ссылки

Буду рад вопросам и обратной связи. Если кто-то столкнётся с проблемами при установке — пишите, помогу разобраться.

Обновление: вышла v5.5.1

  • Полная поддержка AWG 2.0 (H1-H4 диапазоны, S1-S4, CPS)
  • Английская версия скрипта (install_amneziawg_en.sh)
  • Протестировано на Ubuntu 24.04 и 25.10

Написал подробную статью на английском с разбором того, как именно AWG 2.0 обходит DPI — динамические заголовки, padding,
имитация протоколов:

GitHub: GitHub - bivlked/amneziawg-installer: One-command installer & manager for AmneziaWG 2.0 VPN on Ubuntu 24.04 LTS — traffic obfuscation, auto-hardening, client management · GitHub

Ставится ли поверх уже установленной 1.0.ХХХХХХХХХХХ версии?

Нет, поверх не встанет. В 2.0 полностью поменялись параметры обфускации, конфиги несовместимы.

Нужно сначала удалить, потом заново:
sudo bash install_amneziawg.sh --uninstall
sudo bash install_amneziawg.sh

При удалении бэкап сохранится в /root/. После переустановки клиентам надо будет раздать новые конфиги, старые не подойдут.

Если 1.x ставилась не через этот скрипт, то сначала вручную снести amneziawg-dkms, amneziawg-tools и /etc/amnezia/.

а нет ли возможности все это собрать в докер контрейнере?

Любопытно, а dpi не сагрится на большое количество непонятного мусора в сторону одного ip?

Нет, скрипт ставит ядерный модуль через DKMS, из контейнера это не сделать. Зато kernel module даёт скорость почти как у обычного WireGuard. Docker-решения используют userspace (amneziawg-go), который заметно медленнее.
Если Docker принципиален — посмотри GitHub - AlexisHW/amneziawg-web-ui: Full-featured Web UI to setup and manage AmneziaWG in docker · GitHub или GitHub - w0rng/amnezia-wg-easy: The easiest way to run WireGuard VPN + Web-based Admin UI. · GitHub.

Первый AWG с разбегу не завёлся ни в докере, ни в LXC.

Наоборот, наконец-то что-то бездокерное! Прям огромный респект. Как кто-то в issues уже написал, тоже жду адаптацию под debian, понятно что мы вычищаем убунту от всякого, но (имхо) убунту всю не вычистить. :slight_smile:

Немного не понятна сложность с ppa’шками от убунты для дебиана, у амнезии же прописано в мануале, добавляем репы, добавляем ключи и точно такой же apt install amnezia.

Еще как пожелание изобрести ключ установки “без всего”, ну или, придумать как подсасывать конфиги. Конкретно чего хочется: настроил сервер А, с него манипулирую ключами, пользователями. Хочу сделать зеркальный сервер Б, да что бы конфиги синхронились rsync’ом (это уже самостоятельно) <= и вот для такого кейса сделать условный install_amneziawg.sh –empty который всё поставит, но ничего не настроит и в конце установки скажет: “положи папки /etc/amneziawg и /root/awg на место и перезагрузи сервер” и со следующего ребута бац, и у тебя зеркальный сервер (окей, айпишник endpoint’а нужно будет поменять руками, не проблема. Либо предусмотреть прописывание доменного имени, что бы при двух фулл-зеркальных серверов оставалось только A-запись махнуть если что-то с сервером А пойдет не так)

Мусор улетает только при подключении, несколько пакетов и всё, дальше обычный трафик. После handshake каждый пакет с рандомным заголовком и размером, фиксированного паттерна нет. Шифрованный UDP на один IP это нормальная история, так любой видеозвонок выглядит.

Спасибо)

Debian 12 и 13 уже в v5.6.0, тестирую сейчас.

По прашкам - PPA это Launchpad, там только Ubuntu codenames. Для Debian пришлось маппить: bookworm→focal, trixie→noble. Плюс Debian 12 ещё на старом .list формате, а 13-й уже на DEB822, linux-headers называются иначе, snapd/cloud-init нет - пришлось обернуть cleanup чтобы не падал. Мелочей набралось, но всё решаемо.

По --empty - пока такого нет. Но можно через backup/restore: ставишь на первом сервере, manage_amneziawg.sh backup, скидываешь tar.gz на второй, там обычная установка (–yes для неинтерактива) и manage_amneziawg.sh restore. Подхватит конфиги, ключи, клиентов.

С Endpoint нюанс - инсталлятор прописывает IP автоматически. Для failover через DNS нужно руками заменить на домен в клиентских конфигах. Поддержку домена при установке тоже можно добавить.

Закинь feature request в GitHub · Where software is built, так проще отслеживать.

@413xk, все три issue закрыты)

  • syncconf вместо restart — add/remove клиентов больше не роняет туннель (#19)
  • Endpoint при установке — спрашивает IP или домен, пишет в конфиги (#20)
  • –no-tweaks — ставит AWG без оптимизаций сервера, для тех у кого уже настроено (#21)

Debian 12 и 13 протестированы, всё работает. В заголовке “на Ubuntu” уже неправда)

Ещё из нового в v5.7.1:

  • vpn:// URI — генерирует ссылки для импорта в Amnezia Client одним тапом
  • stats — статистика по клиентам (трафик, хендшейки), есть --json
  • –expires — временные клиенты (–expires=7d), автоудаление по крону

CHANGELOG: amneziawg-installer/CHANGELOG.md at main · bivlked/amneziawg-installer · GitHub

Накопилось за три недели - 10 релизов, сейчас v5.7.11.

Главное - разобрался с kernel panic при быстрых add/remove клиентов. 413xk
(segfault / kernelpanic на debian12 при управлении пользователями · Issue #27 · bivlked/amneziawg-installer · GitHub) поймал, Fourdot-co
(kernel panic · Issue #29 · bivlked/amneziawg-installer · GitHub, луктуд зфтшс (kernel panic) · Issue #30 · bivlked/amneziawg-installer · GitHub)
залез в C-код модуля и нашёл deadlock в обфускации пакетов. Баг в самом ядерном модуле (upstream
peer_remove_after_dead deadlocks on flush_workqueue(wg-kex) waiting for in-flight wg_packet_handshake_send_worker during peer removal · Issue #146 · amnezia-vpn/amneziawg-linux-kernel-module · GitHub), не в скрипте. Обошёл так:

  • timeout на syncconf - если модуль повис, fallback на restart
  • –apply-mode=restart - рестарт вместо syncconf для тех у кого падает
  • batch add/remove - manage add client1 client2 client3, один syncconf вместо трёх

Ещё из важного:

CHANGELOG: https://github.com/bivlked/amneziawg-installer/blob/main/CHANGELOG.md ·
https://github.com/bivlked/amneziawg-installer 180★

За 17 дней две большие фичи заехали в скрипт.

ARM (v5.9.0, 15 апр) — Raspberry Pi 3B+/4/5, Oracle Cloud Ampere free tier, Hetzner CAX. Prebuilt .deb с kernel-модулем AWG 2.0 под arm64 — ставятся без DKMS сборки на сервере. QEMU build в CI, SHA256 в отдельном arm-packages релизе.

Mobile preset (v5.10.0, 17 апр) — флаг --preset=mobile выставляет Jc=3 + узкий Jmax (Jmin+20..80). Это база под мобильные DPI, но I1 (CPS) часто всё равно требует ручной правки под оператора. Живая карта из отчётов в issues:

  • Yota — binary длинный, <b 0xce...>
  • Beeline — дефолтный случайный <r N>
  • Tattelecom LTE<r 64>
  • Tele2 Москва — binary QUIC, <b 0xc700000001>...
  • Tele2 Красноярск — отсутствие I1 (AWG 1.0 fallback)
  • Мегафон Москва<r 64>
  • Мегафон, регионы — отсутствие I1

Единого I1 под всю РФ нет — DPI у региональных веток ведёт себя по-разному. Под Tele2 Красноярск и Мегафон в регионах готовлю --preset=mobile-awg1 (Jc=3 + пустой I1), в v5.12.x — один флаг без ручной правки.

Про тестирование обфускации на мобиле. Handshake инициирует клиент, оператор смотрит исходящие с телефона байты — junk-пакеты (Jc штук), I1, handshake_initiation. Сервер можно держать с дефолтами, а на каждом телефоне — свой клиентский .conf под оператора. Не надо переустанавливать сервер для перебора параметров — меняется только файл на устройстве.

Скрипт: GitHub - bivlked/amneziawg-installer: One-command install script for self-hosted AmneziaWG 2.0 VPN — Ubuntu & Debian, DPI bypass, traffic obfuscation, auto-hardening, client management · GitHub
Последний релиз: v5.10.2 (20 апр). Под капотом за этот период: H1-H4 randomization, SHA256 верификация скачиваемых helper-скриптов, tar pre-extraction validation, 146 bats тестов.

За эту неделю вышли два релиза — v5.11.0 и v5.11.1.

v5.11.0 — robustness (22 апр)

Закрыл кучу сценариев, где install или manage на сбое оставляли систему полу-настроенной:

  • Двойной запуск install без reboot больше не ломает DKMS (guard по boot_id).

  • Прерванное скачивание awg_common.sh/manage_amneziawg.sh не оставляет полу-файл — через mktemp + SHA256 + atomic mv.

  • gpg --dearmor теперь работает под cloud-init, Ansible и non-interactive SSH (--batch --no-tty --yes).

  • restore_backup откатывается на ошибке — snapshot перед destructive, trap на все пути.

  • regenerate_client/modify_client под flock, параллельные вызовы не рушат клиентский конфиг.

  • CI ARM-матрица теперь включает Ubuntu 25.10 и Debian 13 prebuilt-пакеты.

v5.11.1 — manage UX (23 апр)

Три фичи для тех, кто держит AmneziaWG без моего installer’а (например, amneziawg-go userspace в LXC). Спасибо @Akh-commits за подробный live-тест в Issue #51.

  • manage add/regen больше не требуют server_public.key — хелпер восстанавливает его из PrivateKey в awg0.conf.

  • В LXC без egress manage add берёт первый IPv4 с global-scope интерфейса как fallback, если curl до ifconfig.me/etc. не проходит.

  • Новый флаг manage add --psk — опциональный PresharedKey. По умолчанию выключен, AWG 2.0 и так даёт достаточно обфускации.

Тестов — 251 bats (сотней больше, чем на v5.10.2). Breaking changes нет, откат на v5.10.2 безопасный.

Апгрейд с 5.10.x / 5.11.0 одной командой:

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.11.1/install_amneziawg.sh
sudo bash install_amneziawg.sh --yes

Повторный запуск на уже развёрнутом сервере ничего не тронет — сервис и клиентские конфиги сохранятся.

Баги/предложения — сюда в тред или Issues · bivlked/amneziawg-installer · GitHub.

Давно не обновлял тему, а за это время накопилось прилично, дошёл уже до v5.15.0.

Главное - dual-stack IPv6 внутри туннеля (v5.15.0, сегодня). Это была самая запрашиваемая фича (issue #24): теперь клиент получает IPv6-адрес рядом с IPv4, включается флагом --allow-ipv6-tunnel. Если на сервере есть нативный IPv6 - ходишь в IPv6-интернет через туннель; если нет - IPv6 поднимается хотя бы между клиентами внутри, без чёрной дыры. Удобно как раз для ресурсов на IPv6-only (та же ntc.party). По умолчанию выключено, старые установки не трогает.

Из остального, что заехало с весны:

  • Ubuntu 25.10 и 26.04 - чинил сборку модуля под свежие ядра (stale-headers + gcc-13), PPA откатывается на noble, когда для questing пакетов ещё нет.

  • SSH на нестандартном порту больше не приводит к локауту UFW (#91): скрипт сам определяет порт из ss, а не верит дефолтному 22.

  • Куча мелочей по надёжности: отказ от UFW в интерактиве больше не валит установку, cleanup перестал задевать DHCP на 26.04.

  • В доках набил полевых данных по мобильным операторам и по тому, как ТСПУ режет по сети хостера (handshake проходит, а трафик потом умирает - смотреть надо на AS назначения, а не на протокол).

Ссылка та же: GitHub - bivlked/amneziawg-installer: One-command install script for self-hosted AmneziaWG 2.0 VPN — Ubuntu & Debian, DPI bypass, traffic obfuscation, auto-hardening, client management · GitHub

Накатил v5.17.0. Добавил в фаервол MSS-clamp - режет анонсируемый TCP MSS под MTU туннеля (TCPMSS --set-mss в mangle FORWARD, в обе стороны; 1240 для v4, 1220 для v6).

Лечит PMTUD-блэкхол: когда по пути режется ICMP “fragmentation needed”, крупные сегменты с DF молча тонут на 1280-туннеле, и тяжёлые страницы и закачки виснут. У меня вылезало в основном на мобиле, реже при двойном NAT и в каскаде. Только сервер, на клиенте ничего не трогать.

подскажите, пожалуйста, когда добавите проброс параметров l2-l5 из конфига сервера внутрь клиетских конфигов?

Уже добавил - вышло в v5.18.0 на днях. Теперь весь набор I1-I5 из awg0.conf доходит до клиентов и в .conf, и в vpn://, не только I1. Прописываешь I2-I5 в секции [Interface] серверного awg0.conf, дальше manage regen разносит по всем клиентам. Раньше I2-I5 в vpn:// уходили пустыми, а в .conf вообще не попадали - вот это и починил. Спасибо, что подтолкнул.

А может в таком случае сначала обновиться из PPA до последней версии? Вручную, с помощью apt или dpkg

В Index of /amnezia/ppa/ubuntu/pool/main/a лежат пакеты версии 1.0, но внутри похоже находится 2.0, на конфиг не ругается, дополнительные параметры обфускации принимает.