Поделюсь скриптом, который написал для автоматической установки и настройки AmneziaWG 2.0 на выделенном Ubuntu-сервере (24.04 / 25.10). Рассчитан на тех, кто хочет быстро поднять VPN одной командой на чистом сервере без глубоких знаний Linux, не упустив при этом важных моментов.
Что делает
Полная установка AmneziaWG 2.0 с нуля (PPA, DKMS, ядерный модуль)
Наоборот, наконец-то что-то бездокерное! Прям огромный респект. Как кто-то в issues уже написал, тоже жду адаптацию под debian, понятно что мы вычищаем убунту от всякого, но (имхо) убунту всю не вычистить.
Немного не понятна сложность с ppa’шками от убунты для дебиана, у амнезии же прописано в мануале, добавляем репы, добавляем ключи и точно такой же apt install amnezia.
Еще как пожелание изобрести ключ установки “без всего”, ну или, придумать как подсасывать конфиги. Конкретно чего хочется: настроил сервер А, с него манипулирую ключами, пользователями. Хочу сделать зеркальный сервер Б, да что бы конфиги синхронились rsync’ом (это уже самостоятельно) <= и вот для такого кейса сделать условный install_amneziawg.sh –empty который всё поставит, но ничего не настроит и в конце установки скажет: “положи папки /etc/amneziawg и /root/awg на место и перезагрузи сервер” и со следующего ребута бац, и у тебя зеркальный сервер (окей, айпишник endpoint’а нужно будет поменять руками, не проблема. Либо предусмотреть прописывание доменного имени, что бы при двух фулл-зеркальных серверов оставалось только A-запись махнуть если что-то с сервером А пойдет не так)
Мусор улетает только при подключении, несколько пакетов и всё, дальше обычный трафик. После handshake каждый пакет с рандомным заголовком и размером, фиксированного паттерна нет. Шифрованный UDP на один IP это нормальная история, так любой видеозвонок выглядит.
По прашкам - 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 нужно руками заменить на домен в клиентских конфигах. Поддержку домена при установке тоже можно добавить.
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 под оператора. Не надо переустанавливать сервер для перебора параметров — меняется только файл на устройстве.
За эту неделю вышли два релиза — 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 безопасный.
Давно не обновлял тему, а за это время накопилось прилично, дошёл уже до 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 назначения, а не на протокол).
Накатил v5.17.0. Добавил в фаервол MSS-clamp - режет анонсируемый TCP MSS под MTU туннеля (TCPMSS --set-mss в mangle FORWARD, в обе стороны; 1240 для v4, 1220 для v6).
Лечит PMTUD-блэкхол: когда по пути режется ICMP “fragmentation needed”, крупные сегменты с DF молча тонут на 1280-туннеле, и тяжёлые страницы и закачки виснут. У меня вылезало в основном на мобиле, реже при двойном NAT и в каскаде. Только сервер, на клиенте ничего не трогать.
Уже добавил - вышло в 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, на конфиг не ругается, дополнительные параметры обфускации принимает.