RU Русский | EN English
# AmneziaWG 2.0 Installer: Дополнительная информация и настройки Это дополнение к основному [README.md](README.md), содержащее более глубокие технические детали, пояснения и продвинутые опции для скриптов установки и управления AmneziaWG 2.0. Пошаговый гайд по развёртыванию на VPS - в [INSTALL_VPS.md](INSTALL_VPS.md). ## Оглавление - [✨ Возможности (Подробно)](#features-detailed-adv) - [🔐 Параметры AWG 2.0](#awg2-params-adv) - [Presets (v5.10.0+)](#presets-adv) - [⚙️ Детали конфигурации клиента](#config-details-adv) - [AllowedIPs](#allowedips-adv) - [IPv6 dual-stack в туннеле (v5.15.0+)](#ipv6-tunnel-adv) - [PersistentKeepalive](#persistentkeepalive-adv) - [DNS](#dns-adv) - [Изменение настроек по умолчанию](#change-defaults-adv) - [🔒 Настройки безопасности сервера](#security-adv) - [Фаервол UFW](#ufw-adv) - [Параметры ядра (Sysctl)](#sysctl-adv) - [Fail2Ban (Автоматическая установка)](#fail2ban-adv) - [🧹 Оптимизация сервера](#optimization-adv) - [📋 Примеры конфигурации](#config-examples-adv) - [⚙️ CLI Параметры запуска скриптов](#cli-params-adv) - [install_amneziawg.sh](#install-cli-adv) - [manage_amneziawg.sh](#manage-cli-adv) - [🧑💻 Полный список команд управления](#manage-commands-adv) - [🛠️ Технические детали](#tech-details-adv) - [Архитектура скриптов](#architecture-adv) - [DKMS](#dkms-adv) - [Генерация ключей и конфигов](#keygen-adv) - [🔄 Как обновить скрипты](#update-scripts-adv) - [❓ FAQ (Дополнительные вопросы)](#faq-advanced-adv) - [🩺 Диагностика и деинсталляция](#diag-uninstall-adv) - [Содержимое диагностического отчёта](#diagnostic-report-adv) - [🔧 Устранение неполадок (подробно)](#troubleshooting-adv) - [📊 Статистика трафика (stats)](#stats-adv) - [⏳ Временные клиенты (--expires)](#expires-adv) - [📱 vpn:// URI импорт](#vpnuri-adv) - [📱 MTU и мобильные клиенты](#mtu-mobile-adv) - [🚧 Хостинг недоступен из России (Hetzner): блокировка по AS](#as-blocking-adv) - [🛡️ Активное зондирование (active probing) и обфускация без прокси](#active-probing-adv) - [📋 Совместимость клиентов AWG 2.0](#client-compat-adv) - [🐧 Поддержка Debian](#debian-support-adv) - [🔧 Raspberry Pi и ARM64](#arm-support-adv) - [📦 LXC / Docker через amneziawg-go (userspace)](#lxc-userspace-adv) - [⚠️ Известные ограничения](#limitations-adv) - [🤝 Внесение вклада (Contributing)](#contributing-adv) - [💖 Благодарности](#thanks-adv) --- > История изменений по версиям: [CHANGELOG.md](CHANGELOG.md) --- ## ✨ Возможности (Подробно) * **AmneziaWG 2.0:** Поддержка протокола нового поколения с расширенными параметрами обфускации (H1-H4 диапазоны, S3-S4, CPS I1). * **Нативная генерация:** Ключи генерируются через `awg genkey/pubkey`, конфиги — через Bash-шаблоны, QR — через `qrencode`. Внешняя зависимость от Python/awgcfg.py полностью устранена. * **Автоматическая установка:** Устанавливает AmneziaWG, DKMS модуль, зависимости, настраивает сеть, фаервол, sysctl. * **Возобновляемость:** Использует файл состояния (`/root/awg/setup_state`) для продолжения после обязательных перезагрузок. * **Оптимизация сервера:** * Удаление ненужных пакетов (snapd, modemmanager, и др.) * Hardware-aware настройка swap и сетевых буферов * Отключение NIC offloads (GRO/GSO/TSO) для оптимизации VPN * **Безопасность по умолчанию:** * `UFW`: Политика `deny incoming`, лимит SSH, разрешение VPN-порта. * `IPv6`: По умолчанию предлагается отключить через `sysctl`. * `Права доступа`: Строгие права (600/700) на все ключи и конфиги. * `Sysctl`: BBR congestion control, защита от спуфинга, оптимизация TCP. * `Fail2Ban`: Автоматическая установка и настройка для SSH. * **Резервное копирование:** Команда `backup` в скрипте управления (включая ключи клиентов). --- ## 🔐 Параметры AWG 2.0 Все параметры генерируются автоматически при установке и сохраняются в `/root/awg/awgsetup_cfg.init`. Они одинаковы для сервера и всех клиентов. | Параметр | Описание | Диапазон | Пример | |----------|----------|----------|--------| | `Jc` | Количество junk-пакетов | 3-6 | `5` | | `Jmin` | Мин. размер junk (байт) | 40-89 | `55` | | `Jmax` | Макс. размер junk (байт) | Jmin+50..Jmin+250 | `200` | | `S1` | Padding init-сообщения (байт) | 15-150 | `72` | | `S2` | Padding response-сообщения (байт) | 15-150, S1+56≠S2 | `56` | | `S3` | Padding cookie-сообщения (байт) | 8-55 | `32` | | `S4` | Padding data-сообщения (байт) | 4-27 | `16` | | `H1` | Идентификатор init-сообщения | Диапазон uint32 | `134567-245678` | | `H2` | Идентификатор response-сообщения | Диапазон uint32 | `3456789-4567890` | | `H3` | Идентификатор cookie-сообщения | Диапазон uint32 | `56789012-67890123` | | `H4` | Идентификатор data-сообщения | Диапазон uint32 | `456789012-567890123` | | `I1` | CPS concealment packet | Формат `/etc/amnezia/amneziawg/awg0.conf в секции [Interface].sudo systemctl restart awg-quick@awg0.sudo bash /root/awg/manage_amneziawg.sh regen <имя> для каждого. С v5.8.0 regen читает актуальные значения прямо из awg0.conf (источник истины), а не из закешированного awgsetup_cfg.init..conf / QR-коды / vpn:// URI клиентам.--uninstall + повторная установка) — каждая установка генерирует уникальный набор.
manage add/remove/list/--expires), готовые сборки под ARM, headless-режим для автоматизации.AS24940). Обычный junk не помогает; проходит пакет I1/CPS, замаскированный под QUIC с разрешённым SNI (для Hetzner - 7-zip.org). Метод работает не у всех операторов. Полевые результаты и инструкция - в разделе Хостинг недоступен из России.
--endpoint=ВНЕШНИЙ_IP. 3. Убедитесь, что фаервол провайдера разрешает входящий UDP на этот порт.
modify для каждого клиента: sudo bash /root/awg/manage_amneziawg.sh modify <имя> DNS "8.8.8.8,1.0.0.1". Затем перегенерируйте конфиги: sudo bash /root/awg/manage_amneziawg.sh regen. Для изменения DNS по умолчанию для новых клиентов отредактируйте awg_common.sh.
sudo awg show. 2. Статистика передачи: sudo awg show awg0 transfer. 3. Логи сервиса: sudo journalctl -u awg-quick@awg0 -f. 4. Общий статус: sudo bash /root/awg/manage_amneziawg.sh check.
amneziawg-windows-client (< 2.0.0), которая не понимает параметры AWG 2.0. Обновите до версии 2.0.0+. Альтернатива — Amnezia VPN >= 4.8.12.7.
S3>0 или S4>0 (cookie-/data-padding из AWG 2.0), AWG 1.0-клиент не сможет с ним handshake-нуться — это известная upstream-проблема: amnezia-vpn/amneziawg-linux-kernel-module#168. Мой инсталлятор всегда генерирует S3=8..55, S4=4..27 — оба >0.
.conf, сгенерированные manage add) проблемы нет: manage всегда вписывает S3/S4 в клиентский .conf автоматически. Риск возникает только при:
.conf со снятием S3/S4;wg-quick на старом ядре, без amneziawg-модуля);S3=0/S4=0.S3/S4 в client .conf идентичными серверным. Если очень нужен AWG 1.0 fallback — это отдельная задача за пределами штатного сценария установки, ждите фикса в upstream-issue #168.
dkms status. 2. Попробуйте пересобрать: sudo dkms install amneziawg/$(dkms status | grep amneziawg | head -1 | awk -F'[,/ ]+' '{print $2}'). 3. Убедитесь, что установлены заголовки ядра: sudo apt install linux-headers-$(uname -r). 4. При неустранимой ошибке запустите диагностику: sudo bash ./install_amneziawg.sh --diagnostic.
apt upgrade ядра DKMS не всегда успевал пересобрать модуль amneziawg к моменту следующего reboot. Симптом: awg-quick@awg0 падает с modprobe: FATAL: Module amneziawg not found, и VPN лежит до ручной правки.
/etc/apt/apt.conf.d/99-amneziawg-post-kernel — после apt upgrade хелпер /usr/local/sbin/amneziawg-ensure-module --hook пересобирает DKMS под новое ядро. Лог: /var/log/amneziawg-ensure-module.log (weekly rotate, 4 копии).amneziawg-ensure-module.service — на boot перед awg-quick@awg0 хелпер итерирует ядра с уже установленными headers, пересобирает DKMS под текущее ядро, делает modprobe amneziawg и проверяет загрузку через lsmod. Если headers ещё не установлены — пишет WARN и завершает успехом, не блокируя загрузку. Логи в journal: journalctl -u amneziawg-ensure-module.service.sudo bash /root/awg/manage_amneziawg.sh repair-module доустановит kernel-headers (с AWG_ALLOW_APT_IN_ENSURE=1), пересоберёт DKMS, перезапустит awg-quick.sudo apt install linux-headers-$(uname -r) sudo dkms autoinstall sudo modprobe amneziawg sudo systemctl restart awg-quick@awg0Ограничения:
.deb, а не DKMS — auto-repair не задействован. После kernel upgrade либо переустановите инсталлятор (он подберёт новый prebuilt или fallback на DKMS), либо запустите manage repair-module.uname -r (например, linux-headers-azure). Если у вас custom kernel или нестандартный flavor — manage repair-module сделает то же самое в reactive-режиме.sudo bash /root/awg/manage_amneziawg.sh backup. 2. Скопируйте архив: scp root@старый_сервер:/root/awg/backups/awg_backup_*.tar.gz .. 3. На новом сервере установите AmneziaWG. 4. Скопируйте бэкап: scp awg_backup_*.tar.gz root@новый_сервер:/root/awg/backups/. 5. Восстановите: sudo bash /root/awg/manage_amneziawg.sh restore (интерактивный выбор, или укажите полный путь к архиву). 6. Перегенерируйте конфиги с новым IP: sudo bash /root/awg/manage_amneziawg.sh regen. 7. Раздайте новые конфиги клиентам.
MTU = 1280 в секцию [Interface] серверного и клиентского конфигов. Сотовые сети имеют MTU ниже стандартных 1420, а iOS строго обрабатывает PMTU. Подробнее — в разделе MTU и мобильные клиенты.
0.0.0.0/5, который включает служебный 0.0.0.0/8. Ядро iOS спотыкается на этом блоке и не доходит до остальных маршрутов, поэтому туннель поднимается и через ~10 секунд встаёт (симптом легко спутать с DPI). Разобрался и предложил фикс @LiaNdrY (Issue #42). В v5.16.1 первый диапазон списка разбит на 1.0.0.0/8, 2.0.0.0/7, 4.0.0.0/6 - это тот же охват без проблемного нулевого блока, split-tunnel сохраняется.
/root/awg/awgsetup_cfg.init и обычной переустановкой с --force не меняется (берётся из конфига). Поэтому: (1) быстрый разовый фикс - в конфиге iOS-клиента заменить строку AllowedIPs = ... на AllowedIPs = 0.0.0.0/0; (2) с сохранением split-tunnel - отредактировать /root/awg/awgsetup_cfg.init, заменив начальный 0.0.0.0/5 на 1.0.0.0/8, 2.0.0.0/7, 4.0.0.0/6, затем пересоздать клиента (remove + add); (3) либо чистая установка заново (--uninstall, затем установка v5.16.1) - тогда список сгенерируется корректно.
--preset=mobile — он автоматически выставляет оптимальные параметры для мобильных сетей (Jc=3, узкий Jmax). Discussion #38 (@elvaleto): на Таттелеком (Летай) c Jc=4-8 подключалось раза с третьего, а после снижения Jc = 3 заработало сразу.
sudo bash install_amneziawg.sh --preset=mobile --yes --route-amneziaСуществующая установка — ручная правка:
/etc/amnezia/amneziawg/awg0.conf и замените Jc на 3, а I1 на <r 64>.sudo systemctl restart awg-quick@awg0sudo bash /root/awg/manage_amneziawg.sh regen <имя_клиента> для каждого клиента.--preset=mobile недостаточно — попробуйте ещё ниже: --jc=2 --jmin=20 --jmax=60.
| Оператор | Параметры | Рекомендация | Результат |
|---|---|---|---|
| Таттелеком (Летай) | Jc=3, I1=<r 64> | --preset=mobile | ✅ |
| Yota (Москва) | I1=<b 0xce...>, Jmax=261 | --preset=mobile | ✅ |
| Yota/Tele2 (Москва) | Jc=3, Jmin=40, Jmax=70 | --preset=mobile | ✅ |
| Tele2 (Красноярск) | ранее I1=отсутствует; май 2026: I1=<r 48> | --preset=mobile; в майскую волну I1=<r 48> | ✅ |
| МТС (Приморье) | Jc=3, I1=<r 48> (май 2026) | --preset=mobile + I1=<r 48> | ✅ |
| Beeline | дефолт | --preset=default | ✅ |
| Megafon (Москва) | Jc=3, Jmin=80, Jmax=268 | --preset=mobile | 🔄 тестируется |
| Megafon (регионы) | I1=отсутствует | --preset=mobile + удалить I1 | ✅ |
| Т-Мобайл (Москва) | узкий профиль (как в приложении Amnezia): Jc=6, Jmin=10, Jmax=50, DNS-мимик I1=<r 2><b 0x8580...> (полный вид в разделе про роутеры ниже); полный туннель 0.0.0.0/0, ::/0 | ручные параметры; профиль в diagnose --carrier=tmobile_us (сверяет Jc/Jmin/Jmax и что I1 бинарного вида); --preset=mobile здесь не подходит | ✅ |
| Tele2 + Мегафон (Кемерово, 42) | случайный I1 (<r N>) перестал держаться через 2+ дня; работает QUIC-мимикрия I1=<b 0xc3...> либо I1=отсутствует | --preset=mobile + I1=<b 0xc3...> (QUIC) либо удалить I1 | ✅ |
/etc/amnezia/amneziawg/awg0.conf и в клиентских .conf удалить строку I1 = ... целиком (не оставлять пустую). Это AWG 1.0 fallback — без CPS-маскировки, но handshake проходит DPI у некоторых региональных операторов, где CPS-пакеты сами триггерят блок (Issue #42, @alkorrnd). После правки на сервере: sudo systemctl restart awg-quick@awg0. На клиентах — sudo bash /root/awg/manage_amneziawg.sh regen <имя> для каждого, и раздать новые конфиги.
I1=отсутствует на Tele2 (Красноярск) перестал срабатывать, а короткий I1 = <r 48> прошёл DPI. То же сработало на МТС (Приморье). Похоже, для этих операторов важен размер I1: меньшее значение <r 48> менее заметно для DPI. Если --preset=mobile или I1=отсутствует не помогают - попробуйте I1 = <r 48>. Профиль diagnose --carrier=tele2_krasnoyarsk пока отражает прежнее I1=отсутствует (Issue #42), так что для майской волны задайте I1 = <r 48> вручную (Discussion #38, @alkorrnd + @etotent).
<r N> можно задать I1 как блок, имитирующий начало QUIC-пакета: I1 = <b 0xc30000000108><r 8><b 0x08><r 8><b 0x0045dc><t><r 16>. Первые байты (0xC3 + версия) похожи на QUIC v1 long-header, и DPI, который классифицирует UDP/443 как QUIC, в этом отчёте поток пропустил. На Tele2/Мегафон (Кемерово) держится 2+ дня (Issue #42, @Fourdot-co). Это client-side параметр, меняется только в клиентских .conf, синхронизировать с сервером не нужно; учтите, что правка только одного экспортированного .conf потеряется при следующей перегенерации клиента (regen). Важно: не берите за основу TLS ClientHello (<b 0x160301...>) - это TCP-формат, в UDP DPI распознает TCP-структуру и дропнет пакет. Для UDP-мимикрии подходят QUIC long-header или DTLS (тот же тип handshake ClientHello, но с record header, где добавлены epoch и sequence number).
net.ipv4.conf.all.rp_filter = 1 (strict reverse-path filtering). На Hetzner и подобных облачных хостерах, где шлюз находится в другой подсети чем IP самой VPS, strict mode ломает routing — ответные пакеты не проходят проверку обратного пути. Симптомы: VPS периодически теряет сеть (раз в сутки), а VNC-консоль забивается строками [UFW BLOCK] от Fail2Ban и становится непригодной для работы. Discussion #41 (@z036). С v5.8.2 rp_filter установлен в 2 (loose mode), который проверяет source IP по любому маршруту в таблице (не только обратному через тот же интерфейс), и добавлен kernel.printk = 3 4 1 3 для подавления не-критических kernel messages на VNC-консоли. Если у тебя установка до v5.8.2 — исправь вручную:
/etc/sysctl.d/99-amneziawg-security.confrp_filter = 1 на rp_filter = 2 (обе строки: conf.all и conf.default)kernel.printk = 3 4 1 3sudo sysctl -p /etc/sysctl.d/99-amneziawg-security.confping между сервером и клиентами внутри туннеляufw default deny incoming — это блокирует всё входящее на всех интерфейсах, включая awg0. Forward-правило ufw route allow in on awg0 out on <public_iface> разрешает только туннель → интернет, а input на awg0 (пакеты от клиентов на сам сервер, в том числе ICMP echo-request) под него не попадает.
/etc/ufw/before.rules и заменил ACCEPT на DROP для ICMP без указания интерфейса, эти правила применяются ко всем интерфейсам — включая awg0.
awg0 в UFW:
sudo ufw allow in on awg0 sudo ufw reloadЭто разрешает входящие на интерфейс туннеля целиком — узкая фильтрация ICMP делается через
-i в before.rules (см. ниже).
/etc/ufw/before.rules, добавь -i <public_iface> ко всем DROP-строкам ICMP:
# вместо -A ufw-before-input -p icmp --icmp-type echo-request -j DROP # так (ens3 — твой публичный интерфейс) -A ufw-before-input -i ens3 -p icmp --icmp-type echo-request -j DROPТо же самое для
destination-unreachable, time-exceeded, parameter-problem. Имя публичного интерфейса: ip route get 8.8.8.8 | awk '{for(i=1;i<=NF;i++) if($i=="dev") print $(i+1)}'. Применить: sudo ufw reload.
ufw allow in on awg0 proto icmp — UFW не поддерживает icmp через флаг proto (только tcp/udp/esp/ah/gre/ipv6).
ping <IP_сервера_в_туннеле>. С сервера на клиента (ping <IP_клиента>) может не отвечать сам клиент: на Windows и iOS встроенный фаервол часто режет echo-request — поэтому надёжнее проверять с клиента на сервер.
AllowedIPs на клиенте под split tunneling (через VPN идут только нужные подсети — например, только Telegram/Discord, а остальной трафик мимо), убедись что в списке есть подсеть туннеля (10.9.9.0/24 или твоя кастомная). Без неё клиент не маршрутизирует в туннель даже пакеты к самому серверу — ufw status verbose и iptables -L ufw-before-input -v -n могут выглядеть правильно, а ping всё равно не идёт. Покрытие зависит от выбранного режима: --route-all (полный туннель 0.0.0.0/0) включает подсеть туннеля автоматически; дефолтный --route-amnezia (Amnezia List, исключает 10.0.0.0/8) и --route-custom= - нет, добавляй вручную.
sudo ufw route allow in on awg0 out on awg0 && sudo ufw reload. AllowedIPs в клиентских .conf зависит от режима, выбранного при установке (см. абзац выше). Discussion #63.
--endpoint отклоняется с ошибкой «Некорректный --endpoint» — что проверить?--endpoint проходит валидацию перед записью в конфиги. Разрешены три формата: FQDN (vpn.example.com), IPv4 (1.2.3.4), IPv6 в квадратных скобках ([2001:db8::1]). Запрещены перевод строки, CR, одинарные и двойные кавычки, обратный слеш, пробелы и табуляции — они могли бы инжектиться в awgsetup_cfg.init и клиентские .conf. Если нужно передать IPv6 — оберните в []. Если AWG_ENDPOINT в awgsetup_cfg.init не проходит валидацию при повторном запуске, инсталлятор выводит log_warn и использует автоопределение через get_server_public_ip.
flock на /root/awg/.install.lock в начале initialize_setup(). Это защищает от двух параллельных запусков которые иначе могли бы гонять apt-get одновременно и сломать package state. Если ты видишь эту ошибку но никакого второго инсталлятора нет (процесс висит / упал) — удали /root/awg/.install.lock и попробуй снова.
--uninstall не отключил UFW?/root/awg/.ufw_enabled_by_installer только если активировал UFW сам (до этого UFW был в состоянии inactive). При --uninstall UFW отключается только при наличии маркера. Если до установки нашего скрипта UFW уже был активен (например, для защиты SSH или web-сервисов), --uninstall удалит наши правила (VPN-порт, awg0 routing; добавленное правило SSH rate-limit при этом остаётся), но оставит UFW активным. Это защита от destructive uninstall на чужой инфраструктуре. Если тебе нужно принудительно отключить UFW — ufw disable вручную.
regen говорит «отсутствуют обязательные AWG-параметры» — что делать?load_awg_params читает AWG-параметры напрямую из live /etc/amnezia/amneziawg/awg0.conf, а не из закешированного awgsetup_cfg.init. Если ты правил awg0.conf руками и удалил/повредил одно из обязательных полей (Jc, Jmin, Jmax, S1-S4, H1-H4), regen упадёт с этой ошибкой вместо того чтобы молча использовать устаревшие значения из init-файла. Это защита от split-brain между сервером и клиентами. Что делать: (1) проверь grep -E "^(Jc|Jmin|Jmax|S[1-4]|H[1-4]) = " /etc/amnezia/amneziawg/awg0.conf — все 11 полей должны быть; (2) если поле удалено, восстанови его из /root/awg/awgsetup_cfg.init или из awg0.conf.bak-* бэкапа; (3) перезапусти сервис и повтори regen.
amneziawg-windows-client подчёркивает H2-H4 красным и не даёт редактировать конфигamneziawg-windows-client (форк wireguard-windows с AWG-патчами). Его встроенный редактор конфигов в ui/syntax/highlighter.go ограничивает H1-H4 диапазоном [0, 2147483647] (это 2^31-1, INT32_MAX), хотя спецификация AmneziaWG допускает полный uint32 (0-4294967295). Значения выше 2^31-1 на сервере работают нормально, но клиент подчёркивает их красным и может блокировать сохранение правок. Upstream issue: amnezia-vpn/amneziawg-windows-client#85 (открыт с февраля 2026, не исправлен). Наш installer с v5.8.1 генерирует H1-H4 в безопасной половине диапазона [0, 2^31-1] — новые установки совместимы с Windows-клиентом из коробки. Если у тебя установка v5.8.0 с «плохими» H: (1) обнови через --uninstall + install_amneziawg.sh v5.8.1 — новые H будут в безопасном диапазоне; либо (2) поправь H2/H3/H4 в awg0.conf вручную на значения меньше 2147483647, перезапусти сервис и перегенерируй клиентские конфиги через manage regen <имя>; либо (3) используй кросс-платформенный Amnezia VPN клиент вместо amneziawg-windows-client — у него этого ограничения нет. Discussion: #40.
tc (traffic control): sudo tc qdisc add dev awg0 root tbf rate 100mbit burst 32kbit latency 400ms. Это ограничит общую пропускную способность интерфейса. Для per-client лимитов потребуется более сложная настройка с tc и iptables (mark + class).
uname -r vs ls /lib/modules/. Если они различаются, обновите ядро: sudo apt update && sudo apt upgrade, перезагрузитесь и запустите инсталлятор повторно.
Prebuilt module installed в логе установки (/root/awg/install_amneziawg.log). Если использовался DKMS, вы увидите вывод dkms install.