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).
205 KiB
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-inafter-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 перезапускается без нашего jailuninstallудаляет из/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 оставлял конфиг без пиров, а повторный запуск шага бэкапил уже безпировый файл - все клиенты терялись при--forcereinstall 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-exportAWG_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 showgate,netplan apply+ цикл ожидания); last-ditch путь после неуспеха основного recovery (ip link set up+networkctl renewс повторной проверкой маршрута, затем при необходимостиdhclient -4); путьdieпри полной неудаче с подсказкой--no-tweaks; существующая защита cloud-init (3 проверки маркеров) сохранена. Структурные проверки: парность строк RU и ENcleanup_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 ...) и оно сохранится. Переменная также добавлена в whitelistsafe_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}); whitelistsafe_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 проверок: загрузка модуля ядра, активность службы, поднятость интерфейса, sysctlip_forward, BBR, состояние UFW и порт AWG, число клиентских peer-ов. С--carrier=ИМЯдополнительно сравнивает текущие параметры обфускации AWG 2.0 (Jc / Jmin / Jmax / I1) с профилем оператора и печатает OK/WARN/FAIL по каждой проверке плюс подсказку в полеFix:. Семь подтверждённых операторов из таблицы вADVANCED.md:beeline_msk(presetdefault);yota_msk,tele2_msk,tattelecom(presetmobile, I1 со случайным паттерном);tele2_krasnoyarsk,megafon_regions(presetmobile, 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соответствует профилю presetdefault,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. - 🔒
--forcesafety 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.sourcesmismatch удаляется, gcc-13 pre-install активируется при stale headers.test_v5130_force_guard.bats(+19) — RU/EN структурные greps на CLI-флаг--force|-f, env-bridgeAWG_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=1env vsyes).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-callensure_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-metalinux-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 словарь) — userspacexz -tстрим валидным считал, но in-tree decoder Linux на Debian 13 trixie kernel6.12.85+deb13-arm64(build 2026-04-30) отвечалdecompression failed with status 6. Свитчнул на kernel-compatible presetxz --check=crc32 --lzma2=dict=1MiB— соответствует mainlinescripts/Makefile.modinst. Plus build-time sanity gate: после компрессииxz -t+xz -d -cround-trip; если что-то не так —exit 1, broken prebuilt не попадает вarm-packagesrelease. На push'е тега v5.12.1 CI workflowarm-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-mirrorawg_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к моменту следующегоreboot—awg-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).
- apt hook (
- 🧠 Умное определение 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 upgradeadd клиента не работает». - 🧹
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|--systemdmodes, 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-issueamnezia-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-tolerantflag и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 --pskPresharedKey корректно писался в[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не выводится; indentedPresharedKey; 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 вызовах;findpattern иsort -rкорректно обрабатывают и legacy-имена, и новые ms-suffix в одной директории.test_v5113_docs.bats(+15) — инварианты для FAQ ICMP, таблицы операторов,--pskhighlight; защита от RU/EN cross-link drift в README → ADVANCED.
Совместимость и зависимости
- Полностью обратно-совместимо.
--yesopt-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-JSONcontainers/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-модулей / не загружены параметры), QRvpn://пропускается без шума. QR из.confи PNGvpn://— независимые best-effort артефакты; отказ одного не ломает другой. - Интеграция в
manage regenиmanage remove.regenобновляет оба QR (conf и vpn://) в паре.removeчистит<имя>.vpnuri.pngнаряду с<имя>.conf/.png/.vpnuriи ключами. - Backup / restore автоматически подхватывает
.vpnuri.png— новых путей в код не добавлял, существующий*.pngglob в_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 -vguard), 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]секциях, indentedPrivateKey, 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-flightvalidate_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 -Gpre-check.modify_clientне запускает destructivesedпри 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_clientflock-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теперь собирает prebuiltamneziawg.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_MAXupper-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) — atomicupdate_state,boot_idguard, entry-step-2 die, request_reboot capture.test_manage_robustness.bats(+24) —_backup_configs_nolockcontract (LAST_BACKUP_PATH, compgen -G, critical vs optional),modify_clientbackup gate,regenerate_clientlock + sed checks, flock-timeout fd release.test_restore_rollback.bats(+27) —_restore_do_rollbackhelper,trap RETURN+ cleanup contract,_destructive_ops_startedgate, pre-flightvalidate_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внешнее поведение прежнее (успех → сервис работает, сбой → раньше частичное состояние, теперь откат);manageCLI не менялся; формат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 черезsedrange из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_tolerant(вawg_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иconcurrencygroup для предотвращения параллельных прогонов.
Тесты
- +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публикуются в отдельный releasearm-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-v8→rpi-v8,+rpt-rpi-2712→rpi-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@awg0active, 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-пакетов. СнизилиJmaxoffset сJmin+100..500доJmin+50..250, максимальный размер junk-пакета упал с ~590 до ~340 байт. Обфускация сохранена, совместимость с мобильными улучшается.
Тесты
- 4 новых bats-теста для
restore_backuptar-валидации: happy path (good backup), absolute path rejection, path traversal rejection, server keychmod 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: Если liveawg0.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 codeapply_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 codeawg show(audit). Мог отрапортовать "Состояние OK" даже когдаawgупал. Теперьawg show awg0вызывается с сохранением вывода и проверкой exit code. -
backup_configs/restore_backupleak'или временные директории при SIGINT (audit).mktemp -dиспользовался напрямую, а trap cleanup_awg_cleanupудалял только файлы. Добавлен helpermanage_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имеет explicitreturn 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-H4test_load_awg_params.bats— 14 проверок парсера awg0.conf, priority над init-файлом, split-brain prevention, atomic export, bootstrap pathtest_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 policydeny (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).