amneziawg-installer/CHANGELOG.md
Ivan Bondarev 702d3aff5b
Some checks failed
Docs consistency / docs-consistency (push) Has been cancelled
ShellCheck / Lint and syntax check (push) Has been cancelled
Tests / unit-tests (push) Has been cancelled
Release v5.18.1: --force port change, full-tunnel iOS ::/0, dual DNS, low ports
Bug-fix release. Four fixes plus documentation.

- install --force --port=N now changes the server port (was silently ignored: the render re-read the old ListenPort).
- full-tunnel clients get 0.0.0.0/0, ::/0 so AmneziaVPN on iOS accepts the all-traffic mode; manage regen upgrades non-customized clients too.
- default client DNS is now the 1.1.1.1, 1.0.0.1 pair.
- --port accepts ports 1-65535 (was 1024-65535) so 443/80/53 work for DPI evasion on mobile carriers.

Docs: CHANGELOG, S3/S4 range fix, stale issue link cleanup, Ubuntu 26.04 in the subtitle, --force re-run FAQ, a mobile-port note.
Live-tested on Debian 13 (x86_64) and Ubuntu 26.04 (ARM64, native IPv6).
2026-06-28 09:20:07 +03:00

205 KiB
Raw Blame History

RU Русский | EN English

Changelog

Все заметные изменения в проекте документируются в этом файле.

Формат основан на Keep a Changelog.


Unreleased


5.18.1 - 2026-06-27

v5.18.1 - багфикс-релиз. Исправлен --port при повторной установке: install --force --port=N теперь действительно меняет порт сервера (раньше новый порт молча игнорировался). Полнотуннельные клиенты получают 0.0.0.0/0, ::/0, чтобы AmneziaVPN на iOS принимал режим «весь трафик». DNS по умолчанию - пара резолверов 1.1.1.1, 1.0.0.1. --port теперь принимает любой порт 1-65535, в том числе 443 (полезно для мобильных операторов, режущих нестандартный высокий UDP-порт). Плюс правки документации. Поведение существующих установок и подключённых клиентов не меняется; улучшения применяются к новым и перевыпущенным (manage regen) конфигам. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Исправлено

  • install --force --port=N теперь меняет порт сервера. Прежде новый порт молча игнорировался: при рендере серверного конфига порт перечитывался из старого awg0.conf и затирал значение, переданное в --port. Теперь порт для нового конфига берётся из сохранённых параметров установки (намерение пользователя), что корректно переживает перезагрузки в ходе --force. Клиентский regen не затронут - он по-прежнему читает порт из живого awg0.conf
  • Полнотуннельные клиенты (AllowedIPs = 0.0.0.0/0) теперь получают 0.0.0.0/0, ::/0. AmneziaVPN на iOS при голом 0.0.0.0/0 считал конфиг незавершённым раздельным туннелированием и не поднимал туннель. ::/0 направляет IPv6 в туннель (и отсекает его, если у сервера нет нативного IPv6) - мимо VPN ничего не утекает. Раздельное туннелирование (кастомный список маршрутов) не затрагивается

Изменено

  • DNS по умолчанию в клиентских конфигах - пара 1.1.1.1, 1.0.0.1 вместо одного резолвера (резервный DNS на случай недоступности первого)
  • --port принимает порты 1-65535 (раньше только 1024-65535). Низкие порты вроде 443/80/53 помогают обходить DPI у мобильных операторов: например, МТС глушит нестандартный высокий UDP-порт, но пропускает 443/udp. VPN-сервис работает под root, поэтому привилегированные порты биндятся штатно

Документация

  • ADVANCED: исправлен диапазон S3/S4 в примере минимального конфига (S3: 0-64, S4: 0-32 вместо неверного 0-127); убрана устаревшая привязка раздела про активное зондирование к уже закрытому issue #71; добавлены заметки про мобильный порт и про прямой IPv6-трафик в обход туннеля
  • README: в подзаголовок добавлена Ubuntu 26.04; в FAQ про повторный запуск уточнён гейт --force

Тесты

  • Добавлен tests/test_v5181_bugfix.bats - порт из сохранённых параметров побеждает старый awg0.conf при рендере; полнотуннельный клиент получает ::/0, раздельный - нет; DNS-пара по умолчанию; RU/EN-паритет всех трёх правок

5.18.0 - 2026-06-26

v5.18.0 - параметры special-junk I2-I5 теперь доходят до клиентов. Раньше до клиентского конфига доходил только I1, а I2-I5 жёстко уходили пустыми в vpn:// и вообще не попадали в .conf - даже если администратор прописывал их в awg0.conf, до клиента они не доезжали. Теперь все пять CPS-параметров переносятся в клиентский .conf, QR и vpn://-ссылку. Рабочий процесс: задать I2-I5 в [Interface] файла awg0.conf, перезапустить сервис и раздать клиентам через manage regen. Новых флагов установки нет; если I2-I5 не заданы, поведение идентично прежнему. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM (issue #71).

Добавлено

  • Перенос I1-I5 (а не только I1) из серверного awg0.conf в клиентские конфиги при генерации и regen: парсер живого конфига читает I2-I5, рендер клиентского .conf дописывает заданные значения, а в vpn://-ссылке прежние захардкоженные пустые I2-I5 заменены реальными. Значения переносятся как есть, формат тегов (<r N>, <b 0xHEX>, <c>, <t>) администратор задаёт сам - см. список VoidWaifu. I2-I5 опциональны и независимы: незаданные просто не выводятся
  • Параметры наследуют семантику сохранения от остальной обфускации: --force без --preset/--jc/--jmin/--jmax читает I2-I5 из живого awg0.conf и сохраняет их; --preset/--jc перегенерируют весь набор обфускации и заданные вручную I2-I5 при этом сбрасываются (как и H1-H4/S1-S4/I1)

Тесты

  • Добавлен tests/test_v5180_i2i5_passthrough.bats - парсинг I2-I5 из awg0.conf, защита от утечки stale-значений между вызовами, рендер клиентского .conf (наличие при заданных, отсутствие при пустых) и реальный декод vpn:// (значения присутствуют и в структурных полях, и во встроенном сыром конфиге), плюс RU/EN-паритет всех затронутых мест

5.17.0 - 2026-06-24

v5.17.0 - в фаервол сервера добавлен MSS-clamp: фиксирует размер TCP-сегментов под туннельный MTU, чтобы крупные страницы и закачки не зависали на путях с фильтрованным ICMP (мобильные сети, double-NAT, каскад из двух серверов). Поведение установки в остальном не меняется; обновление существующего сервера - повторный запуск установщика. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Добавлено

  • MSS/PMTU-clamp в PostUp/PostDown серверного конфига: правило TCPMSS --set-mss в таблице mangle цепочки FORWARD ограничивает анонсируемый TCP MSS до туннель-безопасного значения в обе стороны (-o %i и -i %i). Это устраняет PMTUD-блэкхол - когда ICMP «Fragmentation needed» фильтруется по пути, крупные TCP-сегменты с выставленным DF молча отбрасываются на 1280-туннеле, и страница или закачка зависает. Частая жалоба на мобильных операторах, при двойном NAT и в каскадных схемах
  • Значение MSS вычисляется из AWG_MTU в момент генерации конфига (IPv4: MTU-40 = 1240, IPv6: MTU-60 = 1220); ручная смена MTU подхватывается повторным запуском установщика с --force. IPv6-правила добавляются только когда включён IPv6-туннель. Дополняет имеющийся консервативный MTU = 1280, не заменяя его

Тесты

  • Добавлен tests/test_v5170_mss_clamp.bats - проверяет наличие правил в обе стороны, зеркальный -D в PostDown, IPv6-гейтинг и авто-вывод MSS из AWG_MTU

5.16.1 - 2026-06-16

v5.16.1 - bugfix-релиз: устранён разрыв VPN на iOS в режиме маршрутизации по умолчанию. В остальном поведение установки не меняется. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Исправлено

  • iOS: в режиме маршрутизации по умолчанию (mode 2, «Список Amnezia+DNS») туннель поднимался, но через ~10 секунд трафик пропадал (симптом легко спутать с DPI). Причина - список AllowedIPs начинался с диапазона 0.0.0.0/5, который включает служебный 0.0.0.0/8; ядро iOS спотыкается на этом блоке и не доходит до остальных маршрутов. Первый диапазон разбит на 1.0.0.0/8, 2.0.0.0/7, 4.0.0.0/6 - тот же охват без проблемного нулевого блока, split-tunnel сохраняется. Разобрался и предложил фикс @LiaNdrY (Issue #42)
  • Сообщение об ошибке --expires теперь перечисляет 30d среди допустимых форматов (совпадает с выводом --help)

Документация

  • README и ADVANCED (RU + EN): добавлен FAQ про iOS-разрыв с инструкцией для уже установленных серверов (до v5.16.1)
  • Каскад (CASCADE.md / CASCADE.en.md): в примере клиентского конфига порт Endpoint исправлен на дефолтный для этого установщика 39743 (был 51820 из стандартного WireGuard); в диагностике убрана ссылка на несуществующий drop-in after-awg1.conf - проверка автозапуска теперь указывает на юнит awg-routing.service; в шаге 1 убран дублирующий абзац
  • Полный аудит документации: устранены мелкие неточности (дублированная строка-указатель в ADVANCED.en.md, рассинхрон якоря install-ссылки между README RU и EN, формулировка про импорт файлов в INSTALL_VPS.md)

CI

  • ShellCheck-workflow («Lint and syntax check») больше не фильтруется по путям: обязательный статус-чек срабатывает и на docs-only PR, не блокируя их (раньше требовался admin-override)

Тесты

  • Добавлен tests/test_v5161_ios_allowedips.bats - структурная защита mode-2 списка от возврата к 0.0.0.0/5

5.16.0 - 2026-06-12

v5.16.0 - закалка безопасности и надёжности по итогам полного аудита кода. Релиз закрывает находки полного ревью всех шести скриптов инсталлера AmneziaWG 2.0 VPN для Ubuntu и Debian: устранено окно потери пиров при --force reinstall, секреты убраны из argv, GPG-ключ PPA закреплён по полному fingerprint, валидатор AWG-параметров проверяет непересечение H1-H4, а истёкшие orphan-клиенты больше не зацикливают cron. Поведение установки по умолчанию не меняется. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Безопасность

  • Реестр временных файлов перенесён из общедоступного /tmp в $AWG_DIR (0700): предсказуемое имя в /tmp позволяло локальному пользователю подложить список чужих путей, которые cleanup удалил бы от root; чтение реестра дополнительно защищено от symlink-подмены
  • Приватные ключи (клиентские и серверные) создаются сразу с правами 0600 через umask 077 - убрано короткое окно world-readable между записью и chmod; каталог keys/ создаётся с 0700
  • Приватный ключ клиента и PSK передаются в perl-генератор vpn:// URI через переменные окружения, а не через argv (командная строка процесса видна всем пользователям в /proc/<pid>/cmdline)
  • GPG-ключ Amnezia PPA запрашивается по полному 40-символьному fingerprint вместо короткого 32-битного ID (для коротких ID существуют коллизии evil32) и сверяется с пином после скачивания
  • uninstall больше не удаляет пакет fail2ban, если тот стоял до установщика (маркер .fail2ban_installed_by_installer, симметрично UFW-маркеру); чужой fail2ban перезапускается без нашего jail
  • uninstall удаляет из /etc/sysctl.conf только точные строки legacy-версий инсталлятора, а не любую строку с disable_ipv6 (раньше мог снести пользовательские настройки)
  • Библиотечные функции generate_client / add_peer_to_server / remove_peer_from_server / regenerate_client валидируют имя клиента самостоятельно (defense-in-depth для cron и сторонних скриптов, сорсящих библиотеку)

Исправлено

  • Шаг 6: перенос существующих [Peer]-блоков теперь происходит внутри одной атомарной записи серверного конфига (render_server_config доклеивает пиры до mv). Раньше сбой между render и append оставлял конфиг без пиров, а повторный запуск шага бэкапил уже безпировый файл - все клиенты терялись при --force reinstall
  • remove_peer_from_server проверяет код возврата awk и наличие [Interface] в результате перед заменой серверного конфига - сбой awk при переполнении диска больше не может атомарно заменить рабочий конфиг битым
  • Истёкший клиент, чей peer уже удалён из конфига вручную или после restore (orphan-метка expiry), теперь корректно зачищается: раньше cron каждые 5 минут вечно повторял неудачное удаление, а артефакты клиента не освобождались
  • regen восстанавливает PresharedKey из серверного конфига, если клиентский .conf утерян - раньше пересозданный конфиг выходил без PSK при живом PSK на сервере, и handshake молча ломался
  • Кэш определения внешнего IP реально работает (файловый, переживает subshell): раньше присваивание в $(...) терялось, и regen всех клиентов делал полный curl-раунд (до 6 сервисов по 5 сек) на каждого клиента
  • validate_awg_config проверяет попарное непересечение диапазонов H1-H4 (ключевой инвариант AWG 2.0) и парсит параметры так же, как загрузчик: произвольные пробелы вокруг =, last-wins при дублях - вручную поправленный Jc=4 больше не даёт ложное "параметр не найден"
  • Генерация H1-H4 гарантирует строгий зазор между диапазонами (исключено касание границ) и нижнюю границу >= 5 (значения 1-4 зарезервированы протоколом WireGuard)
  • --apply-mode валидируется при разборе аргументов: опечатка вроде --apply-mode=restrat раньше молча работала как syncconf
  • --diagnostic проверяет root до начала работы (раньше под обычным пользователем падал на каждой записи лога и завершался ложным успехом)
  • Debian 12: ремонт PPA-файла при несовпадении suite распространён на traditional .list формат (раньше покрывался только DEB822 .sources)
  • Шаг 2: ранний apt update толерантен к ошибкам PPA Amnezia - оставшийся на диске PPA-файл с битым suite (404 Release) больше не убивает установку ДО срабатывания ремонта (живое репро на Debian 12); ошибки базовых репозиториев по-прежнему фатальны
  • check: при неопределённом порте проверка правила UFW пропускается (раньше выводился бессмысленный warning про 0/udp)
  • list: повреждённый expiry-файл больше не вызывает ошибку bash-арифметики в таблице
  • generate_vpn_uri проверяет, что порт числовой, до генерации URI (пустой порт давал синтаксически битый JSON, который Amnezia Client молча не импортировал)
  • Сообщение об ошибке определения внешнего IP в manage add больше не советует несуществующий у manage флаг --endpoint

Улучшено

  • Шаги 1-2 инсталлятора не гоняют apt-get update повторно без смены источников (экономия 10-60 секунд на прогон на медленных зеркалах, до двух лишних прогонов на установку)
  • backup дополнительно берёт конфиг-лок: параллельный add/remove больше не может дать рассинхронизированный набор файлов в бэкапе
  • Интерактивный ввод порта и подсети при установке повторяет запрос при опечатке вместо аварийного завершения
  • При переустановке с --preset/--jc/--jmin/--jmax выводится явное предупреждение, что перегенерируется ВЕСЬ набор параметров обфускации и существующие клиентские конфиги потребуют regen (сообщение idempotency-guard тоже уточнено)
  • setup_fail2ban предупреждает, если UFW не активен (баны banaction=ufw в этом случае фактически не действуют)
  • Классификация ошибок apt-get update игнорирует заведомо информационные строки W: Target ... is configured multiple times и W: ... legacy trusted.gpg - они больше не превращают tolerable-сбой в ложный fatal
  • diagnose делает один вызов awg show вместо четырёх; stats не вызывает date на каждого пира; list --json не читает expiry-файлы (поле в JSON не выводится)
  • cron-задача expiry вызывает cleanup временных файлов (устранена утечка файла-реестра на каждое срабатывание)
  • Fallback генератора случайных чисел (при недоступном /dev/urandom) покрывает полный 31-битный диапазон вместо 30 бит
  • Справка manage: regen документирует приём нескольких имён, у repair-module указан алиас repair; сообщение о создании клиента упоминает .png только если QR реально создан
  • Удалён мёртвый код: недостижимая ветка help) в диспетчере manage, недостижимый return после request_reboot в инсталлере, два избыточных re-export AWG_APPLY_MODE, устаревшие shellcheck-директивы
  • CI/релизные скрипты: update-sha-pins.sh сохраняет права файла при перезаписи; build-arm-deb.sh показывает stderr при сбое xz; build-release-notes.sh валидирует формат версии до интерполяции в awk

5.15.6 - 2026-06-08

v5.15.6 - проверки ввода, атомарность файловых операций и машиночитаемое поле статуса в JSON. Релиз продолжает цикл закрепления по итогам аудита кода: усилены проверки ввода в manage, запись клиентских артефактов сделана атомарной, аккуратнее обрабатываются прерывания, в list/stats --json добавлено стабильное машиночитаемое поле status_code. Поведение установки по умолчанию не меняется. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Добавлено

  • list --json и stats --json теперь отдают дополнительное поле status_code со стабильным, не зависящим от языка значением (active | recent | inactive | no_handshake | key_error | no_data). Прежнее локализованное поле status сохранено - изменение аддитивное и обратно совместимое, удобно для jq и автоматизации (контракт описан в ADVANCED.md)

Улучшено

  • manage modify <клиент> проверяет каждый DNS как настоящий IPv4/IPv6-адрес (через общие _valid_ipv4/_valid_ipv6), а не только набор символов: значения вроде abc или 999.999.999.999 больше не принимаются. Та же проверка диапазона октетов (0-255) применяется к автоопределённому публичному IP сервера
  • Длительность --expires проверяется один раз до создания клиента: при некорректном значении команда прекращается заранее, ничего не меняя. Сбой записи срока после создания теперь явно отражается в коде возврата и логе
  • Флаг --psk трактуется как явный запрос на ключ: при невозможности сгенерировать PSK команда завершается с ошибкой и не создаёт артефакты вместо тихого перехода к клиенту без PSK
  • Запись .vpnuri и временных PNG для QR-кодов идёт через общий механизм безопасных временных файлов с атомарным mv, поэтому прерывание в момент записи не оставит пустой или усечённый файл. Удаление клиента (ручное и автоматическое по истечении срока) использует единый помощник, охватывающий все артефакты клиента
  • Cron автоудаления истёкших клиентов сверяется по содержимому и обновляется при смене рабочего каталога (например, после восстановления из бэкапа), а не только по факту наличия файла
  • Восстановление из бэкапа проверяет наличие серверного конфига до остановки сервиса (прерывание не трогает рабочую систему), а пустой каталог клиентов воспринимается как корректный сценарий
  • Прерывание по Ctrl+C или сигналу завершает скрипт с корректным кодом (130/143), не продолжая выполнение после прерванной операции; восстановление из бэкапа при прерывании по-прежнему откатывается

Документация

  • Встроенная справка установщика и таблицы опций в ADVANCED.md: --endpoint принимает FQDN, IPv4 или [IPv6]; уточнено, что --no-tweaks всё равно применяет минимальный forwarding-sysctl
  • Таблицы команд в README.md дополнены diagnose и repair-module
  • Описана поддержка ARM для Ubuntu 26.04 (сборка через DKMS); согласованность матрицы ОС, архитектур и готовых пакетов теперь проверяется автоматически

Тесты

  • Расширено покрытие автотестами (bats): валидаторы ввода, атомарность файловых операций, обработка сигналов, контракт поля status_code

5.15.5 - 2026-06-07

v5.15.5 - багфикс fail2ban на Ubuntu 24.04 (спасибо @stereomonk).

Исправлено

  • fail2ban не стартовал на минимальной Ubuntu 24.04 без rsyslog ("Have not found any log file for sshd jail"): jail sshd теперь использует backend = systemd и на Ubuntu, как на Debian с v5.7.12 (PR #106, спасибо @stereomonk)
  • Статус fail2ban после перезапуска проверяется честно: systemctl restart возвращает 0, даже если сервис падает сразу после старта, поэтому установщик рапортовал успех на упавшем сервисе. Теперь состояние проверяется через systemctl is-active (PR #106)

5.15.4 - 2026-06-06

v5.15.4 - сопроводительный релиз: новый раздел документации про недоступность хостера из России (блокировка по автономной системе) и обход через I1/CPS, плюс служебные правки. Поведение установки по умолчанию и матрица поддержки не меняются.

Документация

  • ADVANCED: новый раздел про блокировку хостера по автономной системе (AS). Описаны симптом (рукопожатие проходит, затем трафик встаёт), механизм отсечения по AS на стороне сети оператора и обход через маскировку I1/CPS под QUIC с разрешённым SNI. Раздел включает полевые наблюдения по нескольким операторам и ссылки на профильное обсуждение (Issue #71).

Внутреннее

  • Имена двух bats-тестов приведены к ASCII. Полный набор из 790 проверок теперь исполняется и на bats под Windows (раньше два теста с не-ASCII именами там пропускались); на Linux-CI набор всегда исполнялся целиком.

5.15.3 - 2026-06-04

v5.15.3 - укрепляющий релиз по итогам четырёх раундов внешнего аудита кода и документации. Новых функций нет: ужесточены валидаторы ввода установщика, исправлен ряд проблем корректности в manage, атомарность файловых операций и процесс релиза. Установка по умолчанию не меняется. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Исправлено

  • Ранние валидаторы установщика приведены к паритету с каноничными. Проверки порта, подсети, endpoint и списков CIDR на шаге 0 (до загрузки общей библиотеки) теперь отклоняют порт с ведущими нулями (0080 больше не принимается из-за восьмеричной интерпретации), числа длиннее 5 цифр (защита от 64-битного переполнения), неканоничные октеты подсети, краевые формы IPv6 в скобках ([:::], двойное ::) и переводы строки или пустые элементы в списках маршрутов.
  • --route-custom проверяется при первом запуске независимо от источника значения: некорректный список маршрутов останавливает установку до записи конфигурации.
  • Неизвестный аргумент командной строки завершает установщик с кодом 1 (раньше печатал справку и выходил с 0); явный --help по-прежнему возвращает 0.
  • manage restore устойчив к неполной резервной копии: восстановление с пустым набором ключей или урезанным бэкапом больше не удаляет действующих клиентов.
  • Повторный запуск установщика сохраняет всех существующих пиров и дефолтных клиентов при пере-генерации серверного конфига.
  • manage modify проверяет значения IP и CIDR по диапазонам, а не только по форме записи.
  • Атомарность файловых операций: временные файлы конфигов создаются на целевой файловой системе (так что mv действительно атомарен), QR-PNG клиента пишется через temp + mv, ужесточены очистка временных файлов, проверка запятых в списках и генерация QR для vpn:// URI.

Внутреннее

  • Воспроизводимые ARM-сборки: upstream-модуль закрепляется по явному ref, и вместе с пакетами публикуется манифест сборки.
  • release.yml собирает двуязычные release notes (RU + EN из обоих changelog) и осмысленный заголовок релиза автоматически.
  • Preflight и CI ужесточены: корректный вердикт bats, полная матрица ОС/архитектур в тестах, запуск проверки документации по path-триггеру, новые guard'ы на устаревшие формулировки IPv6 и version-placeholder.
  • Проверка согласованности документации ускорена примерно в 8 раз (однопроходный Unicode-слаггер заголовков) и теперь охватывает ROADMAP.
  • Тестовый набор вырос до 790 проверок (новые сценарии на валидаторы, restore, атомарность, слаггер и release notes).

Документация

  • Исправлены описания IPv6-маршрутизации, нативного детекта IPv6, охвата --json и числа поддерживаемых ОС; CLI-справочник в ADVANCED синхронизирован с реальными флагами.
  • README и INSTALL_VPS указывают на --ssh-port при смене SSH-порта; обновлены советы по мобильным операторам и заметка о целостности скриптов; ROADMAP актуализирован.
  • Процесс релиза описан без противоречий (источник release notes, нейтральный review-гейт, синхронизация чеклистов); отчёты о нарушениях Code of Conduct направляются в приватный канал; пустые issues отключены - вопросы идут в Discussions.

Проверка

  • Живой прогон на чистых VPS: Ubuntu 24.04 (x86_64, полный цикл: негативные тесты валидаторов, установка с 2 reboot-resume, весь CRUD manage), Ubuntu 26.04 (ARM64: remap PPA questing -> noble, DKMS-сборка модуля), Debian 13 (custom-маршруты --route-custom, fallback заголовков ядра, DKMS под обновлённое в ходе установки ядро). Подтверждены реальные межконтинентальные рукопожатия AWG 2.0 и DNS через туннель.

5.15.2 - 2026-06-02

v5.15.2 - небольшой поддерживающий релиз. Приводит команды установки и обновления в документации к текущему тегу. Код установки и управления не менялся, поведение прежнее. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Исправлено

  • Команды установки и обновления в документации указывают на текущий релиз. Примеры wget / curl в README, INSTALL_VPS и ADVANCED были закреплены на предыдущем теге, из-за чего копирование команды скачивало предыдущую версию. Теперь они ведут на этот релиз, так что установка по инструкции ставит именно его.

Внутреннее

  • Проверка согласованности документации теперь сверяет закреплённые raw.githubusercontent.com ссылки с текущей версией, чтобы команды установки не отставали от релиза в будущем.

5.15.1 - 2026-06-02

v5.15.1 - поддерживающий релиз после серии внешних аудитов кода и документации. Новых функций нет: укрепляет dual-stack IPv6 из v5.15.0, ужесточает несколько команд управления и устраняет ряд проблем корректности и надёжности. Установка по умолчанию не меняется. Матрица поддержки прежняя: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Изменено

  • Сплит-туннель + IPv6 теперь следует логике IPv4 (изменение поведения). Если клиент использует свой ALLOWED_IPS (сплит-туннель), dual-stack конфиг сохраняет этот IPv4-список и добавляет для IPv6 только ULA туннеля - больше не навязывает полный маршрут ::/0. Полный туннель (ALLOWED_IPS=0.0.0.0/0) по-прежнему получает ::/0 при нативном IPv6 либо ULA туннеля без него. Затрагивает только клиентов, созданных одновременно со сплит-туннелем и --allow-ipv6-tunnel. Если вы полагались на прежнее поведение, когда IPv6 уходил в полный туннель при сплит-IPv4, пересоздайте клиента, чтобы применить новую маршрутизацию.

Исправлено

  • vpn:// URI теперь несёт реальные MTU, keepalive и DNS сервера вместо фиксированных значений, так что импортированный из URI конфиг совпадает с .conf даже после смены настроек сервера или manage modify.
  • Более строгое определение нативного IPv6. Сервер считается нативно IPv6-способным только при наличии глобального (не-ULA) IPv6-адреса и IPv6-маршрута по умолчанию, поэтому клиент получает полный маршрут ::/0 лишь тогда, когда он действительно будет работать.
  • Хостовый IPv6-стек включается перед детектом, если он нужен туннелю, так что сервер с ранее отключённым через sysctl IPv6 всё равно получает рабочий dual-stack туннель.
  • install падает сразу при ошибке apt update вместо продолжения многошаговой установки на устаревшем кэше пакетов.
  • manage modify проверяет переданные Endpoint и AllowedIPs (host:port, список CIDR) перед записью.
  • manage add защищён от повторного имени: отклоняет уже существующее имя и убирает частичные артефакты ключей или конфига, если создание прервалось.
  • manage restore убирает устаревших клиентов и ключи, которых нет в резервной копии, так что восстановление даёт ровно состояние бэкапа.
  • manage help завершается с кодом 0 для явного запроса справки и 1 - только при реальной ошибке использования.
  • manage --json держит stdout чистым JSON, отправляя info- и debug-логи в stderr.
  • Сообщения в логе больше не удваивают знак процента ("95%" остаётся "95%").
  • manage restore пересоздаёт каталог expiry перед восстановлением меток срока действия.

Документация

  • Справка --subnet указывает требование только /24; install --help перечисляет Ubuntu 26.04.
  • manage --help и README документируют list --json (включая поле client_ipv6).
  • Восстановлены compare-ссылки changelog для 5.11.0-5.15.0, исправлено несколько битых внутренних якорей, обновлены SECURITY.md и CONTRIBUTING.md, добавлен docs/RELEASE_PROCESS.md.

Внутреннее

  • Простановка тега релиза теперь запускает полный preflight-гейт (синтаксис, shellcheck, тесты, пунктуация, согласованность версий и SHA-пинов, проверки документации) перед публикацией GitHub Release, плюс лёгкий workflow проверки согласованности документации. Документ дизайна подписи приведён в соответствие с черновиком загрузки ассетов.

5.15.0 - 2026-06-01

v5.15.0 - опциональный dual-stack IPv6 внутри туннеля. По просьбе пользователей в #24: новый флаг --allow-ipv6-tunnel выдаёт клиентам IPv6-адрес из приватной подсети ULA fddd:2c4:2c4:2c4::/64 дополнительно к привычному IPv4. По умолчанию выключено - без флага установка идентична v5.14.x. Поддержка операционных систем без изменений: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Главное

  • 🆕 Флаг --allow-ipv6-tunnel в install_amneziawg.sh (opt-in, по умолчанию выключен). Включает dual-stack IPv6 внутри VPN-туннеля: сервер и клиенты получают адреса из ULA-подсети fddd:2c4:2c4:2c4::/64 рядом с IPv4. Подсеть можно переопределить через IPV6_SUBNET= в awgsetup_cfg.init. Это отдельная настройка от существующего --allow-ipv6 (управление IPv6 на уровне хоста через sysctl), поведение --allow-ipv6 / --disallow-ipv6 не меняется.
  • 🌐 Dual-stack конфигурация сервера и клиента. При включённом флаге awg0.conf сервера получает IPv6 в Address и AllowedIPs, на сервере поднимается ip6tables MASQUERADE на внешнем интерфейсе, а клиентский .conf и vpn:// URI становятся dual-stack. Установщик определяет наличие нативного IPv6 на сервере (ip -6 addr show scope global): при наличии клиент получает полный маршрут ::/0, без нативного IPv6 - только туннельную подсеть, чтобы IPv6-трафик не уходил в чёрную дыру (в этом случае в лог выводится предупреждение).
  • 🔧 manage list и manage regen понимают dual-stack. Список клиентов показывает смешанное состояние (новые dual-stack рядом со старыми IPv4-only), а регенерация конфига корректно сохраняет IPv6-адрес.

Миграция

  • Существующие клиенты не затрагиваются. После обновления и включения IPv6 уже выданные IPv4-only конфиги продолжают работать как раньше - сервер ничего с ними не делает автоматически.
  • Чтобы добавить IPv6 уже существующему клиенту, после включения --allow-ipv6-tunnel (повторный запуск установщика с флагом или ALLOW_IPV6_TUNNEL=1 в awgsetup_cfg.init) пересоздайте этого клиента: manage remove <имя>, затем manage add <имя>. Только при пересоздании серверу выделяется IPv6 для клиента и выпускается dual-stack конфиг. Обычный regen оставит клиента IPv4-only, потому что в его записи [Peer] на сервере IPv6 ещё нет. Новый .conf нужно заново импортировать на устройство.
  • Подробности и устранение неполадок - в ADVANCED.md.

Тесты

  • Новый файл tests/test_v515_sha_pins_lockstep.bats (4 теста): сверяет реальный sha256sum четырёх helper-скриптов с пинами COMMON_SCRIPT_SHA256 / MANAGE_SCRIPT_SHA256 в обоих установщиках, чтобы частичный bump не выпустил установщик с рассинхроном.
  • Новый helper scripts/update-sha-pins.sh (с флагом --verify) для пересчёта и сверки SHA-пинов, и scripts/preflight-check.sh для единого прогона pre-tag проверок (синтаксис, shellcheck, bats, пунктуация, согласованность версий, SHA-пины).

Проверка

  • Автоматический набор тестов (bats) расширен покрытием dual-stack: рендер конфигов сервера и клиента, аллокация IPv6, dual-stack vpn:// URI, manage list/regen, путь без нативного IPv6. Регрессия без флага идентична v5.14.x.
  • Проверено на чистых серверах: happy-path dual-stack на ARM64 / Ubuntu 26.04 с нативным IPv6 (клиент получает полный маршрут ::/0, ip6tables MASQUERADE, выход в IPv6-интернет), и warning-path на x86_64 / Debian 13 без нативного IPv6 (клиент получает только туннельную подсеть). Межхостовый туннель подтверждён вживую: IPv4 и IPv6 ходят через него (ping6 до адреса сервера в туннеле без потерь).

5.14.5 - 2026-05-25

v5.14.5 - установщик теперь сам определяет реальный SSH-порт и открывает в UFW именно его. Раньше при SSH на нестандартном порту фаервол открывал только порт 22, и после его включения на последнем шаге доступ к серверу мог пропасть. Архитектурных изменений нет, поддержка ОС без изменений: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Главное

  • 🔧 Автоопределение SSH-порта для правила UFW в install_amneziawg.sh. По наблюдению @userosos на Debian 13 (#91): при SSH на нестандартном порту установщик открывал в UFW только стандартный порт 22, и после включения фаервола (ufw enable) доступ к серверу терялся. Добавил определение реального порта: сначала флаг --ssh-port, затем эффективная конфигурация sshd -T (директива Port и ListenAddress host:port, с учётом drop-in файлов в sshd_config.d), затем реальные слушающие сокеты sshd через ss, затем разбор sshd_config, и порт 22 по умолчанию. UFW теперь открывает все найденные SSH-порты, предупреждение перед включением называет их явно, а режим --yes тоже определяет порт, а не полагается на 22.
  • 🆕 Флаг --ssh-port=ПОРТ для ручного указания SSH-порта (можно список через запятую) - на случай нестандартной конфигурации, когда автоопределение нежелательно.

Тесты

  • Новый файл tests/test_ssh_port_detect.bats (18 тестов): определение порта из --ssh-port, из sshd -T (директива Port и ListenAddress, IPv4 и bracketed IPv6), объединение с сокетами ss, нормализация и дедупликация портов, применение правил UFW в обеих ветках (свежая настройка и обновление), соответствие веток RU и EN.

Проверка

  • Проверено на чистых серверах с SSH на нестандартном порту и установкой через --yes: Ubuntu 24.04 (x86_64) и Ubuntu 26.04 (ARM64). UFW открывает нужный порт, доступ к серверу сохраняется.

5.14.4 - 2026-05-24

v5.14.4 - небольшая доработка установщика: при интерактивной установке отказ от включения UFW (ответ N на вопрос «Включить UFW?») теперь корректно продолжает установку. Мелкое улучшение обработки пользовательского выбора, архитектурных изменений нет. Поддержка операционных систем без изменений: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Главное

  • 🔧 Отказ от UFW корректно продолжает установку в install_amneziawg.sh. По наблюдению @jay0x на Ubuntu 24.04 (#89): при ответе N на интерактивный вопрос «Включить UFW?» установщик останавливался вместо того, чтобы продолжить. Поправил обработку отказа: правила UFW остаются настроенными (запрет входящих, лимит SSH, разрешение порта VPN, маршрутизация), но фаервол не активируется, установка идёт дальше, а в лог выводится подсказка, что сервер работает без фаервола, и команда для включения позже (sudo ufw enable). При установке с флагом --yes поведение прежнее - UFW включается автоматически. Касается только интерактивного сценария, где пользователь сам отказывается от фаервола.

Тесты

  • Новый файл tests/test_v5144_ufw_optional.bats (6 тестов): отказ от UFW продолжает установку и не вызывает ufw enable; согласие включает UFW; режим --yes включает автоматически без чтения ввода; структурное соответствие веток RU и EN.

5.14.3 - 2026-05-21

v5.14.3 - патч-релиз с одним фиксом: функция cleanup_system() больше не вызывает apt-get autoremove после удаления cloud-init, что в сценарии чистой серверной установки Ubuntu 26.04 в VirtualBox (subiquity, без управления сетью со стороны cloud-init) могло удалить netplan-generator как транзитивную зависимость и оставить сервер без IP по DHCP после перезагрузки. Архитектурных изменений нет. Поддержка операционных систем без изменений: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Главное

  • 🛡️ Защита сетевого стека при cleanup_system в install_amneziawg.sh. Сообщил в #84 пользователь @jay0x на чистой серверной установке Ubuntu 26.04 в VirtualBox: после установщика сервер не получал IP по DHCP. Корень - агрессивный apt-get autoremove после apt-get purge cloud-init зачищал netplan-generator как транзитивную зависимость. Без netplan-generator файл /etc/netplan/00-installer-config.yaml (создаётся subiquity на ISO-установках) не превращался в /run/systemd/network/*.network, и systemd-networkd стартовал с пустой конфигурацией. Изменения в cleanup_system(): вызов apt-get autoremove убран; перед любыми apt-get purge ставится apt-mark hold для критичных пакетов сетевого стека (netplan.io, netplan-generator, systemd-resolved, netcfg, ifupdown) - при этом сначала снимается снимок текущих holds пользователя через apt-mark showhold, и собственные holds мы накладываем только на пакеты, которые пользователь ещё не залочил (а в unhold отпускаем строго свои); снимок маршрута по умолчанию до и после очистки - если маршрут пропал, установщик пробует восстановить (netplan.io ставится безусловно, netplan-generator - только если доступен в архивах через apt-cache show, чтобы на Debian 12 без этого пакета транзакция не оборвалась), перезапуск systemd-networkd, netplan apply, ожидание появления маршрута до ~26 секунд циклом с проверкой каждые 1-5 секунд; затем при неуспехе - последняя попытка поднять интерфейс через ip link set up, сначала networkctl renew с повторной проверкой маршрута, затем при необходимости dhclient -4, и только потом установщик останавливается с подсказкой восстановить сеть с консоли (sudo dhclient -4 <интерфейс>) и перезапустить с флагом --no-tweaks. Орфанные пакеты после purge теперь остаются в системе (~50-200 МБ) - приемлемо ради стабильности; пользователь может вручную запустить apt-get autoremove --no-install-recommends после установки.
  • 🪟 Ubuntu 26.04 в whitelist check_os_version. Раньше 26.04 попадал в ветку предупреждения с интерактивным prompt (с --yes проходил автоматически). Теперь распознаётся как поддерживаемая ОС наравне с 24.04 / 25.10. Релиз тестируется на 26.04 server в VirtualBox после фикса Issue #84.

Тесты

+14 новых bats (всего 532 запланировано в bats tests/, было 518 на v5.14.2):

  • test_v5143_cleanup_no_autoremove.bats (+14) - функциональные проверки через заглушки dpkg-query, apt-get, apt-mark, apt-cache, ip, systemctl, netplan, networkctl, dhclient, sleep: apt-get autoremove никогда не вызывается; apt-mark hold срабатывает на критичные пакеты netplan/systemd-resolved до любого purge (без systemd-networkd - этот пакет на Ubuntu 24+ не существует отдельно, бинарь живёт внутри systemd); pre-existing apt-mark holds пользователя не затрагиваются (наш hold/unhold цикл их пропускает); путь восстановления при потере маршрута по умолчанию (установка netplan.io безусловно, netplan-generator через apt-cache show gate, netplan apply + цикл ожидания); last-ditch путь после неуспеха основного recovery (ip link set up + networkctl renew с повторной проверкой маршрута, затем при необходимости dhclient -4); путь die при полной неудаче с подсказкой --no-tweaks; существующая защита cloud-init (3 проверки маркеров) сохранена. Структурные проверки: парность строк RU и EN cleanup_system, наличие apt-mark hold / unhold / die в обоих файлах, отсутствие реальной строки apt-get autoremove (комментарии-обоснования игнорируются).

Совместимость

  • Обратно совместимо с v5.14.x. Поведение на облачных образах с маркерами cloud-init (Hetzner, Oracle Cloud) не меняется. На ISO-установках Ubuntu 26.04 + VirtualBox теперь корректно обрабатывается отсутствие cloud-init netplan-маркеров.
  • Обходной путь --no-tweaks по-прежнему работает, но больше не требуется для сценария @jay0x.

Обновление

С v5.14.2 на v5.14.3:

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

Шаг 5 инсталлятора подтянет свежие manage_amneziawg.sh и awg_common.sh с проверкой SHA256.

Спасибо @jay0x за подробное воспроизведение с логами dpkg, journalctl и ls /etc/netplan/ - без них найти корень было бы дольше.

Полный список изменений с момента v5.14.2


5.14.2 - 2026-05-21

v5.14.2 - патч-релиз с двумя мелкими фиксами: QR-код .vpnuri.png теперь читается камерой телефона с экрана компьютера (раньше длинные URI с PSK давали ошибку 900 в AmneziaVPN на iOS) и сборочный скрипт ARM-пакетов больше не выбирает «первый попавшийся» каталог /lib/modules/*/build на хостах с несколькими установленными ядрами. Архитектурных изменений нет. Поддержка операционных систем без изменений: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM.

Главное

  • 📱 QR-код .vpnuri.png теперь читается с экрана. awg_common.sh:generate_qr_vpnuri теперь вызывает qrencode с явным масштабом -s 6 (раньше использовался дефолт 3). Это и есть основной фикс: при дефолтном масштабе модули PNG были слишком мелкими, и камера iPhone не различала их при сканировании с экрана компьютера - отсюда ошибка 900 ImportInvalidConfigError в AmneziaVPN на iOS у @haritos90 в issue #72 (Debian 12 + AmneziaVPN iOS 4.8.15.4). На большом масштабе ёмкость QR не меняется - меняется физический размер модуля, который камера может надёжно распознать. Заодно зафиксированы явно текущие дефолты qrencode: -l L (низший уровень коррекции ошибок) и -m 4 (стандартная тихая зона) - чтобы будущие смены дефолтов в libqrencode не сломали поведение. Текстовый импорт через копирование содержимого .vpnuri работал и раньше, фикс восстанавливает основной путь через QR с камеры.
  • 🛠️ scripts/build-arm-deb.sh: явный KERNEL_VERSION и отказ при неоднозначности. Сборочный скрипт ARM-пакетов раньше неявно выбирал первый найденный каталог /lib/modules/*/build через простой цикл - на хостах разработчика с несколькими установленными ядрами это могло привести к сборке против незапланированного ядра. Внешнее ревью кода 8 мая указало на риск. Логика разрешения версии вынесена в функцию _resolve_kernel_version с тремя ветками: если установлен KERNEL_VERSION, проверяется существование /lib/modules/$KERNEL_VERSION/build и используется он; иначе считается число кандидатов - ноль значит ошибку (как и раньше), один значит однозначный выбор (как и раньше), два и больше значит явный отказ со списком всех найденных версий и просьбой указать KERNEL_VERSION. В CI-матрице AmneziaWG это не срабатывает: каждый QEMU-контейнер ставит ровно один пакет заголовков. Защитное поведение нужно для запуска скрипта на пользовательских хостах.

Тесты

+18 новых bats (всего 528, было 510 на v5.14.1):

  • test_v5142_qr_high_density.bats (+7) - проверка передачи -l L, -s 6, -m 4 в qrencode, сохранение -t png, регрессионная проверка что PNG-файл по-прежнему создаётся из содержимого .vpnuri, побайтовое соответствие строки вызова между RU и EN.
  • test_v5142_build_arm_deb.bats (+11) - функциональные тесты _resolve_kernel_version: ровно один кандидат, ноль кандидатов, несколько кандидатов с явным списком в stderr, игнорирование каталогов без build/; путь через переменную окружения KERNEL_VERSION (валидный, со снятием неоднозначности, с несуществующим каталогом, с пустым значением как fallback на авто-детект); структурные проверки наличия функции, guard-условия для безопасного source из тестов, отсутствия старого inline-цикла в основном теле.

Совместимость

  • Обратно совместимо с v5.14.x. Поведение в штатном сценарии не меняется: qrencode всё так же создаёт PNG в .vpnuri.png, а на CI-хостах с одним установленным ядром _resolve_kernel_version возвращает тот же результат, что и старый цикл.
  • Обходной путь, который раньше требовался для длинных QR (скопировать текст .vpnuri в приложение вручную), больше не нужен.

Обновление

С v5.14.1 на v5.14.2:

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

Шаг 5 инсталлятора подтянет свежие manage_amneziawg.sh и awg_common.sh с проверкой SHA256.

Полный список изменений с момента v5.14.1


5.14.1 - 2026-05-19

v5.14.1 - патч-релиз: manage regen теперь подхватывает MTU из серверного awg0.conf при перегенерации клиентских конфигов и не оставляет в клиенте захардкоженное 1280. Архитектурных изменений нет, поведение в штатном сценарии (MTU = 1280 на сервере) не меняется. Поддержка операционных систем без изменений: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX).

Главное

  • 📐 Синхронизация MTU между сервером и клиентами при regen. До v5.14.1 в awg_common.sh:render_client_config и render_server_config значение MTU = 1280 было зашито в коде. Если пользователь правил MTU в /etc/amnezia/amneziawg/awg0.conf руками, manage_amneziawg.sh regen всё равно записывал в клиентский .conf старые 1280. Сейчас разрешение MTU работает в следующем порядке приоритетов: значение из секции [Interface] серверного awg0.conf (источник истины для уже работающего сервера), затем AWG_MTU из awgsetup_cfg.init, затем запасное 1280. Парсер живого конфига (load_awg_params для AWG-параметров из awg0.conf) теперь тоже читает строку MTU = ... и экспортирует AWG_MTU. Невалидные значения вне диапазона 576..9100 на любом этапе откатываются к 1280. Сообщил в Discussion #38 пользователь @E-lmedano.
  • 🔧 Установщик: переменная AWG_MTU в awgsetup_cfg.init. Новые установки записывают AWG_MTU=1280 в конфиг-файл; пользователь может задать другое значение через окружение перед запуском (AWG_MTU=1380 sudo bash install_amneziawg.sh ...) и оно сохранится. Переменная также добавлена в whitelist safe_load_config.

Тесты

+18 новых bats (всего 510, было 492 на v5.14.0):

  • test_v5141_mtu_resolution.bats (+18) - функциональные тесты _extract_mtu_from_server_conf (валидный MTU из [Interface], пробелы вокруг =, отсутствие MTU, игнор MTU в секции [Peer], last-wins на дубликатах, отсутствующий файл сервера, нечисловое значение); функциональные тесты _validate_mtu (принимает 1280, граничные 576 и 9100, отклоняет 0 / -1 / 9101 / 575 / abc / пустую строку); структурные проверки render_client_config (нет хардкода MTU = 1280, используется подстановка ${mtu}), render_server_config (используется ${AWG_MTU:-1280}); whitelist safe_load_config содержит AWG_MTU во всех 4 файлах; установщик пишет AWG_MTU в awgsetup_cfg.init (RU + EN); побайтовое соответствие _extract_mtu_from_server_conf между RU и EN.

Совместимость

  • Обратно совместимо с v5.13.x и v5.14.0. Поведение в штатном сценарии не меняется: при MTU = 1280 на сервере regen продолжает выдавать 1280 в клиентский конфиг.
  • Workaround, который раньше требовался (ручная правка /root/awg/<имя>.conf после regen), больше не нужен - перегенерация подхватит то, что в awg0.conf.

Обновление

С v5.13.x / v5.14.0 на v5.14.1:

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

Шаг 5 инсталлятора подтянет свежие manage_amneziawg.sh и awg_common.sh с проверкой SHA256.

Полный список изменений с момента v5.14.0


5.14.0 - 2026-05-19

v5.14.0 - небольшой релиз с новыми функциями: более надёжное определение публичного IP сервера (дополнительные резервные сервисы для AWS и облаков за NAT) плюс новая подкоманда manage diagnose для самодиагностики сервера одной строкой. Обратно совместимо со всеми установками v5.13.x; архитектурных изменений нет. Поддержка операционных систем не меняется: Ubuntu 24.04 / 25.10 / 26.04, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX).

Главное

  • 🌐 Расширенное определение публичного IP в awg_common.sh:get_server_public_ip. Цепочка резервных сервисов выросла с 4 до 6: api.ipify.org, checkip.amazonaws.com, icanhazip.com, ifconfig.io, ifconfig.me, ipinfo.io/ip (порядок алфавитный, детерминированный для тестов и сравнения версий). checkip.amazonaws.com остаётся доступен из приватной подсети AWS / GCP / OCI за NAT-шлюзом, где ifconfig.me может уйти в rate-limit; ifconfig.io - резерв на случай простоя ifconfig.me. Поведение "побеждает первый ответивший" сохранено: первый валидный IPv4 от любого сервиса используется, остальные не запрашиваются. Успешное определение теперь записывается в /root/awg/install_amneziawg.log (или в лог-файл manage) - запись идёт напрямую в файл, никогда в стандартный вывод, чтобы не нарушить контракт $(...) и не повредить строку Endpoint = в клиентских конфигах.
  • 🩺 manage diagnose [--carrier=ИМЯ] - новая подкоманда для самодиагностики сервера одной строкой. Без аргументов запускает 6 проверок: загрузка модуля ядра, активность службы, поднятость интерфейса, sysctl ip_forward, BBR, состояние UFW и порт AWG, число клиентских peer-ов. С --carrier=ИМЯ дополнительно сравнивает текущие параметры обфускации AWG 2.0 (Jc / Jmin / Jmax / I1) с профилем оператора и печатает OK/WARN/FAIL по каждой проверке плюс подсказку в поле Fix:. Семь подтверждённых операторов из таблицы в ADVANCED.md: beeline_msk (preset default); yota_msk, tele2_msk, tattelecom (preset mobile, I1 со случайным паттерном); tele2_krasnoyarsk, megafon_regions (preset mobile, I1 должен отсутствовать); tmobile_us (бинарный I1, по обсуждению #45). Код возврата 1 только при FAIL или неизвестном операторе; WARN на код возврата не влияет. На русском и английском.
  • 🔒 Дизайн подписания релизов (docs/SIGNING_DESIGN.md, пока в планах). Модель угроз, выбор инструмента (minisign против cosign / GPG), процесс подписания с привязкой подписи к тегу и имени файла через trusted-comment (защита от подмены на старую версию), черновик GitHub Actions workflow release-sign.yml для загрузки заранее сгенерированных файлов .minisig. Активация требует, чтобы сопровождающий сначала сгенерировал ключевую пару офлайн и опубликовал KEYS.txt в корне репозитория; до этого раздел в SECURITY.md описывает только планируемый путь.

Тесты

+37 новых bats (всего 492, было 455 на v5.13.0):

  • test_v5140_public_ip_services.bats (+11) - структурное соответствие RU и EN на тех же 6 адресах, побайтово идентичный список сервисов между языками, проверка алфавитного порядка (первый - api.ipify.org, последний - ipinfo.io/ip), функциональные тесты перехода к следующему сервису (первый отвечает / первый молчит-второй отвечает / молчат все 6 / некорректный формат IP - пропуск / последний в списке отвечает / возврат из кеша без запросов).
  • test_v5140_diagnose.bats (+16) - структурное соответствие RU и EN для diagnose_server и вспомогательных функций _diagnose_carrier_known, _diagnose_carrier_list, _diag_line; парсер CLI принимает --carrier=ИМЯ; диспетчер команд подключает diagnose; справка help упоминает diagnose; функциональные проверки карты операторов (строка beeline_msk соответствует профилю preset default, tele2_krasnoyarsk имеет i1=absent, tmobile_us имеет i1=binary и Jc=6; неизвестный оператор возвращает 1); список операторов содержит 7 уникальных подтверждённых; ранее присутствовавшие неподтверждённые mts_msk и megafon_msk намеренно удалены.

Совместимость

  • Операционные системы: Ubuntu 24.04 LTS, 25.10, 26.04 (с резервом на noble). Debian 12 (bookworm), 13 (trixie).
  • Архитектура: amd64, arm64 (Raspberry Pi 4/5, Oracle Cloud Ampere, Hetzner CAX, AWS Graviton, прочие ARM-серверы).
  • Российские операторы: таблица в ADVANCED.md. Новая команда diagnose --carrier=ИМЯ распознаёт 7 подтверждённых строк; строки со статусом «🔄 тестируется» (Megafon Москва, МТС Москва) намеренно исключены до фиксации диапазонов.

Вне этого релиза

  • v5.14.1+: мелкие доработки по обратной связи после релиза.
  • v5.15.x: активация подписей через minisign (после того как сопровождающий сгенерирует ключевую пару), индивидуальные профили CPS на клиента (issue #71), --preset=mobile-awg1 для операторов с I1=none.

Полный список изменений с момента v5.13.0


5.13.0 — 2026-05-12

v5.13.0 — релиз AmneziaWG 2.0 VPN-инсталлятора с поддержкой Ubuntu 25.10 (questing) и 26.04, и защитным флагом --force против случайной переустановки на работающем сервере. Поддержка Ubuntu 24.04, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX) — без изменений.

Главное

  • 🛡️ PPA noble fallback для Ubuntu 25.10 / 26.04 (Issue #46). PPA Amnezia пока не публикует пакеты для questing (25.10) и будущих кодовых имён Ubuntu. Инсталлер автоматически детектит 404 на dists/<codename>/Release, переключает suite на noble в /etc/apt/sources.list.d/amnezia-ppa.sources и повторяет apt update. Если на сервере остались kernel headers от прошлого 24.04 (сценарий после do-release-upgrade), инсталлер также доставит gcc-13 из questing/universe, чтобы DKMS autoinstall успешно собрал модуль для всех ядер. Без ручных правок sources.list, без DKMS-сюрпризов. Скрипт также чинит «прилипший» .sources-файл с устаревшим suite, если предыдущий запуск (≤ v5.12.1) оставил Suites: questing после ошибки apt.
  • 🔒 --force safety guard (Issue #78). Повторный запуск инсталлера на сервере с уже сконфигурированным AmneziaWG теперь требует явный флаг --force (или AWG_FORCE_REINSTALL=1). Без него скрипт early-exit'ит с понятным сообщением: «уже установлено и запущено». Серверные ключи, конфиги пиров и параметры обфускации сохраняются при повторном запуске, но Шаг 1 заново настраивает sysctl/swap/BBR, apt-get upgrade может подтянуть новое ядро (и потребовать ещё один reboot), а Шаг 7 рестартит awg-quick@awg0 — handshake'и отваливаются на несколько секунд. Guard убирает эту ловушку.
  • 🧹 Логи manage_amneziawg.sh: WARN → stderr. В v5.12.1 в manage_amneziawg.sh:log_msg только ERROR уходил в stderr, а WARN утекал в stdout — ломало CI/automation парсинг (stdout = «данные», stderr = «диагностика»). Теперь WARN и ERROR оба идут в stderr, симметрично с install_amneziawg.sh:log_msg.
  • 💾 Точная проверка /swapfile в /etc/fstab. Старая substring-проверка grep -q '/swapfile' ловила закомментированные строки и partial matches (/swapfile.bak); на повторном запуске installer мог решить, что fstab уже настроен, и пропустить добавление валидной записи — swap не монтировался при reboot. Перешёл на anchored field-aware awk-check: !/^[[:space:]]*#/ && $1 == "/swapfile" && $3 == "swap". Идемпотентно и устойчиво к комментариям.

Установка

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.13.0/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo bash ./install_amneziawg.sh

3 команды → ~20 минут → готовый VPN-сервер с обфускацией трафика. Подробнее — README → Установка.

Обновление существующего сервера

Запустите install_amneziawg.sh свежей версии с флагом --force (если AmneziaWG уже работает) — на 5-м шаге manage_amneziawg.sh и awg_common.sh обновятся автоматически (с проверкой SHA256). Полные команды — ADVANCED.md → Как обновить скрипты.

Тесты

+68 новых bats (455 в матрице, было 387 на v5.12.1):

  • test_v5130_ppa_noble_fallback.bats (+33) — RU/EN структурные greps на pre-check блок и suite-mismatch detection, parity-counts, функциональные тесты с мокнутым curl (404 → noble, timeout → noble, success → questing), LTS-whitelist (noble/jammy/focal skip pre-check), suite-mismatch удаляет файл при несовпадении и сохраняет при совпадении, повреждённый .sources (без Suites:) тоже пересоздаётся, legacy .sources mismatch удаляется, gcc-13 pre-install активируется при stale headers.
  • test_v5130_force_guard.bats (+19) — RU/EN структурные greps на CLI-флаг --force|-f, env-bridge AWG_FORCE_REINSTALL=1, идемпотентный guard [[ -f $SERVER_CONF_FILE ]] && systemctl is-active --quiet awg-quick@awg0, help-секция упоминает -f, --force, RU/EN parity по числу FORCE_REINSTALL вхождений; функциональная матрица 6 кейсов (clean install / configured+active+no-force / configured+inactive+no-force → repair flow / configured+active+--force / env-bridge / strict =1 env vs yes).
  • test_v5130_bundled_fixes.bats (+16) — rcgr: RU/EN log_msg routes WARN to stderr (structural + functional, INFO остаётся в stdout); i31a: awk-check для /swapfile корректно детектит valid entry / отбрасывает закомментированные / отбрасывает partial-name матчи (/swapfile.bak), индентированные строки, пустой fstab.

Совместимость

  • ОС: Ubuntu 24.04 LTS, 25.10, 26.04 (с noble fallback). Debian 12 (bookworm), 13 (trixie).
  • Архитектура: amd64, arm64 (Raspberry Pi 4/5, Oracle Cloud Ampere, Hetzner CAX, AWS Graviton, прочие ARM-VPS)
  • Мобильные операторы РФ: --preset=mobile работает на Yota, Beeline, МТС, Tattelecom, Tele2 (Москва), Megafon (Москва). См. таблицу операторов в README.

Вне этого релиза

  • v5.13.1: external review fixes (kernel ambiguity в build-arm-deb.sh), backlog refinements.
  • v5.14.0: --preset=mobile-awg1 (I1=none fallback для Tele2 Красноярск / Megafon регионы).

Полный roadmap — Issue #79.


5.12.1 — 2026-05-08

v5.12.1 — патч-релиз AmneziaWG 2.0 VPN-инсталлятора: три точечных исправления, найденных в первые 48 часов после v5.12.0. Без новых фич, без архитектурных сдвигов. Поддержка Ubuntu 24.04 / 25.10, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX) — без изменений.

Главное

  • 🔧 AWG_SKIP_APPLY=1 снова работает в manage add / manage remove. В v5.12.0 я добавил безусловный pre-call ensure_amneziawg_kernel_module перед обоими действиями для надёжного syncconf. Побочно это сломало offline edit-only flow на dev/CI-машинах без загруженного kernel-модуля, где AWG_SKIP_APPLY=1 накапливает изменения для batch-применения (см. ADVANCED.md — раздел про переменные среды). Теперь pre-call обёрнут в if [[ "${AWG_SKIP_APPLY:-0}" != "1" ]]. manage restart остаётся без gate'а — это явный apply, для него AWG_SKIP_APPLY бессмыслен. Распознаётся только литерал 1; yes, true, любая другая строка — поведение как при unset (apply делается).
  • linux-headers-cloud-${arch} в repair-module fallback на Debian. awg_common.sh:_install_kernel_headers (используется manage repair-module) на Debian пробовал только linux-headers-${kernel_ver} и linux-headers-${arch}. На AWS / Azure / GCP / cloud-Hetzner (kernel name содержит -cloud-) точная-версия пакета может пропасть из репо после kernel upgrade, а cloud-meta linux-headers-cloud-${arch} остаётся доступным. Шаг 2 установки уже умел cloud-headers через smart detection в installer'е; теперь и repair-module знает про cloud-meta и пробует его раньше generic. Standard-ядра (без -cloud- в имени) — поведение не меняется.
  • 📦 ARM prebuilt-пакеты теперь корректно декомпрессируются ядерным декодером (Issue #76). scripts/build-arm-deb.sh использовал xz -9 (CRC64-проверка, 64 MiB словарь) — userspace xz -t стрим валидным считал, но in-tree decoder Linux на Debian 13 trixie kernel 6.12.85+deb13-arm64 (build 2026-04-30) отвечал decompression failed with status 6. Свитчнул на kernel-compatible preset xz --check=crc32 --lzma2=dict=1MiB — соответствует mainline scripts/Makefile.modinst. Plus build-time sanity gate: после компрессии xz -t + xz -d -c round-trip; если что-то не так — exit 1, broken prebuilt не попадает в arm-packages release. На push'е тега v5.12.1 CI workflow arm-build.yml перепубликует все 14 ARM prebuilt-пакетов с новыми xz-флагами.

Установка

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.12.1/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo bash ./install_amneziawg.sh

3 команды → ~20 минут → готовый VPN-сервер с обфускацией трафика. Подробнее — README → Установка.

Обновление существующего сервера

Запустите install_amneziawg.sh свежей версии — на 5-м шаге manage_amneziawg.sh и awg_common.sh обновятся автоматически (с проверкой SHA256). Полные команды — ADVANCED.md → Как обновить скрипты.

Тесты

+30 новых bats (387 в матрице, было 357 на v5.12.0):

  • test_v5121_skip_apply_regression.bats (+14) — RU/EN structural greps на add / remove / restart блоки, plus runtime semantics gate'а для всех документированных значений (unset / 0 / 1 / yes / true / YES); проверка что repair-module сохраняет AWG_ALLOW_APT_IN_ENSURE=1 ensure_amneziawg_kernel_module full; bash -n syntax sanity.
  • test_v5121_cloud_headers.bats (+9) — функциональный тест _install_kernel_headers через mock'и apt-get и dpkg: cloud-kernel получает cloud-meta в кандидатах раньше generic, standard-kernel — не получает, Ubuntu codepath не задет; EN-mirror awg_common_en.sh проверен отдельно.
  • test_v5121_xz_kernel_compat.bats (+7) — структурные greps на новые xz-флаги в build-arm-deb.sh, fail-fast при сбое sanity-стадии, локальный round-trip с теми же флагами (toolchain smoke; kernel-decompressor compatibility лучше всего проверяется реальной kernel-загрузкой — VPS или QEMU с целевым ядром).
  • test_v5115_regen_multiarg.bats — bumped version assertion с 5.12.0 до 5.12.1.

Совместимость и зависимости

  • Полностью обратно-совместимо. Все три фикса меняют поведение только в редких регрессивных кейсах (offline edit / cloud-kernel repair / ARM prebuilt на Debian 13 trixie). Штатный сценарий установки и работы клиентов — без изменений.
  • Новых зависимостей нет.

Полный список изменений с момента v5.12.0


5.12.0 — 2026-05-06

v5.12.0 — feature-релиз AmneziaWG 2.0 VPN-инсталлятора: одна большая фича — автоматическое восстановление DKMS-модуля при обновлении ядра. Без архитектурных изменений: совместимо со всеми установками v5.11.x — apt hook, systemd unit и helper доустанавливаются при следующем запуске install_amneziawg.sh. Поддержка Ubuntu 24.04 / 25.10, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX) — без изменений.

Главное

  • 🛡 DKMS auto-repair при обновлении ядра — три уровня страховки. До v5.12.0 после apt upgrade ядра DKMS не всегда успевал пересобрать модуль amneziawg к моменту следующего rebootawg-quick@awg0 падал с modprobe: FATAL: Module amneziawg not found, и VPN лежал до ручной пересборки. Теперь установлены три страховки, работающие прозрачно:
    • apt hook (/etc/apt/apt.conf.d/99-amneziawg-post-kernel) — DPkg::Post-Invoke запускает /usr/local/sbin/amneziawg-ensure-module --hook, который итерирует /lib/modules/*/build, пересобирает DKMS под все целевые ядра с установленными headers, делает depmod -a. Лог в /var/log/amneziawg-ensure-module.log (logrotate weekly, 4 копии). Stamp-файл /var/lib/amneziawg/ensure-module.stamp глушит хук на routine apt-операциях, не связанных с ядром.
    • systemd unit (amneziawg-ensure-module.service) — Type=oneshot, Before=awg-quick@awg0.service, After=systemd-modules-load.service local-fs.target. На boot перед awg-quick итерирует ядра с уже установленными headers (/lib/modules/*/build), пересобирает DKMS, делает modprobe amneziawg и проверяет lsmod. Если headers не установлены — пишет WARN и завершает успехом, а сами headers ставит либо штатный шаг 2 инсталлятора, либо manage repair-module. Логи в journal (journalctl -u amneziawg-ensure-module.service). ConditionPathExists=/usr/local/sbin/amneziawg-ensure-module — unit не упадёт, если helper удалён.
    • manage repair-module — явный fallback для interactive recovery: sudo bash /root/awg/manage_amneziawg.sh repair-module. Включает AWG_ALLOW_APT_IN_ENSURE=1 (apt-get install kernel-headers разрешён только в этом контексте — apt hook и systemd unit его не используют, чтобы не блокироваться на dpkg-lock).
  • 🧠 Умное определение kernel-headers meta-package. Шаг 2 установки теперь ставит meta-пакет под ваше ядро, а не привязывается к linux-headers-$(uname -r): в Ubuntu извлекает flavor из uname -r (aws/azure/gcp/oracle/kvm/lowlatency/raspi) с fallback на linux-headers-generic; в Debian — linux-headers-cloud-${arch} для cloud-ядер, иначе linux-headers-${arch}. Это страхует от ситуации, когда apt-get upgrade поднял ядро, но без headers новый module не собирается.

Прочее

  • 🛠 manage_amneziawg.sh пре-вызывает ensure_amneziawg_kernel_module в add / remove / restart. Если модуль выгружен или не подходит к текущему ядру, он попытается восстановиться до начала операции — это убирает половину запросов «после apt upgrade add клиента не работает».
  • 🧹 step_uninstall чистит компоненты автовосстановления. При --uninstall отключается systemd unit, удаляются apt hook, helper, logrotate config, stamp-каталог /var/lib/amneziawg/, ротированные логи /var/log/amneziawg-ensure-module.log*. Всё idempotent — установки до v5.12.0 не пострадают.

Установка

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.12.0/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo bash ./install_amneziawg.sh

3 команды → ~20 минут → готовый VPN-сервер с обфускацией трафика. Подробнее — README → Установка.

Обновление существующего сервера

Запустите install_amneziawg.sh свежей версии — на 5-м шаге manage_amneziawg.sh и awg_common.sh обновятся автоматически (с проверкой SHA256), а на шаге 2 будут развёрнуты apt hook, systemd unit, helper и logrotate. Для существующего сервера это безопасный re-run. Полные команды — ADVANCED.md → Как обновить скрипты.

Тесты

+32 новых bats (357 total, было 325 на v5.11.5):

  • test_v512_dkms_repair.bats (+32) — структурное покрытие deploy-фаз DKMS auto-repair: 4 функции в awg_common.sh+_en.sh, ≥3 пре-вызова в manage (add/remove/restart), команда manage repair-module|repair, gate-переменная AWG_ALLOW_APT_IN_ENSURE; smart kernel-headers candidate-loop (Ubuntu flavor extraction, Debian cloud detection, RPi guard, fallback ordering: flavor BEFORE generic + cloud BEFORE arch); helper --hook|--systemd modes, stamp fast-path gated на --hook, modprobe+lsmod в --systemd + 2 exit-1 paths, helper не использует apt-get; systemd unit 12 директив, atomic deploy, daemon-reload+enable; byte-identical RU/EN для helper, hook, logrotate, unit; atomic deploy cleanup-on-failure для всех 4 staging vars; helper body parses через bash -n. Mock-based runtime тесты (kernel upgrade simulation) выполняются на VPS Ubuntu 24.04 + Debian 13 в рамках release-теста.

Совместимость и зависимости

  • Полностью обратно-совместимо. Установки v5.11.x продолжают работать как раньше; auto-repair компоненты деплоятся при следующем запуске install_amneziawg.sh — re-run install безопасен. Шаг 2 теперь ставит meta-package для headers, что страхует от kernel-upgrade без headers; дополнительных пакетов вручную ставить не нужно.
  • Новых зависимостей нет. Helper использует dkms, depmod, modprobe, systemctl — всё из base-установки. Apt hook — POSIX-sh inner command (не bash). Systemd unit — Type=oneshot, без timer'ов.

5.11.5 — 2026-05-05

v5.11.5 — bug-fix-релиз AmneziaWG 2.0 VPN-инсталлятора: два точечных исправления после v5.11.4, без архитектурных изменений. Поддержка Ubuntu 24.04 / 25.10, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX) — без изменений.

Главное

  • 🔁 manage regen c1 c2 c3 теперь перегенерирует все три клиента, а не только первого. До v5.11.5 в regen использовался только первый аргумент из списка, остальные молча игнорировались — у add и remove цикл по аргументам уже был, в regen я его забыл прописать. Теперь поведение приведено к единому виду: каждое имя валидируется и обрабатывается отдельно, отсутствующий клиент даёт warning + rc=1, валидные продолжают обрабатываться, в конце — суммарный счётчик Обработано: N из M. Поведение manage regen без аргументов («перегенерить всех») сохранено. (#70, @Barmem)
  • 🛡 Шаг 2 установки: hard error apt-get update больше не маскируется. В v5.11.4 я ослабил проверку apt-get update на шаге 2 до warning, чтобы пропустить outage Launchpad PPA (issue #68). Побочный эффект: при настоящих ошибках apt — отказ DNS, GPG mismatch, занятый dpkg-lock на основном зеркале — установка продолжалась на устаревшем apt-cache и падала позже с менее понятным сообщением. Теперь логика разделяет два сценария: ошибки только на PPA Amnezia (issue #68) — продолжаем, apt_wait_for_ppa_package сделает retry; любая другая non-source ошибка — die с указанием, что проверять (DNS / /etc/apt/keyrings / dpkg-lock). Заодно поправлено поведение в edge-case OOM/silent-crash apt — теперь не «глотается», даже если в выводе мелькает PPA-URL. (post-merge review на PR #69)

Прочее

  • 📚 Документация: AWG 2.0 vs AWG 1.0 (S3/S4). В ADVANCED.md добавлена FAQ-секция о том, что сервер AmneziaWG 2.0 с S3>0 или S4>0 не совместим с клиентами AWG 1.0 (см. upstream-issue amnezia-vpn/amneziawg-linux-kernel-module#168). Мой инсталлятор всегда генерирует S3=8..55, S4=4..27оба >0, поэтому в типичном сценарии (Amnezia VPN client + клиенты, сгенерированные manage) проблема не возникает. Риск только при ручном импорте серверного preset в WireGuard/AWG 1.0 клиент.

Установка

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.11.5/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo bash ./install_amneziawg.sh

3 команды → ~20 минут → готовый VPN-сервер с обфускацией трафика. Подробнее — README → Установка.

Обновление существующего сервера

Запустите install_amneziawg.sh свежей версии — на 5-м шаге manage_amneziawg.sh и awg_common.sh обновятся автоматически (с проверкой SHA256). Полные команды — ADVANCED.md → Как обновить скрипты.

Тесты

+13 новых bats (325 total, было 312 на v5.11.4):

  • test_v5115_regen_multiarg.bats (+13) — RU/EN regen case итерирует ARGS[@] (главный fix для #70); счётчик _regen_count и сводное сообщение «Обработано: N из M» / «Processed: N of M»; нет регрессии: одиночный regen <name> и regen без аргументов работают как раньше; ошибочные/несуществующие имена дают warning + rc=1, не обрывают batch; RU/EN structural parity по управляющим токенам regen-ветки; apt_update_tolerant принимает --ppa-amnezia-tolerant flag и local ppa_tolerant=0 объявлен в обоих installers; шаг 2 вызывает функцию с этим флагом и die на hard error; OOM/silent-crash guard через raw_had_non_src_errors присутствует в обоих installers; SCRIPT_VERSION="5.11.5" обновлён во всех 6 файлах.

Совместимость и зависимости

  • Полностью обратно-совместимо. manage regen <name> (одно имя) и manage regen (без аргументов) — поведение не меняется. Меняется только обработка нескольких аргументов: раньше тихо терялись, теперь обрабатываются. Поведение шага 2 при штатной установке тоже не меняется — strict mode срабатывает только при реальном hard error apt, который и без того блокировал бы установку дальше.
  • Новых зависимостей нет.

5.11.4 — 2026-05-04

v5.11.4 — bug-fix-релиз AmneziaWG 2.0 VPN-инсталлятора: два исправления по горячим следам issues после v5.11.3, без архитектурных изменений. Поддержка Ubuntu 24.04 / 25.10, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX) — без изменений.

Главное

  • 🔑 Импорт vpn:// в Amnezia VPN app теперь забирает PSK. При manage add --psk PresharedKey корректно писался в [Peer] сервера и в клиентский .conf ещё с v5.11.1, но в vpn:// URI поле psk_key (которое читает AmneziaVPN-парсер) не попадало — клиент поднимал соединение без PSK, сервер с PSK его не пропускал, handshake висел в «никогда». Заодно подчищены trailing CR / spaces в PresharedKey = и AllowedIPs = (CRLF-конфиги, отредактированные на Windows, больше не утекают \r в JSON). (#67, @haritos90)
  • 🔁 Установка переживает короткий outage Launchpad PPA. Если ppa.launchpadcontent.net коротко недоступен (как 3 мая по #68), скрипт ждёт появления amneziawg-dkms в apt-cache до 3 попыток с backoff 30 и 60 секунд (между попытками — повторный apt-get update). Проверка по apt-cache важна: apt-get update сам по себе толерантен к недоступному InRelease (rc=0 даже когда PPA не скачался), поэтому простой retry на rc для этого случая не сработал бы. После трёх фейлов — дружелюбное сообщение про инфраструктурный outage Launchpad с прямой ссылкой на issue, чтобы было понятно: это не баг скрипта. (#68, @saligin / @baikov)

Установка

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.11.4/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo bash ./install_amneziawg.sh

3 команды → ~20 минут → готовый VPN-сервер с обфускацией трафика. Подробнее — README → Установка.

Обновление существующего сервера

Запустите install_amneziawg.sh свежей версии — на 5-м шаге manage_amneziawg.sh и awg_common.sh обновятся автоматически (с проверкой SHA256). Полные команды — ADVANCED.md → Как обновить скрипты.

Тесты

+16 новых bats (312 total, было 296 на v5.11.3):

  • test_v5114_psk_uri.bats (+5) — happy path с PSK; отсутствие PSK → psk_key не выводится; indented PresharedKey; CRLF-конфиг не утечёт \r в JSON; пустое значение PresharedKey = не превращается в psk_key:"" (которое всё равно не совпало бы с серверным PSK).
  • test_v5114_ppa_retry.bats (+11) — успех с первой попытки; ретрай до победы; исчерпание max attempts; экспоненциальный backoff с doubling; cap 1800 с против переполнения арифметики; RU/EN структурная parity helper'а; ссылка на issue #68 в обоих installer'ах.

Совместимость и зависимости

  • Полностью обратно-совместимо. На устойчивой сети retry-helper не добавляет задержек — первая попытка проходит, и дальше всё как раньше. Поведение manage add --psk без импорта через vpn:// не меняется (PSK всегда корректно писался в .conf).
  • Новых зависимостей нет. Только bash-арифметика и sleepоба стандартные.

5.11.3 — 2026-04-28

v5.11.3 — UX-релиз AmneziaWG 2.0 VPN-инсталлятора: пять улучшений по горячим следам issues и discussions, без архитектурных изменений. Поддержка Ubuntu 24.04 / 25.10, Debian 12 / 13, x86_64 + ARM (Raspberry Pi, Oracle Ampere, Hetzner CAX) — без изменений.

Главное

  • 🍎 Shadowrocket на iOS / macOS теперь подключается из коробки. Флаг --psk для manage add появился ещё в v5.11.1, но не был виден в README — теперь он в Краткой справке + отдельный FAQ entry. (#62, @andreykorobko)
  • 📡 Ping внутри туннеля сервер ↔ клиенты — пошаговый рецепт через UFW + /etc/ufw/before.rules в FAQ. С явным предупреждением: ufw allow ... proto icmp не работает (UFW поддерживает через флаг proto только tcp/udp/esp/ah/gre/ipv6). (#63, @PavelVVrn)
  • 🌐 Карта мобильных операторов → I1 расширена. Megafon (регионы) и Tele2 (Красноярск) обновлены до I1=отсутствует — AWG 1.0 fallback для операторов, где сами CPS-пакеты триггерят DPI-блок. Под таблицей — точные команды (systemctl restart awg-quick@awg0 + manage regen <имя>). (#42, @alkorrnd)
  • 🤖 Авто-скрипты для cron / Ansible / Proxmox. manage --yes (флаг) или AWG_YES=1 (env) пропускают confirm-prompt в remove, restore, restart. Дефолтное поведение не меняется (opt-in).
  • 🗂️ Бэкапы без коллизий. Миллисекундный суффикс в имени файла (awg_backup_2026-04-28_15-53-50.123.tar.gz) защищает от перезаписи при двух backup'ах в одну секунду (например, regen → backup → modify → backup). Старые имена (без .NNN) работают как раньше.

Установка

wget https://raw.githubusercontent.com/bivlked/amneziawg-installer/v5.11.3/install_amneziawg.sh
chmod +x install_amneziawg.sh
sudo bash ./install_amneziawg.sh

3 команды → ~20 минут → готовый VPN-сервер с обфускацией трафика. Подробнее — README → Установка.

Обновление существующего сервера

Запустите install_amneziawg.sh свежей версии — на 5-м шаге manage_amneziawg.sh и awg_common.sh обновятся автоматически (с проверкой SHA256). Полные команды — ADVANCED.md → Как обновить скрипты.

Тесты

+34 новых bats (295 total, было 261 на v5.11.2):

  • test_yes_flag.bats (+11) — изоляция confirm_action через awk + eval. Проверяется, что non-"1" значения AWG_YES ("yes", "true", "0") не матчат bypass-ветку под принудительно интерактивным режимом.
  • test_backup_collision.bats (+8) — date +%3N даёт distinct значения при rapid-fire вызовах; find pattern и sort -r корректно обрабатывают и legacy-имена, и новые ms-suffix в одной директории.
  • test_v5113_docs.bats (+15) — инварианты для FAQ ICMP, таблицы операторов, --psk highlight; защита от RU/EN cross-link drift в README → ADVANCED.

Совместимость и зависимости

  • Полностью обратно-совместимо. --yes opt-in, дефолтное поведение не меняется. Backup ms-suffix рассчитан на сосуществование с легаси-именами. Откат на v5.11.2 безопасен.
  • Новых зависимостей нет. date +%3N (миллисекунды) — стандартный GNU coreutils, есть в Ubuntu/Debian из коробки.

5.11.2 — 2026-04-24

UX-патч к v5.11.1. Второй QR-код на клиента — из vpn:// URI — для one-tap импорта в flagship Amnezia VPN app (Android / iOS / Desktop). Существующий <имя>.png (скан из .conf) остаётся как есть и работает с WireGuard-совместимыми клиентами (AmneziaWG Windows, wireguard-apple, wg-quick).

Добавлено

  • Новая функция generate_qr_vpnuri в awg_common.sh / awg_common_en.sh. Читает /root/awg/<имя>.vpnuri (тот самый URI, что уже давно генерировался через generate_vpn_uri и содержит полный Amnezia-envelope — zlib-JSON containers/defaultContainer/hostName/dns/mtu/protocol_version=2 плюс все параметры AWG 2.0), скармливает его qrencode -t png, записывает /root/awg/<имя>.vpnuri.png с правами 600. Запись atomic: сначала в <имя>.vpnuri.png.tmp.$$ в той же директории, chmod 600, затем mv -f на целевой путь — при сбое qrencode или chmod старая версия файла остаётся нетронутой, orphan .tmp.* очищается.
  • Интеграция в generate_client и regenerate_client. После успешного generate_vpn_uri вызывается generate_qr_vpnuri. Если URI не получилось построить (нет perl-модулей / не загружены параметры), QR vpn:// пропускается без шума. QR из .conf и PNG vpn:// — независимые best-effort артефакты; отказ одного не ломает другой.
  • Интеграция в manage regen и manage remove. regen обновляет оба QR (conf и vpn://) в паре. remove чистит <имя>.vpnuri.png наряду с <имя>.conf / .png / .vpnuri и ключами.
  • Backup / restore автоматически подхватывает .vpnuri.png — новых путей в код не добавлял, существующий *.png glob в _backup_configs_nolock и chmod 600 *.png в restore_backup покрывают новый артефакт без изменений.

Зачем это

У flagship-приложения Amnezia VPN (Android / iOS / Desktop) один-тап импорт по QR-коду с форматом vpn://{base64url(zlib(json))}у меня URI давно формировался, но сохранялся только в текстовый .vpnuri, который надо было руками скопировать на устройство. Теперь вместо копирования файла достаточно показать второй QR-код и навести камеру телефона. Для классических WireGuard-клиентов первый QR (из .conf) остаётся рабочим.

Тесты

  • +10 новых bats (261 total, было 251 на v5.11.1):
    • test_qr_vpnuri.bats (+10) — happy path (stdin → PNG), отсутствие .vpnuri → ошибка, non-zero exit у qrencode → ошибка, atomic-write (pre-existing .vpnuri.png не перезаписывается при сбое, orphan .tmp.* не остаётся), chmod 600 на Linux/Darwin, RU/EN структурная parity функции (qrencode + .vpnuri.png + command -v guard), hooks в generate_client / regenerate_client / manage regen / cleanup в manage remove.

Breaking changes

Нет. Существующие клиентские .conf / .png / .vpnuri остаются рабочими. Новый .vpnuri.png генерируется только для клиентов, созданных или пересозданных на v5.11.2 — для старых клиентов достаточно один раз запустить manage regen <имя>. Откат на v5.11.1 безопасен (лишние .vpnuri.png просто лежат в /root/awg/ и игнорируются).

Зависимости

Новых нет: qrencode уже был в required-списке шага 2 installer'а (использовался generate_qr для .conf), perl + Compress::Zlib + MIME::Base64 — уже для generate_vpn_uri.


5.11.1 — 2026-04-23

UX-патч. Три небольших улучшения для manage на ручных (не-installer) установках — например, amneziawg-go userspace в LXC. Credit @Akh-commits за детальный live-тест в Issue #51 22 апр 2026, из которого вышли все три фикса.

Исправлено / Добавлено

  • manage add и regen теперь работают без кеша server_public.key. Новый helper _ensure_server_public_key вычисляет публичный ключ сервера из PrivateKey в [Interface] секции awg0.conf через awg pubkey, если /root/awg/server_public.key отсутствует (типичный случай для установок вне моего installer — там кеш не создаётся). Результат записывается атомарно (tmp + mv) с правами 600. Парсер awk терпим к пробельным отступам перед PrivateKey = (hand-edited конфиги).
  • Fallback-цепочка для Endpoint при отсутствии egress. Раньше manage add в LXC без доступа к внешним IP-сервисам падал с «Не удалось определить внешний IP сервера». Теперь после неудачного curl до ifconfig.me/ipify/icanhazip/ipinfo пробуется локальный IPv4 с первого interface в глобальной scope (ip -4 -o addr show scope global). Пользователь получает log_warn с подсказкой поправить Endpoint в клиентских .conf вручную, если сервер за NAT.
  • Новый флаг manage add --psk. Опционально включает PresharedKey в клиентском .conf и в серверном [Peer]. Генерирует 32-байт ключ через awg genpsk для каждого клиента в batch-режиме (разный PSK на каждого). По умолчанию флаг выключен — AWG 2.0 обфускации достаточно для большинства сценариев, PSK — дополнительный слой для параноиков или совместимости с классическим WireGuard deployment'ом. Документация обновлена в ADVANCED.md / ADVANCED.en.md раздел manage CLI.

Тесты

  • +19 новых bats (249 total, было 230 на v5.11.0):
    • test_server_pubkey_autogen.bats (+7) — no-op на существующем кеше, восстановление из awg0.conf, граничные случаи (отсутствие файла, отсутствие PrivateKey, ignored в [Peer] секциях, indented PrivateKey, RU/EN parity).
    • test_endpoint_fallback.bats (+5) — возврат IPv4 с global-scope interface, пустой вывод без global-scope, пропуск loopback, выбор первого из нескольких interfaces, RU/EN parity.
    • test_psk_flag.bats (+7) — отсутствие PresharedKey без флага, запись при установленном CLIENT_PSK, правильный порядок внутри [Peer] блоков, разрешение CLIENT_PSK="auto" в generate_client, парсинг --psk в manage RU+EN, help mention.

Breaking changes

Нет. Все три изменения additive — existing install-flow не меняется, без флага --psk поведение manage add идентично v5.11.0.


5.11.0 — 2026-04-22

Robustness bundle — закрыта пачка сценариев, в которых install или manage мог оставить систему в полу-сконфигурированном состоянии при сбое: двойной запуск install без reboot, обрыв скачивания helpers, kill во время restore, failed backup перед destructive modify, гонка при параллельном regen клиентов. CI ARM matrix теперь покрывает Ubuntu 25.10 и Debian 13 prebuilt-пакетами. Обновление рекомендуется всем, но v5.10.2 остаётся рабочим — блокирующих багов в нём нет.

Исправлено — install_amneziawg.sh

  • Двойной запуск install без reboot больше не ломает DKMS. request_reboot перед шагом 2 теперь сохраняет /proc/sys/kernel/random/boot_id в $AWG_DIR/.boot_id_before_step2. На входе шага 2 проверяется: если boot_id совпадает с сохранённым — скрипт умирает с сообщением «ожидалась перезагрузка перед step 2». Раньше повторный запуск без reboot пытался поставить amneziawg-dkms под старое ядро и падал в вермагике.
  • Запись setup_state стала атомарной. Теперь через tmp + flock + mv -f по PID-специфичному пути (${STATE_FILE}.tmp.$BASHPID). Parallel-invocation scenarios больше не могут прочитать полу-записанный номер шага.
  • Download awg_common.sh и manage_amneziawg.sh — через mktemp + SHA256 + atomic mv. Новый helper _secure_download(): curl пишет в mktemp, SHA256 проверяется, успешный файл переезжает в целевой путь одним mv. Прерванное соединение больше не оставляет полу-скачанный helper в /root/awg/. Аналогично для GPG keyring при импорте PPA.

Исправлено — manage_amneziawg.sh + awg_common.sh

  • restore_backup откатывается при сбое. Перед любой destructive-операцией restore создаёт pre-restore snapshot (уже делался и раньше для возможности отмены). В v5.11.0 snapshot становится известен самой функции (через LAST_BACKUP_PATH), а на все error-пути навешен trap _restore_cleanup RETURN. При ошибке после systemctl stop — автоматический откат: распаковка snapshot, возврат файлов на место, systemctl start awg-quick@awg0. Добавлен pre-flight validate_awg_config перед стартом сервиса — если восстановленный конфиг не валиден, сервис не стартует «сломанным», срабатывает откат. Trap чистит RETURN-ловушку в начале handler'а (trap - RETURN), чтобы не протечь в последующие вызовы.
  • _backup_configs_nolock не прячет сбои на критичных файлах. Silent || true убран. При ошибке cp на критичные артефакты (awg0.conf, awgsetup_cfg.init, server_public.key, server_private.key, клиентские *.conf, $KEYS_DIR/*, expiry/, /etc/cron.d/awg-expiry) функция возвращает 1 — повреждённый бэкап опаснее отсутствующего. Опциональные артефакты (QR *.png, *.vpnuri) остаются log_warn. Пустые глобы отличаются от сбоя cp через compgen -G pre-check.
  • modify_client не запускает destructive sed при failed backup. Ранее cp "$cf" "$bak" || log_warn "..." — замечание в лог, потом sed -i уничтожал конфиг без возможности отката. Теперь backup — hard gate: if ! cp ...; then log_error + release lock + return 1.
  • regenerate_client сериализуется через lock и проверяет каждый sed. Функция оборачивается в .awg_config.lock (flock, 10 с таймаут) — параллельные regen на одном имени больше не повреждают клиентский конфиг. Все три sed -i (DNS, PersistentKeepalive, AllowedIPs) теперь с if ! — при сбое возвращается 1, lock освобождается. Lock держится только пока мутируется .conf, до generate_qr/generate_vpn_uri он снимается — QR/URI остаются best-effort derived artifacts.
  • modify_client flock-timeout больше не протекает fd. В ветке «другая операция занимает lock» теперь exec {modify_lock_fd}>&- перед return 1. Раньше fd оставался открытым до выхода шелла.
  • Версия manage_amneziawg.sh синхронизирована между RU и EN. Разъехавшиеся 5.10.0 / 5.10.1 сведены к 5.11.0.

CI / сборка

  • ARM matrix: добавлены Ubuntu 25.10 и Debian 13, удалён Ubuntu 22.04. .github/workflows/arm-build.yml теперь собирает prebuilt amneziawg.ko для 7 targets: 3× Raspberry Pi + ubuntu-2404-arm64 + ubuntu-2510-arm64 + debian-bookworm-arm64 + debian-trixie-arm64. Матрица строго соответствует supported-OS списку инсталлятора. _try_install_prebuilt_arm в install_amneziawg.sh обновлён синхронно — новые ветви *-generic* + 25.10 → ubuntu-2510-arm64 и *-arm64* + debian + 13 → debian-trixie-arm64; мёртвая 22.04 удалена.
  • Timeouts на всех workflow-jobs. shellcheck:10m, test:10m, release:15m, arm-build prepare:5m, build:60m. Зависший job больше не жжёт CI-минуты молча. (Уже приехало в polish PR #55 к v5.10.2, фиксирую здесь для полноты.)

Docs

  • Минимальный awg0.conf для AWG 2.0 в ADVANCED.md / ADVANCED.en.md. Новая секция с примером для ручной установки (amneziawg-go в LXC и пр.): все 11 обфускационных параметров (Jc/Jmin/Jmax/S1-S4/H1-H4), примечания по S3/S4 (добавлены в AWG 2.0 позже S1/S2 — в конфигах от AWG 1.x их может не быть), INT32_MAX upper-bound для H1-H4, I1 опционален.
  • Пояснение #_Name = <имя> маркера в «Полный список команд управления» — раньше было неявно, только в примерах. Теперь явно: list/remove/regen/modify ищут клиентов по этому маркеру в [Peer]; при миграции awg0.conf со старого сервера нужно дописывать его руками.
  • Секция «LXC / Docker через amneziawg-go (userspace)» в ADVANCED (источник: @Akh-commits, Issue #51). Рабочий рецепт для privileged LXC на Proxmox 9 c Debian 13 guest, security tradeoffs, prebuilt binary vs source build. Уехало в main до v5.11.0 tag, поэтому формально здесь фиксируется как часть v5.11.0.

Тесты

  • +84 новых bats (230 total, было 146 на v5.10.2).
    • test_state_machine.bats (+18) — atomic update_state, boot_id guard, entry-step-2 die, request_reboot capture.
    • test_manage_robustness.bats (+24) — _backup_configs_nolock contract (LAST_BACKUP_PATH, compgen -G, critical vs optional), modify_client backup gate, regenerate_client lock + sed checks, flock-timeout fd release.
    • test_restore_rollback.bats (+27) — _restore_do_rollback helper, trap RETURN + cleanup contract, _destructive_ops_started gate, pre-flight validate_awg_config, trap/rollback regression guards.
    • test_arm_matrix.bats (+15) — matrix-vs-installer cross-reference, RU/EN mapping parity, absence of dropped 22.04.
  • Бонус: 9 тестов с Unicode em-dash/arrow в именах, которые bats-парсер silently skipал, переведены на ASCII. Теперь реально выполняются.

Breaking changes

  • Нет. restore_backup внешнее поведение прежнее (успех → сервис работает, сбой → раньше частичное состояние, теперь откат); manage CLI не менялся; формат awgsetup_cfg.init совместим; SHA256 helpers обновлены — downgrade с v5.11.0 на v5.10.2 возможен откатом файлов.

5.10.2 — 2026-04-20

Срочный hotfix. В v5.10.1 любая свежая установка AmneziaWG 2.0 падала в шаге 1 с ошибкой apt_update_tolerant: command not found — на всех зеркалах, не только Hetzner. Если вы уже запускали v5.10.1 на новом сервере или планируете ставить с нуля — переходите на v5.10.2. Также закрыт граничный случай, где apt_update_tolerant мог проигнорировать silent crash (SIGKILL, OOM).

Исправлено

  • Критическая регрессия v5.10.1: apt_update_tolerant: command not found ломал установку. Функция была определена в awg_common.sh, но этот файл скачивается только на шаге 5. Первый apt update в шаге 1 (перед системным обновлением) и второй в шаге 2 (после добавления PPA) получали command not found, и установка падала с die "Ошибка apt update". В v5.10.2 определение переехало inline в install_amneziawg.sh — рядом с log/die, по тому же паттерну, что уже использовался для generate_awg_params. Из awg_common.sh оно удалено.
  • Граничный случай в apt_update_tolerant: silent crash / OOM / SIGKILL больше не маскируется. Если apt-get update возвращал non-zero БЕЗ классифицируемых строк E:/Err:/W: в stderr (SIGKILL от OOM-killer, silent crash, неизвестный формат), функция ошибочно возвращала 0 с сообщением "source packages недоступны". Теперь перед таким fallback проверяется наличие source-маркеров в выводе; если их нет — ошибка пробрасывается вверх.
  • Regex future-proofing. Паттерн Sources([[:space:]]|$) заменён на Sources([^[:alpha:]]|$) — ловит будущие варианты вроде Sources.xz, но не даёт false-match на строки типа SourcesMirror.
  • Синхронизация даты в шапке install_amneziawg_en.sh (было 2026-04-16, теперь 2026-04-20, соответствует релизу).

Тесты

  • +9 новых bats-тестов (146 total, было 137).
    • test_apt_tolerant.bats: +3 теста — silent crash (rc!=0, пустой stderr), DNS failure без E:-префикса, regex не ловит SourcesMirror. Загрузка функции переехала с source awg_common.sh на extract через sed range из install_amneziawg.sh.
    • test_install_defines_apt_tolerant.bats (новый, 6 тестов) — regression guard: фиксирует инвариант "определение inline в обоих install-скриптах, нет в awg_common" + все вызовы идут после определения.

5.10.1 — 2026-04-19

Совместимость с зеркалами без source-пакетов (Hetzner, AWS и др.) — Discussion #47.

Исправлено

  • apt update не падает на 404 для source-пакетов. Некоторые зеркала (Hetzner Ubuntu, AWS Ubuntu) не раздают source-пакеты, но дефолтный /etc/apt/sources.list.d/ubuntu.sources содержит Types: deb deb-src. Наш прежний apt update -y || die падал с ошибкой. Новая функция apt_update_tolerantawg_common.sh; перемещена inline в install_amneziawg.sh в v5.10.2) игнорирует 404 только на source/Sources/deb-src, но пропускает все остальные ошибки (GPG, network, недоступный PPA).
  • Удалена модификация /etc/apt/sources.list.d/ubuntu.sources. Скрипт больше не включает deb-src — мы никогда не использовали source-пакеты (kernel module ставится через DKMS + бинарные headers), так что модификация была лишней и создавала проблему.

Тесты

  • +6 новых bats-тестов (137 total, было 131). test_apt_tolerant.bats: clean update, source-only 404, deb-src 404, GPG error, binary 404, смешанные ошибки.

5.10.0 — 2026-04-16

Оптимизация для мобильных сетей: CLI-флаги --preset=mobile и --jc/--jmin/--jmax, комплексный аудит безопасности и надёжности всего кодовой базы (Discussion #38, Issue #42).

Добавлено

  • CLI-флаг --preset=mobile для мобильных сетей. Фиксирует Jc=3, узкий Jmax (Jmin+20..80) — подтверждённые настройки для Tele2, Yota, Мегафон, Таттелеком и других операторов, блокирующих AWG с Jc>3 и Jmax>300. Также доступен --preset=default для явного выбора стандартного профиля (Jc=3-6, Jmin=40-89, Jmax=Jmin+50..250).
  • CLI-флаги --jc=N, --jmin=N, --jmax=N. Точечное переопределение параметров обфускации поверх любого preset. Jc: 1-128, Jmin/Jmax: 0-1280, Jmax должен быть ≥ Jmin. Пример: --preset=mobile --jc=4 использует mobile-профиль, но с Jc=4 вместо 3.
  • Валидация протокольных границ в validate_awg_config. Проверка AWG-параметров после восстановления из бэкапа: Jc (1-128), Jmin/Jmax (0-1280, Jmax ≥ Jmin), S3 (0-64), S4 (0-32), корректность H1-H4 диапазонов (нижняя граница < верхней).
  • Сохранение AWG_PRESET в конфигурацию. Выбранный preset записывается в awgsetup_cfg.init для диагностики и воспроизводимости.

Безопасность

  • Защита конфигурационного парсера от BOM и CRLF. safe_load_config и safe_read_config_key теперь удаляют BOM (UTF-8 \xEF\xBB\xBF) и CR (\r) перед парсингом. Защищает от проблем при редактировании конфигов в Windows-редакторах.
  • Экранирование спецсимволов в regenerate_client. sed-замены корректно экранируют &, \, / в значениях, предотвращая инъекцию через ключи клиента.
  • Привязка GitHub Actions к SHA-хешам. Все 7 actions в 4 workflow привязаны к конкретным SHA вместо мутабельных тегов (supply chain protection).
  • Маскирование endpoint в диагностическом отчёте. Функция generate_diagnostic_report заменяет IP-адрес сервера на ***MASKED*** для безопасной публикации отчётов.
  • Права доступа для vpn:// URI. secure_files и restore_backup устанавливают chmod 600 для файлов .vpnuri и .png (QR-коды).
  • Валидация имени клиента в set_client_expiry. Защита от path traversal через имя клиента.
  • Кавычки в путях cron-файла. install_expiry_cron корректно обрамляет пути с пробелами.

Надёжность

  • Устранение TOCTOU в modify_client. Валидация параметров вынесена до захвата лока, проверка состояния клиента — внутри лока. File descriptor корректно закрывается на всех путях ошибки.
  • Корректный restart сервиса. Шаг 7 теперь определяет уже запущенный сервис и использует enable + restart вместо повторного awg-quick up, предотвращая ошибку «interface already exists».
  • Устранение утечки I1. load_awg_params очищает AWG_I1 перед парсингом серверного конфига, предотвращая подмену CPS-параметра значением из начальной конфигурации.
  • Корректная перегенерация при CLI-флагах. При повторном запуске с --preset или --jc/--jmin/--jmax параметры AWG принудительно перегенерируются, даже если конфиг уже существует.
  • Завершение шага при ARM prebuilt. Путь установки через prebuilt .deb теперь корректно обновляет state и запрашивает перезагрузку, предотвращая бесконечный цикл шага 2.
  • Корректный формат regex в release.yml. Экранированы точки в паттерне версии (5\.10\.0 вместо 5.10.0).
  • Preflight-проверки в build-arm-deb.sh. Добавлены проверки modinfo, sha256sum, awk, xz, определение kernel через /lib/modules/*/build, guard на пустой MODULE_VER.

CI/CD

  • Расширение scope ShellCheck. Workflow теперь линтит scripts/*.sh и tests/*.bash помимо корневых .sh.
  • Hygiene для test.yml. Добавлены permissions: contents: read и concurrency group для предотвращения параллельных прогонов.

Тесты

  • +33 новых bats-теста (131 total, было 98). test_preset.bats (18): preset selection, CLI overrides, валидация. test_validate.bats (+8): протокольные границы. test_safe_load_config.bats (+4): CRLF, BOM, BOM+CRLF, значения с =. test_validate_endpoint.bats (+3): полный IPv6, single-label hostname, пустые скобки.

📣 Основные возможности ветки 5.x — в v5.8.0 release notes. ARM-поддержка — в v5.9.0. v5.10.0 — оптимизация для мобильных сетей и комплексный аудит без breaking changes.


5.9.0 — 2026-04-15

Поддержка Raspberry Pi (arm64 и armhf) и серверов на ARM64 (AWS Graviton, Oracle Ampere, Hetzner arm64). Полная реализация от @pyr0ball (PR #43, Issue #37).

Добавлено

  • Prebuilt kernel modules для ARM. Новый GitHub Actions workflow (.github/workflows/arm-build.yml) собирает amneziawg.ko для 6 ARM-таргетов через QEMU при каждом push тега v*. Таргеты: rpi-bookworm-arm64 (Raspberry Pi 3/4), rpi5-bookworm-arm64 (Pi 5 / Cortex-A76), rpi-bookworm-armhf (Pi 3/4 32-bit), ubuntu-2404-arm64, ubuntu-2204-arm64, debian-bookworm-arm64. Готовые .deb + .sha256 публикуются в отдельный release arm-packages. Build-скрипт — scripts/build-arm-deb.sh, можно запускать вручную на ARM-железе вне CI.
  • Автоматический выбор пути установки на ARM. На aarch64/armv7l шаг 2 сначала пробует prebuilt .deb из arm-packages (kernel vermagic должен совпадать точно), при несовпадении молча откатывается на DKMS. Curl с --max-time 60 от зависаний, SHA256 проверяется перед dpkg -i. Экономит время и RAM на минимальных системах без build-tools.
  • Корректное определение kernel headers для Raspberry Pi. Ядра RPi Foundation (+rpt/-rpi суффикс) теперь подтягивают linux-headers-rpi-v8 или linux-headers-rpi-2712 вместо несуществующего linux-headers-arm64. amneziawg-tools (userspace) на ARM уже поставляется через PPA для arm64/armhf — отдельная сборка не нужна.
  • Bats-тесты для header selection. tests/test_rpi_headers.bats — 6 сценариев: +rpt-rpi-v8rpi-v8, +rpt-rpi-2712rpi-2712, legacy -rpi-v8, mainline arm64 Debian, amd64, generic Ubuntu kernel.

Тесты

  • x86_64 regression на чистом Ubuntu 24.04 LTS, kernel 6.8.0-110-generic: DKMS сборка, загрузка модуля, awg show, manage add/list/backup, uninstall — всё без изменений. ARM-путь корректно пропускается на x86_64, _try_install_prebuilt_arm не вызывается.
  • ARM end-to-end на Raspberry Pi 4 / Debian 12 / kernel 6.12.75+rpt-rpi-v8 (DKMS-путь, prebuilts ещё не опубликованы на момент PR): full install lifecycle, awg-quick@awg0 active, vermagic совпадает.

Вне этого релиза

  • OpenWrt — отдельная pkg-экосистема, нужен OpenWrt SDK
  • Авто-трекинг обновлений ядра / detection сломанных пакетов
  • Armbian и прочие SBC vendor-ядра (отдельные follow-up)

📣 Основной relnotes пакет для ветки 5.x — в v5.8.0 release notes. v5.9.0 — minor bump, добавление ARM-поддержки без breaking changes для существующих x86_64 установок.


5.8.4 — 2026-04-13

Hardening-фиксы надёжности и безопасности по результатам ревью установщика и скрипта управления.

Безопасность

  • Расширенная проверка типов файлов в restore_backup. Verbose-листинг архива (tar -tvzf) теперь проверяет тип каждого entry по первому символу. Архивы с блочными устройствами (b), символьными устройствами (c), FIFO (p), hardlink (h) или symlink (l) внутри отклоняются ещё до распаковки. Параллельно добавлен флаг --no-same-permissions при извлечении: права файлов всегда выставляются из umask процесса, не из метаданных архива. Защита от crafted-архивов, которые обходили проверку путей v5.8.3.
  • Валидация диапазона октетов IPv4 в validate_endpoint. Ранее регулярное выражение допускало 999.0.0.1 как "валидный" IPv4 (паттерн [0-9]{1,3} не проверял числовое значение). Теперь добавлен второй проход через BASH_REMATCH: каждый октет проверяется как число в диапазоне 0-255. validate_endpoint "256.0.0.1" и validate_endpoint "999.999.999.999" теперь корректно возвращают 1.
  • restore_backup — прерывание при первой ошибке копирования. Все 5 критических операций cp -a (server/, clients/, keys/, server_private.key, server_public.key) теперь явно проверяются на ошибку. При сбое — снимаются оба лока и функция немедленно возвращает 1 с описанием какой именно файл не удалось скопировать. Предотвращает сценарий полу-восстановленной конфигурации.

Надёжность

  • Файловые локи в backup_configs и restore_backup. backup_configs() теперь захватывает .awg_backup.lock (таймаут 30 сек) перед созданием архива. restore_backup() захватывает .awg_backup.lock (внешний) плюс .awg_config.lock (внутренний, 30 сек) перед извлечением. Порядок захвата фиксирован (backup → config), deadlock исключён. При конкурентном запуске manage backup и manage restore второй процесс ждёт или завершается с диагностикой.
  • Предотвращение self-deadlock в restore_backup. До этого фикса restore_backup() вызывала backup_configs() для safety snapshot — оба пытались захватить .awg_backup.lock → deadlock. Выделена внутренняя функция _backup_configs_nolock(), которую restore_backup() вызывает уже внутри своего locked scope. backup_configs() (публичный entry point) остаётся с собственным локом.
  • UFW exit code checks в setup_improved_firewall. Каждая команда ufw (default deny/allow, limit SSH, allow VPN port, route rule) на обоих ветках (inactive и active) теперь проверяет exit code. Аккумулированные ошибки → return 1. Ранее ошибка одного правила UFW не прерывала настройку firewall.
  • SHA256 bypass логируется на уровне WARN. При старте с переопределённым AWG_BRANCH (тест кастомной ветки) пропуск проверки SHA256 ранее молча шёл через log_debug. Теперь — log_warn, чтобы разработчик и в verbose-логе видел что целостность не проверялась.

Тесты

  • +7 новых bats-тестов. test_validate_endpoint.bats +4: отклонение 999.999.999.999, 256.1.1.1; принятие 255.255.255.255, 0.0.0.0. test_restore_backup.bats +1: реальный архив + mock-tar с block device entry → тип-чек отклоняет (негативный тест, проверяет корректное отклонение опасных entry). test_apply_config.bats +2: flock timeout возвращает 1; systemctl restart failure → non-zero. Всего 92 bats-теста, все PASS.

📣 Основной relnotes пакет для ветки 5.8.x — в v5.8.0 release notes. v5.8.4 — hardening-фиксы поверх 5.8.3 без breaking changes.


5.8.3 — 2026-04-11

Набор hardening-фиксов и точечных улучшений по мотивам Issue #42 и внутреннего аудита.

Безопасность

  • Проверка целостности скачиваемых скриптов (SHA256). install_amneziawg.sh в шаге 5 теперь считает sha256sum для awg_common.sh и manage_amneziawg.sh сразу после curl и сверяет с hardcoded значениями, которые обновляются при каждом релизе. При несовпадении — установка прерывается. Защита от подмены на транзитном узле или при компрометации raw.githubusercontent.com. Проверка автоматически пропускается если AWG_BRANCH переопределён пользователем для теста кастомной ветки.
  • Валидация tar-архива перед распаковкой в restore_backup. До распаковки скрипт читает список файлов через tar -tzf и отклоняет архив если внутри есть абсолютные пути (/etc/...) или path traversal (..). После распаковки — ищет symlinks в распакованном дереве и отклоняет архив при их наличии. Плюс tar -xzf --no-same-owner для гарантии того что владелец файлов — root, а не метаданные архива. Защита от crafted или подменённого бэкапа.

Исправлено

  • Мобильный интернет — Yota/Tele2 блокировали VPN (Issue #42). @markmokrenko отчёт: после стандартной установки на Yota и Tele2 подключение не проходит, на Beeline работает. Диагноз: проблема в Jmin/Jmax. Это продолжение Discussion #38 — мобильные операторы чувствительны к размеру junk-пакетов. Снизили Jmax offset с Jmin+100..500 до Jmin+50..250, максимальный размер junk-пакета упал с ~590 до ~340 байт. Обфускация сохранена, совместимость с мобильными улучшается.

Тесты

  • 4 новых bats-теста для restore_backup tar-валидации: happy path (good backup), absolute path rejection, path traversal rejection, server key chmod 600. Всего 85 bats-тестов, все PASS.

Live VPS-тесты

Релиз проверен на чистом Ubuntu 24.04 LTS: 13/13 проверок пройдено. Tar-валидация отработала на трёх типах атак — path traversal, абсолютные пути, symlinks. Проверка SHA256 verify_sha256 отработала на корректной и некорректной hash. UFW routing cleanup при --uninstall подтверждён.

📣 Основной relnotes пакет для ветки 5.8.x — в v5.8.0 release notes. v5.8.3 — hotfix поверх 5.8.2 с security hardening и Jmax range для мобильных сетей.


5.8.2 — 2026-04-10

Исправлено

  • VNC-консоль хостера ломалась, потеря сети на Hetzner (Discussion #41): rp_filter снижен с 1 (strict) до 2 (loose). Strict mode ломал routing на облачных хостерах (Hetzner и подобных) где шлюз в другой подсети. Добавлен kernel.printk = 3 4 1 3 для подавления kernel warning messages в VNC-консоли. Спасибо @z036.
  • --uninstall теперь корректно удаляет UFW routing rules: добавлено out on <nic> при удалении — UFW требует полное совпадение с правилом которое было создано при установке.
  • Дефолтный Jc снижен с 4-8 до 3-6 (Discussion #38): мобильные сети (LTE/5G) плохо переносят большое количество junk-пакетов. @elvaleto подтвердил что Jc=3 стабильно работает на Таттелеком (Летай).

Документация

  • ADVANCED.md/en FAQ: добавлены 2 новых entry — рекомендация Jc/I1 для мобильных сетей и workaround для VNC/Hetzner rp_filter проблемы. Таблица параметров обновлена: Jc диапазон 4-8 → 3-6.

5.8.1 — 2026-04-09

Точечный hotfix v5.8.0 по мотивам Discussion #40 от @z036: рандомизированные H1-H4 из v5.8.0 попадали в диапазон [2^31, 2^32-1], который клиент amneziawg-windows-client подчёркивает как невалидный и не даёт сохранять правки конфига. Сервер (amneziawg-go) полный uint32 принимает, проблема только в UI-валидаторе клиента.

Исправлено

  • H1-H4 Windows client compatibility (Discussion #40): generate_awg_h_ranges теперь ограничивает верхний bound значений на 2^31-1 = 2147483647 вместо полного uint32. Это совместимо с isValidHField() в amnezia-vpn/amneziawg-windows-client#85 (upstream баг, открыт с февраля 2026, не исправлен). Реализация: bit-маска 0x7FFFFFFF на выходе od -N32 -tu4 /dev/urandom плюс rand_range 0 2147483647 в fallback-пути. Смещения нет — каждый младший бит остаётся независимым. Обфускация не слабеет: 4 непересекающиеся пары в [0, 2^31) с минимальной шириной 1000 каждая дают астрономическое количество возможных комбинаций, ТСПУ по дефолтам не зафингерпринтит. Спасибо @z036 за точный скриншот с подсвеченными полями.

Совместимость

  • Существующие установки v5.8.0 продолжают работать на сервере. amneziawg-go принимает полный uint32, handshake с клиентами не ломается. Единственное неудобство — редактор конфигов в amneziawg-windows-client подчёркивает H2-H4 красным, если они случайно попали в верхнюю половину диапазона (~99.6% новых v5.8.0 установок). Кросс-платформенный amnezia-client (Qt, Android/iOS/Desktop) этого ограничения не имеет.
  • Апгрейд с v5.8.0 рекомендуется если используешь amneziawg-windows-client: sudo bash /root/awg/install_amneziawg.sh --uninstall --yes, потом установка v5.8.1 заново. Новые H1-H4 будут в безопасной половине диапазона.
  • Алгоритм и формат конфига не изменились, только пространство генерации. Никаких breaking changes для сервера или существующих клиентских .conf.

Тесты

  • tests/test_h_ranges.bats обновлён: верхняя граница проверки изменена с 2^32-1 на 2^31-1 + добавлен регрессионный тест на 20 запусков × 8 значений (160 samples) которые все должны быть ≤ 2147483647. Всего 81 bats-тест (+1 от 5.8.0).

Документация

  • ADVANCED.md/en FAQ: добавлен entry про upstream баг amneziawg-windows-client с объяснением root cause, ссылками на upstream issue #85 и Discussion #40, тремя вариантами workaround для пользователей v5.8.0.

📣 Основной relnotes пакет для ветки 5.8.x — в v5.8.0 release notes. Там весь контекст Discussion #38 (ТСПУ fingerprint) и история нескольких раундов аудита кода. v5.8.1 — hotfix поверх 5.8.0, рекомендуется всем пользователям Windows-клиента.


5.8.0 — 2026-04-07

Крупное обновление безопасности и надёжности после нескольких последовательных аудитов кода. Причина minor bump вместо patch — накопился значительный объём breaking-semantics изменений в обработке конфигов, parameter source of truth, и обработке ошибок.

Безопасность

  • ТСПУ-фингерпринт по дефолтным H1-H4 (Discussion #38): Диапазоны H1-H4 в generate_awg_params были захардкожены одинаковыми для всех установок (100000-800000, 1000000-8000000, ...). Российский DPI зафингерпринтил эту статическую сигнатуру — установки переставали работать через мобильных операторов РФ. H1-H4 теперь рандомизируются при каждой установке: 8 случайных uint32 значений сортируются и группируются в 4 непересекающиеся пары. Каждая установка получает уникальные диапазоны без статической сигнатуры. Спасибо @Klavishnik (отчёт) и @elvaleto (диагностика).

  • Split-brain prevention в load_awg_params: Если live awg0.conf существует, он теперь ЕДИНСТВЕННЫЙ источник истины для AWG протокольных параметров. Частично повреждённый live-конфиг (пропавшее поле H4 например) даёт explicit error с return 1 вместо тихого fallback на устаревшие значения из init-файла. Это закрывает класс split-brain багов, когда сервер живёт по одному конфигу, а regen выпускает клиентам другой набор J*/S*/H*.

  • Atomic export в load_awg_params_from_server_conf: Парсер больше не экспортирует AWG_* по мере нахождения полей. Теперь либо все 11 обязательных полей успешно прочитаны и экспортированы, либо environment не модифицируется вообще. Защищает от mixed state при повреждённом awg0.conf.

  • restore_backup форсирует chmod 600 на восстановленных серверных ключах вместо наследования mode из архива через cp -a. Защищает от восстановления ключей с неправильными правами если backup был создан с поломанной umask.

  • --uninstall больше не отключает UFW глобально (HIGH severity, audit). Раньше ufw --force disable убивал весь firewall на VPS где UFW использовался для SSH/web hardening ДО установки нашего скрипта. Теперь installer записывает маркер .ufw_enabled_by_installer только если ДО установки UFW был inactive, и uninstall отключает UFW только при наличии маркера. Backwards compat: старые установки без маркера получают safer-by-default — UFW продолжит работать.

  • Process-wide lock в установщике (audit). Два concurrent запуска install_amneziawg.sh --yes могли читать одинаковый setup_state, конкурентно дёргать apt-get и ломать package state. Теперь flock -n на $AWG_DIR/.install.lock берётся в начале main() на весь lifetime процесса — второй экземпляр получает die "Другой installer уже запущен".

  • Валидация --endpoint (audit). Раньше значение принималось verbatim и записывалось в init и client.conf без sanity check. Newline/кавычки в endpoint могли injectить лишние директивы в конфиги. Новая функция validate_endpoint() запрещает newline/CR/кавычки/backslash и требует формат FQDN / IPv4 / [IPv6].

Исправлено

  • regen не обновлял AWG-параметры в клиентских конфигах (#38): load_awg_params читал AWG-параметры только из закешированного /root/awg/awgsetup_cfg.init, а не из актуального /etc/amnezia/amneziawg/awg0.conf. Если пользователь правил awg0.conf руками (например, для смены параметров обфускации), regen генерировал клиентские конфиги со старыми значениями. Теперь load_awg_params приоритетно читает live серверный конфиг, init-файл используется только как bootstrap fallback при первой установке. Добавлена новая функция load_awg_params_from_server_conf.

  • manage add/remove игнорировали exit code apply_config (audit). При failure apply_config команды логировали "Конфигурация применена" и возвращали success — юзер видел "OK", хотя peer был applied только в конфиг, но не к live интерфейсу. Теперь caller проверяет return code, логирует actionable error с указанием на systemctl status, и устанавливает _cmd_rc=1.

  • check_expired_clients оставлял peer на live интерфейсе при ошибке apply (audit). Если apply_config падал после удаления expired peer из state файлов — peer исчезал из expiry/, но оставался активным на интерфейсе до ручного перезапуска. Permanent stuck state. Теперь функция проверяет return code и возвращает 1 с actionable сообщением.

  • --uninstall удалял /etc/fail2ban/jail.local по эвристике (audit). Раньше весь файл удалялся если содержал banaction = ufw — слишком широкий фильтр, мог снести чужой jail.local с custom jails. Блок удаления полностью убран, оставлено только rm -f /etc/fail2ban/jail.d/amneziawg.conf (наш собственный artefact).

  • check_server не проверял exit code awg show (audit). Мог отрапортовать "Состояние OK" даже когда awg упал. Теперь awg show awg0 вызывается с сохранением вывода и проверкой exit code.

  • backup_configs/restore_backup leak'или временные директории при SIGINT (audit). mktemp -d использовался напрямую, а trap cleanup _awg_cleanup удалял только файлы. Добавлен helper manage_mktempdir с регистрацией в массиве и chained cleanup.

  • add_peer_to_server теперь берёт inner flock для защиты при прямых вызовах не через generate_client (defense-in-depth, self-audit). Контракт "caller должен держать lock" был fragile.

  • check_expired_clients валидирует имя клиента перед использованием в путях (defense-in-depth, self-audit). Раньше name=$(basename "$efile") использовался без валидации.

  • Имена backup файлов больше не содержат двоеточий: %F_%T%F_%H-%M-%S. Двоеточия несовместимы с FAT/NTFS при копировании backup на другой носитель.

  • apply_config имеет explicit return 0 на success path — убирает неопределённость exit code от exec {fd}>&-.

Оптимизации

  • generate_awg_h_ranges делает один read из /dev/urandom вместо 8 subprocess вызовов rand_range. od -An -N32 -tu4 /dev/urandom читает 32 байта = 8 uint32 значений за одну операцию. Fallback на rand_range если /dev/urandom недоступен.

Тесты

  • 80 bats-тестов (+34 от baseline 5.7.12 / 46 тестов):
    • test_h_ranges.bats — 9 проверок генерации H1-H4
    • test_load_awg_params.bats — 14 проверок парсера awg0.conf, priority над init-файлом, split-brain prevention, atomic export, bootstrap path
    • test_validate_endpoint.bats — 14 проверок validate_endpoint (valid FQDN/IPv4/IPv6, reject newline/CR/quotes/space/backslash/empty)
  • Все 46 существующих тестов (apply_config, IP allocation, parse_duration, peer management, safe_load_config, validate) продолжают PASS без регрессий.

Документация

  • ADVANCED.md/en FAQ: добавлен workflow "Ротация параметров обфускации при детектировании DPI" — как править awg0.conf + restart + regen, с указанием что с 5.8.0 regen читает live config.

5.7.12 — 2026-04-06

Исправлено

  • Fail2Ban на Debian (Discussion #39): На Debian 12/13 rsyslog не установлен — fail2ban падал без доступа к /var/log/auth.log. Добавлен backend = systemd и установка python3-systemd для Debian. Ubuntu продолжает использовать backend = auto.

5.7.11 — 2026-03-31

Исправлено

  • regen портит Address на Debian/mawk (#31): \s в awk (PCRE-расширение) не поддерживается mawk. Заменено на [ \t]. Также grep -oP для приватного ключа заменён на POSIX-совместимый sed.
  • regen теряет значения после modify (#31): При перегенерации конфига пользовательские настройки (DNS, PersistentKeepalive, AllowedIPs), изменённые через modify, теперь сохраняются.
  • modify оставляет .bak файлы (#31): Бэкап-файл удаляется после успешного изменения.
  • check не видит порт на Debian (#31): grep -qP заменён на POSIX-совместимый grep во всех местах проверки порта.

5.7.10 — 2026-03-31

Добавлено

  • Batch remove клиентов (#30): manage remove client1 client2 client3 — удаление нескольких клиентов одной командой с одним apply_config в конце.
  • AWG_SKIP_APPLY=1 (#30): Переменная среды для пропуска apply_config. Позволяет накопить изменения и применить одной командой — для автоматизации и API-интеграций. Корректное сообщение "Применение отложено" вместо "Конфигурация применена".
  • flock в apply_config (#30): Межпроцессная блокировка (${AWG_DIR}/.awg_apply.lock) предотвращает параллельные restart/syncconf вызовы.
  • Unit тесты (bats-core): 43 теста для awg_common.sh — parse_duration, safe_load_config, IP allocation, peer management, apply_config modes, validate. CI workflow .github/workflows/test.yml.

5.7.9 — 2026-03-25

Добавлено

  • Режим применения конфигурации (#30): Новая опция --apply-mode=restart для manage_amneziawg.sh. Позволяет переключиться на полный перезапуск сервиса вместо awg syncconf — обходит upstream deadlock в модуле amneziawg (amneziawg-linux-kernel-module#146). Режим сохраняется в awgsetup_cfg.init (AWG_APPLY_MODE=restart).

5.7.8 — 2026-03-24

Добавлено

  • Batch add клиентов (#29): manage add client1 client2 client3 ... — создание нескольких клиентов одной командой. awg syncconf вызывается один раз в конце вместо N раз. Предотвращает kernel panic при массовом создании клиентов (upstream баг модуля amneziawg-linux-kernel-module#146).

5.7.7 — 2026-03-24

Исправлено

  • Потеря клиентов при переустановке: render_server_config перезаписывал awg0.conf с нуля. Существующие [Peer] блоки теперь автоматически восстанавливаются из бэкапа при повторном прогоне шага 6.
  • Race condition при добавлении клиентов (TOCTOU): get_next_client_ip и add_peer_to_server теперь выполняются в одной критической секции (flock в generate_client). Два параллельных add больше не могут выбрать один и тот же IP.
  • Ложный успех restore: restore_backup при ошибках копирования (server/clients/keys) теперь возвращает non-zero exit code вместо тихого «Восстановление завершено».
  • Парсер конфига и двойные кавычки: safe_load_config теперь корректно обрабатывает значения в двойных кавычках ("value") в дополнение к одинарным.

5.7.6 — 2026-03-24

Исправлено

  • UFW блокирует VPN-трафик (Discussion #28): Добавлено правило ufw route allow in on awg0 out on <nic> при настройке фаервола. Ранее default policy deny (routed) блокировала проброс пакетов awg0→eth0, несмотря на PostUp iptables правила. Правило автоматически удаляется при деинсталляции.
  • PostUp FORWARD ordering: iptables -A FORWARD заменён на iptables -I FORWARD для приоритетной вставки правила в начало цепочки. Гарантирует корректную маршрутизацию при работе без UFW (--no-tweaks).

5.7.5 — 2026-03-20

Исправлено

  • Trailing newlines в awg0.conf (#27): После удаления пиров в серверном конфиге накапливались множественные пустые строки. Добавлена нормализация через cat -s при каждом remove.
  • Timeout для awg syncconf (#27): awg-quick strip и awg syncconf теперь вызываются с timeout 10. При зависании (upstream deadlock amneziawg-linux-kernel-module#146) скрипт делает fallback на полный перезапуск сервиса вместо бесконечного ожидания.

5.7.4 — 2026-03-20

Исправлено

  • MTU 1280 по умолчанию (Closes #26): Серверный и клиентские конфиги теперь содержат MTU = 1280. Решает проблему подключения смартфонов через сотовые сети и iPhone.
  • Jmax cap: Максимальный размер junk-пакетов ограничен Jmin+500 (было Jmin+999). Предотвращает фрагментацию при MTU 1280.
  • validate_subnet: Последний октет подсети должен быть 1 (адрес сервера). Ранее допускались произвольные значения, что приводило к конфликту с get_next_client_ip.
  • awg show dump parsing: Пропуск interface line через tail -n +2 вместо ненадёжной проверки пустого поля psk.
  • manage help без AWG: help и пустая команда выводят справку до check_dependencies, позволяя использовать --help без установленного AWG.
  • help text: Справка инсталлятора перечисляет все 4 поддерживаемые ОС (Ubuntu 24.04/25.10, Debian 12/13).
  • manage --expires help: Добавлен формат 4w в справку --expires (уже поддерживался парсером, но отсутствовал в тексте help).

Улучшено

  • Кэш IP: get_server_public_ip() кэширует результат — повторные вызовы (add/regen) не обращаются к внешним сервисам.
  • O(N) IP lookup: get_next_client_ip() использует ассоциативный массив для поиска свободного IP вместо вложенных циклов O(N²).

Документация

  • Исправлена таблица совместимости клиентов: amneziawg-windows-client >= 2.0.0 поддерживает AWG 2.0 (ранее ошибочно указано как AWG 1.x only).
  • Исправлен APT-формат для Ubuntu 24.04: DEB822 .sources (было .list).
  • Исправлен пример restore в FAQ миграции: корректный путь /root/awg/backups/.
  • Исправлена ссылка на деинсталляцию в EN README FAQ: install_amneziawg_en.sh.
  • Добавлен Ubuntu 25.10 в FAQ ответ «Какой хостинг подходит?».
  • Обновлены примеры конфигов: добавлен MTU = 1280.
  • Обновлён диапазон Jmax в таблице параметров: +500 вместо +999.
  • Переписана секция MTU: автоматический для v5.7.4+, ручной workaround для старых версий.
  • Убран пункт «MTU не задан» из «Известных ограничений».
  • Обновлён FAQ «Как изменить MTU?» для автоматического MTU.

5.7.3 — 2026-03-18

Исправлено

  • Uninstall SSH lockout: UFW отключается ДО unban fail2ban — предотвращает блокировку SSH при обрыве соединения во время деинсталляции.
  • CIDR валидация (strict): Невалидный CIDR в --route-custom вызывает die() в CLI-режиме. В интерактивном — повторный запрос ввода. Ранее установка продолжалась с некорректными AllowedIPs.
  • validate_subnet .0/.255: Подсети с последним октетом 0 (network address) или 255 (broadcast) отклоняются — ранее принимались.
  • ALLOWED_IPS resume: При возобновлении установки из конфига валидируются пользовательские CIDR (mode=3) — ранее загружались без проверки.
  • modify sed mismatch: Синхронизирован паттерн sed с grep в modify_client() — обрабатывает .conf с любым форматированием пробелов вокруг =. Добавлена постпроверка замены.
  • --no-color ANSI leak: Устранена утечка ESC-кодов \033[0m в вывод list --no-color.
  • Uninstall wildcard cleanup: Удалены бессмысленные wildcard-паттерны из uninstall — файлы *amneziawg* в /etc/cron.d/ и /usr/local/bin/ никогда не создавались.

Документация

  • Добавлен AmneziaWG for Windows 2.0.0 как поддерживаемый клиент.
  • Удалено ошибочное примечание о необходимости curl на Debian.

5.7.2 — 2026-03-16

Безопасность

  • safe_load_config(): Замена source на whitelist-парсер конфигурации в awg_common.sh — только разрешённые ключи (AWG_, OS_, DISABLE_IPV6 и др.) загружаются из файла. Устраняет потенциальную инъекцию кода через awgsetup_cfg.init.
  • Supply chain pinning: URL скачивания скриптов привязаны к тегу версии (AWG_BRANCH=v${SCRIPT_VERSION}) вместо main. Переменная AWG_BRANCH доступна для переопределения при разработке.
  • HTTPS для IP-детекции: get_server_public_ip() использует HTTPS вместо HTTP для определения внешнего IP.

Исправлено

  • modify allowlist: Убраны Address и MTU из допустимых параметров modify — эти параметры управляются инсталлятором и не должны изменяться вручную.
  • flock для add/remove peer: Операции добавления и удаления пиров защищены flock -x для предотвращения race condition при параллельных вызовах.
  • cron expiry env: Cron-задача expiry явно задаёт PATH и использует --conf-dir для корректной работы в минимальном cron-окружении.
  • log_warn для malformed expiry: Некорректные файлы истечения обрабатываются через log_warn вместо тихого пропуска.
  • Мёртвый код: Удалены неиспользуемые функции и переменные из awg_common.sh.

Улучшено

  • list_clients O(N): Оптимизация list_clients — однопроходный алгоритм вместо O(N*M).
  • backup/restore: Бэкапы теперь включают данные истечения клиентов (expiry/) и cron-задачу.
  • Версия: 5.7.1 → 5.7.2 во всех скриптах.

5.7.1 — 2026-03-13

Исправлено

  • vpn:// URI AllowedIPs: generate_vpn_uri() использовала захардкоженный 0.0.0.0/0 вместо реальных AllowedIPs из клиентского конфига — split-tunnel конфигурации теперь корректно передаются в URI.
  • Fail2Ban jail.d: Установка теперь пишет в /etc/fail2ban/jail.d/amneziawg.conf вместо перезаписи jail.local — пользовательские настройки Fail2Ban сохраняются.
  • Fail2Ban uninstall: Деинсталляция удаляет только свои артефакты вместо rm -rf /etc/fail2ban/.
  • validate_client_name: Валидация имени клиента добавлена в команды remove и modify — ранее работала только для add и regen.
  • exit code: Скрипт управления теперь возвращает корректный код ошибки вместо безусловного exit 0.
  • expiry cron path: Cron-задача expiry использует $AWG_DIR вместо захардкоженного /root/awg/.

Удалено

  • rand_range(): Удалена неиспользуемая функция из awg_common.sh (инсталлятор определяет свою копию).

5.7.0 — 2026-03-13

Добавлено

  • syncconf: Команды add и remove автоматически применяют изменения через awg syncconf — zero-downtime, без разрыва активных соединений (#19).
  • apply_config(): Новая функция в awg_common.sh — применяет конфиг через awg syncconf с fallback на полный перезапуск.
  • --no-tweaks: Флаг для инсталлятора — пропускает hardening (UFW, Fail2Ban, sysctl tweaks, cleanup) для опытных пользователей с уже настроенными серверами (#21).
  • setup_minimal_sysctl(): Минимальная настройка sysctl при --no-tweaks — только ip_forward и IPv6.

Исправлено

  • trap конфликт: Устранена перезапись обработчика EXIT при подключении awg_common.sh через source. Теперь каждый скрипт владеет своим trap и цепляет cleanup библиотеки явно.

Изменено

  • Expiry cleanup: Авто-удаление истёкших клиентов теперь использует syncconf вместо полного перезапуска.
  • Manage help: Убрано предупреждение о ручном перезапуске после add/remove (больше не требуется).
  • Версия: 5.6.0 → 5.7.0 во всех скриптах.

5.6.0 — 2026-03-13

Добавлено

  • stats: Команда stats — статистика трафика по клиентам (format_bytes через awk).
  • stats --json: Машиночитаемый JSON-вывод для интеграции и мониторинга.
  • --expires: Флаг --expires=ВРЕМЯ для add — клиенты с ограниченным сроком действия (1h, 12h, 1d, 7d, 30d, 4w).
  • Система истечения: Авто-удаление клиентов через cron (/etc/cron.d/awg-expiry, проверка каждые 5 мин).
  • vpn:// URI: Генерация .vpnuri файлов для импорта в Amnezia Client (zlib-сжатие через Perl).
  • Debian 12 (bookworm): Полная поддержка — PPA через маппинг codename на focal.
  • Debian 13 (trixie): Полная поддержка — PPA через маппинг codename на noble, DEB822 формат.
  • linux-headers fallback: Авто-fallback на linux-headers-$(dpkg --print-architecture) для Debian.

Исправлено

  • JSON sanitization: Безопасная сериализация в JSON-выводе.
  • Numeric quoting: Числовые параметры AWG в кавычках для корректной обработки.
  • O(n) stats: Single-pass сбор статистики вместо множественных вызовов.
  • backup filename: %F_%T%F_%H%M%S (убраны двоеточия из имени файла).
  • cron auto-remove: Очистка cron при удалении последнего expiry-клиента.
  • backups perms: chmod 700 после mkdir для директории бэкапов.
  • apt sources location: Бэкап apt sources в $AWG_DIR вместо sources.list.d.
  • Множественные мелкие исправления по code review (19 фиксов).

Изменено

  • Debian-aware installer: Определение OS_ID, адаптивное поведение (cleanup, PPA, headers).
  • Версия: 5.5.1 → 5.6.0 во всех скриптах.

5.5.1 — 2026-03-05

Исправлено

  • read -r: Добавлен флаг -r ко всем read -p (15 мест) — предотвращает интерпретацию \ как escape-символа при пользовательском вводе.
  • curl timeout: Добавлены --max-time 60 --retry 2 к скачиванию скриптов при установке — предотвращает бесконечное зависание при проблемах с сетью.
  • subnet validation: Валидация подсети теперь проверяет каждый октет ≤ 255 — ранее пропускала адреса вроде 999.999.999.999/24.
  • chmod checks: Добавлена проверка ошибок chmod 600 при установке прав на файлы ключей.
  • pipe subshell: Исправлена потеря переменных в цикле регенерации конфигов из-за pipe subshell — заменён на here-string.
  • port grep: Улучшена точность поиска порта в ss -lunp — замена grep ":PORT " на grep -P ":PORT\s" для исключения ложных совпадений.
  • sed → bash: Замена sed 's/%/%%/g' на ${msg//%/%%} — убраны 2 лишних subprocess'а на каждый вызов лога.
  • cleanup trap: Добавлен trap EXIT для автоматической очистки временных файлов инсталлятора.

5.5 — 2026-03-02

Исправлено

  • uninstall: Деинсталляция выполнялась без подтверждения при недоступном /dev/tty (pipe, cron, non-TTY SSH) из-за дефолтного confirm="yes".
  • uninstall: Модуль ядра amneziawg оставался загруженным после деинсталляции — добавлен modprobe -r.
  • uninstall: Рабочая директория /root/awg/ пересоздавалась логированием после удаления — перенесена очистка в конец.
  • uninstall: Пустая /etc/fail2ban/ и бэкапы PPA .bak-* оставались после деинсталляции.
  • --no-color: Escape-код сброса \033[0m не подавлялся при --no-color — исправлена инициализация color_end.
  • step99: Дублирующееся сообщение «Очистка apt…» — убран лишний вызов log перед cleanup_apt().
  • step99: Lock-файл setup_state.lock не удалялся после завершения установки.
  • manage: Непоследовательная орфография «удален»/«удалён» — унифицировано.

5.4 — 2026-03-02

Исправлено

  • step5: Ошибка скачивания manage_amneziawg.sh теперь фатальна (die), как и для awg_common.sh.
  • update_state(): die() внутри flock-subshell не завершал основной процесс — перенесён наружу.
  • step6: Бэкап серверного конфига теперь создаётся до render_server_config, а не после перезаписи.
  • cloud-init: Консервативная детекция — маркеры cloud-init проверяются первыми, чтобы не удалить его на cloud-хостах.
  • restore_backup(): Добавлена защита от зависания в неинтерактивном режиме (требуется путь к файлу).
  • Подсеть: Валидация теперь разрешает только маску /24 (соответствует фактической логике аллокации IP).
  • Версия: Устранены артефакты v5.1 в логах и диагностике; введена константа SCRIPT_VERSION.

5.3 — 2026-03-02

Добавлено

  • Английские скрипты: Полные английские версии всех трёх скриптов (install_amneziawg_en.sh, manage_amneziawg_en.sh, awg_common_en.sh) с переведёнными сообщениями, справкой и комментариями.
  • CI: ShellCheck и bash -n проверки для английских скриптов.
  • PR template: Чеклист-пункт синхронизации EN/RU версий.
  • CONTRIBUTING.md: Требование синхронизации EN/RU при изменении скриптов.

5.2 — 2026-03-02

Исправлено

  • check_server(): Исправлен инвертированный exit code (return 1 при успехе → return 0).
  • Диагностика restart/restore: Вывод systemctl status теперь корректно попадает в лог.
  • restore_backup(): Путь восстановления серверного конфига теперь берётся из $SERVER_CONF_FILE.

Улучшено

  • awg_mktemp(): Активирована автоочистка временных файлов через trap EXIT.
  • modify: Добавлен allowlist допустимых параметров (DNS, Endpoint, AllowedIPs, Address, PersistentKeepalive, MTU). (Address и MTU убраны в v5.7.2)
  • Документация: Убрано некорректное упоминание поддержки подсети /16.
  • Удалён мёртвый trap-код из install_amneziawg.sh.

5.1 — 2026-03-01

Исправлено

  • CRITICAL: Command injection через спецсимволы #, &, /, \ в modify_client() — добавлена функция escape_sed() для экранирования.
  • CRITICAL: Race condition в update_state() — добавлена блокировка через flock -x.
  • MEDIUM: curl в get_server_public_ip() мог получить HTML вместо IP — добавлен флаг -f (fail on error) и очистка whitespace.
  • MEDIUM: Fallback $RANDOM в rand_range() давал макс. 32767 вместо uint32 — заменён на (RANDOM<<15|RANDOM) для 30-битного диапазона.
  • MEDIUM: Pipe subshell в check_server() — заменён на process substitution < <(...).
  • MEDIUM: Awk-скрипт remove_peer_from_server() не обрабатывал нестандартные секции — добавлена обработка любых [...] блоков.

Добавлено

  • CI: GitHub Actions workflow — ShellCheck + bash -n на push/PR к main.
  • GitHub: Issue templates (bug report, feature request) в формате YAML-форм.
  • GitHub: PR template с чеклистом (bash -n, shellcheck, VPS test, changelog).
  • SECURITY.md: Политика безопасности, ответственное раскрытие уязвимостей.
  • CONTRIBUTING.md: Гайд для контрибьюторов с требованиями к коду и тестированию.
  • .editorconfig: Единые настройки форматирования (UTF-8, LF, отступы).
  • Trap cleanup: Автоматическая очистка временных файлов через trap EXIT + awg_mktemp().
  • Bash version check: Проверка Bash >= 4.0 в начале install и manage скриптов.
  • Документация: Примеры конфигов, Mermaid-диаграмма архитектуры, расширенный FAQ, troubleshooting.

Изменено

  • Версия: 5.0 → 5.1 во всех скриптах и документации.
  • README.md: Таблица команд расширена до 10 (+ modify, backup, restore), FAQ до 8 вопросов.
  • ADVANCED.md: Добавлены примеры конфигов, команд manage, описание диагностики, инструкция обновления.

5.0 — 2026-03-01

⚠️ Breaking Changes

  • Протокол AWG 2.0 несовместим с AWG 1.x. Все клиенты должны обновить конфигурацию.
  • Требуется клиент Amnezia VPN >= 4.8.12.7 с поддержкой AWG 2.0.
  • Предыдущая версия доступна в ветке legacy/v4.

Добавлено

  • AWG 2.0: Полная поддержка протокола — параметры H1-H4 (диапазоны), S1-S4, CPS (I1).
  • Нативная генерация: Все ключи и конфиги генерируются средствами Bash + awg без внешних зависимостей.
  • awg_common.sh: Общая библиотека функций для install и manage скриптов.
  • Очистка сервера: Автоматическое удаление ненужных пакетов (snapd, modemmanager, networkd-dispatcher, unattended-upgrades и др.).
  • Hardware-aware оптимизация: Автоматическая настройка swap, сетевых буферов и sysctl на основе характеристик сервера (RAM, CPU, NIC).
  • Оптимизация NIC: Отключение GRO/GSO/TSO offloads для стабильной работы VPN-туннеля.
  • Расширенный sysctl hardening: Адаптивные сетевые буферы, conntrack, дополнительная защита.
  • Регенерация отдельных клиентов: Команда regen <имя> для перегенерации конфигов одного клиента.
  • Валидация AWG 2.0: Проверка наличия всех параметров протокола в серверном конфиге.
  • AWG 2.0 диагностика: Команда check показывает статус параметров AWG 2.0.

Удалено

  • Python/venv/awgcfg.py: Полностью убрана зависимость от Python и внешнего генератора конфигов.
  • Workaround для бага awgcfg.py: Больше не требуется перемещение awgsetup_cfg.init при генерации.
  • Параметры j1-j3, itime: Устаревшие параметры AWG 1.x больше не поддерживаются.

Изменено

  • Архитектура: 2 файла → 3 файла (install + manage + awg_common.sh).
  • Шаг 1 установки: Добавлена системная очистка и оптимизация.
  • Шаг 2 установки: Устанавливается qrencode вместо Python.
  • Шаг 5 установки: Скачиваются awg_common.sh + manage (без Python/venv).
  • Шаг 6 установки: Полностью нативная генерация конфигов.
  • Генерация ключей: Нативная через awg genkey / awg pubkey.
  • QR-коды: Генерация через qrencode напрямую (без Python).
  • Документация: README.md и ADVANCED.md обновлены для AWG 2.0.

4.0 — 2025-07-15

Добавлено

  • Поддержка AWG 1.x (Jc, Jmin, Jmax, S1, S2, H1-H4 фиксированные).
  • Установка через DKMS.
  • Генерация конфигов через Python + awgcfg.py.
  • Управление клиентами: add, remove, list, regen, modify, backup, restore.
  • UFW firewall, Fail2Ban, sysctl hardening.
  • Поддержка возобновления установки после перезагрузки.
  • Диагностический отчет (--diagnostic).
  • Полная деинсталляция (--uninstall).