Flex-VPN

Flex-VPN Journal

WireGuard VPN: как работает и чем отличается AmneziaWG

WireGuard — VPN-протокол с компактным кодом и фиксированным набором криптографических алгоритмов. Он встроен в ядро Linux, для всех основных систем есть официальные приложения, а на его основе построен AmneziaWG — протокол, который использует Flex-VPN. Ниже разберём, как устроен WireGuard VPN, что записано в файле .conf и QR-коде, какие приложения читают какие конфигурации, как найти причину типичных ошибок и чем на практике отличаются WireGuard и AmneziaWG.

Материал посвящён законным сценариям сетевой защиты и настройки. Соблюдайте правила, действующие в вашей юрисдикции.

Что такое WireGuard VPN

WireGuard создал Джейсон Доненфилд (Jason A. Donenfeld), а в марте 2020 года протокол вошёл в ядро Linux 5.6. Цель проекта — VPN, который проще проверить и настроить, чем IPsec и OpenVPN. Вместо длинного списка шифров и режимов на выбор в WireGuard зафиксирован один набор алгоритмов, а кода в нём заметно меньше, чем у старых протоколов.

  • Curve25519 — эллиптическая кривая для обмена ключами (ECDH).
  • ChaCha20-Poly1305 — шифрование и проверка целостности каждого пакета.
  • BLAKE2s — хеширование, в том числе при выводе ключей.
  • Noise — фреймворк протоколов, по схеме которого построено рукопожатие.

У фиксированного набора две стороны. Клиент и сервер не согласовывают алгоритмы, поэтому по ошибке выбрать слабый шифр или устаревший режим нельзя. Но если в одном из алгоритмов найдут серьёзную уязвимость, понадобится новая версия протокола, а не правка одной строки в настройках. Сравнение с OpenVPN, VLESS и другими вариантами — в обзоре протоколов VPN.

Как устроено подключение: ключи, пиры, рукопожатие и UDP

Логинов и паролей в WireGuard нет. Обе стороны соединения — устройство и сервер — называются пирами, и у каждой есть пара ключей: закрытый хранится только у владельца, открытый передаётся другой стороне. Ключ занимает 32 байта и записывается в кодировке Base64 — получается строка из 44 символов, которая заканчивается знаком «=».

Маршрутизация по ключам

Сервер хранит открытые ключи клиентов и за каждым закрепляет внутренние адреса в параметре AllowedIPs. Правило работает в обе стороны. Исходящий пакет уходит тому пиру, в чей диапазон попадает адрес назначения. Входящий принимается, только если он расшифрован ключом конкретного пира, а адрес отправителя внутри пакета входит в AllowedIPs этого пира. В документации WireGuard это называется cryptokey routing.

Рукопожатие и сессионные ключи

Когда появляется трафик, клиент отправляет пакет инициации, сервер отвечает — рукопожатию хватает одного обмена сообщениями. Из него выводятся сессионные ключи для шифрования данных. Пока идёт трафик, рукопожатие повторяется примерно раз в две минуты, и ключи обновляются. На пакеты, которые не прошли криптографическую проверку, сервер не отвечает.

Только UDP

WireGuard работает исключительно поверх UDP. Порт 51820 — распространённое значение из документации, а не обязательное: администратор сервера может назначить любой. Постоянного соединения в привычном смысле нет. Если устройство сменило сеть, например перешло с Wi-Fi на мобильный интернет, сервер начинает отвечать на новый адрес после первого корректного пакета от этого пира. Чтобы туннель за роутером с NAT не «засыпал» в простое, в конфигурации задают PersistentKeepalive — периодическую отправку короткого служебного пакета.

Файл настроек WireGuard (.conf) и QR-код

Со стороны пользователя настройка WireGuard VPN обычно сводится к импорту одного текстового файла с расширением .conf. В нём две секции: [Interface] описывает ваше устройство, [Peer] — сервер, к которому оно подключается.

ПолеСекцияЧто задаёт
PrivateKeyInterfaceЗакрытый ключ устройства
AddressInterfaceВнутренний адрес устройства в туннеле, например 10.8.0.2/32
DNSInterfaceDNS-серверы, которые используются при включённом туннеле
MTUInterfaceМаксимальный размер пакета в туннеле (необязательное поле)
PublicKeyPeerОткрытый ключ сервера
PresharedKeyPeerДополнительный общий симметричный ключ (необязательное поле)
EndpointPeerАдрес (IP или доменное имя) и порт сервера
AllowedIPsPeerКакие адреса направлять в туннель; 0.0.0.0/0, ::/0 — весь трафик
PersistentKeepalivePeerИнтервал служебных пакетов в секундах, часто 25

Поля Address, DNS и MTU обрабатывает не сам протокол, а программа-клиент: в Linux это утилита wg-quick, на телефоне и компьютере — приложение. Если в AllowedIPs указать не весь трафик, а отдельные подсети, в туннель пойдут только они. Это простейший вариант раздельной маршрутизации.

QR-код

QR-код — тот же текст конфигурации, закодированный в картинку. На смартфоне так добавить туннель проще всего: в приложении WireGuard или Amnezia VPN выберите добавление через QR-код и наведите камеру на экран, где показан код. На iPhone это избавляет от пересылки файла почтой или через приложение «Файлы».

В файле .conf и в QR-коде записан закрытый ключ. Любой, у кого есть копия, может подключаться от вашего имени, пока ключ не отзовут. Не публикуйте скриншоты QR-кода и не пересылайте конфигурацию в общие чаты.

Клиенты WireGuard для Windows, macOS, Android и iPhone

Официальные приложения есть для всех основных систем, ссылки на них собраны на сайте wireguard.com.

  • Windows — приложение WireGuard: импорт туннеля из файла, журнал и счётчики трафика.
  • macOS — приложение из App Store, туннели импортируются из файла.
  • Android — приложение из Google Play: импорт из файла или по QR-коду.
  • iPhone и iPad — приложение из App Store, принимает файлы и QR-коды. При первом импорте iOS попросит разрешение на добавление VPN-конфигурации.
  • Linux — модуль в ядре начиная с версии 5.6 и утилиты из пакета wireguard-tools: wg и wg-quick.
  • Роутеры — поддержка есть в OpenWrt и в ряде заводских прошивок; подробности — в статье про VPN на роутере.

Отдельно стоит Amnezia VPN — клиент с собственной реализацией AmneziaWG, который умеет импортировать и обычные конфигурации WireGuard. Приложение есть для Android, iOS, Windows, macOS и Linux, так что для смешанного набора устройств хватит одного клиента.

Что добавляет AmneziaWG и какие поля конфига отличаются

AmneziaWG (его часто называют Amnezia WireGuard) основан на WireGuard и добавляет дополнительную маскировку служебных пакетов. Криптография, пары ключей, пиры и поля из таблицы выше остаются прежними. В секции [Interface] появляются параметры, которые меняют служебные пакеты — рукопожатие и заголовки:

  • Jc — сколько пакетов со случайным содержимым (junk-пакетов) отправляется перед пакетом инициации рукопожатия. Принимающая сторона их отбрасывает.
  • Jmin и Jmax — минимальный и максимальный размер таких пакетов в байтах; размер каждого выбирается случайно в этих пределах.
  • S1 — сколько случайных байтов добавляется к пакету инициации рукопожатия. В обычном WireGuard этот пакет всегда занимает 148 байт.
  • S2 — то же для ответа на рукопожатие, который в WireGuard занимает 92 байта.
  • H1–H4 — значения поля «тип сообщения» в заголовках. В WireGuard это числа от 1 до 4: инициация, ответ, cookie-сообщение и пакет с данными. AmneziaWG подставляет вместо них значения из конфигурации.

S1, S2 и H1–H4 должны совпадать на клиенте и сервере, иначе сервер не примет пакеты и рукопожатие не состоится. Jc, Jmin и Jmax влияют только на отправку junk-пакетов. Если Jc, S1 и S2 равны нулю, а H1–H4 — значениям от 1 до 4, AmneziaWG работает как обычный WireGuard. В новых версиях AmneziaWG набор параметров расширяется, поэтому приложение стоит обновлять.

Совместимость: какие приложения читают какие ключи

Из-за дополнительных полей совместимость односторонняя: Amnezia VPN понимает обычную конфигурацию WireGuard, а стандартное приложение WireGuard конфигурацию AmneziaWG — нет.

Что у вас естьОфициальное приложение WireGuardAmnezia VPN
Обычный файл .conf WireGuardИмпортирует и подключаетсяИмпортирует и подключается
QR-код обычного WireGuardСканирует на Android и iOSСканирует на телефоне
Конфигурация AmneziaWG с полями Jc, S1, H1–H4Не подключитсяИмпортирует и подключается
QR-код или ключ AmneziaWGНе подключитсяИмпортирует и подключается

В стандартном приложении WireGuard конфигурация AmneziaWG либо не импортируется из-за незнакомых строк, либо — если удалить их вручную — туннель создастся, но рукопожатие не пройдёт: сервер ожидает пакеты в формате AmneziaWG.

Ключи AmneziaWG от Flex-VPN рассчитаны на приложение Amnezia VPN: готовый ключ импортируется целиком, собирать параметры вручную не нужно. Пошаговая инструкция — на странице настройки Amnezia VPN.

Почему WireGuard не подключается: частые технические ошибки

Начните с двух показателей в клиенте: времени последнего рукопожатия и счётчиков принятых и отправленных данных. Если рукопожатия нет и принято ноль байт, устройство и сервер не установили сессию — ищите причину в ключах, адресе сервера или настройках сети. В журнале при этом повторяются сообщения о том, что рукопожатие не завершилось за 5 секунд. Если рукопожатие свежее, а страницы не открываются, проверьте AllowedIPs, DNS и MTU.

  • Ключи. Открытый ключ сервера в секции [Peer] записан с ошибкой, ваш ключ не добавлен на сервер или уже отозван. Для AmneziaWG сюда же относится несовпадение S1, S2 или H1–H4 после ручной правки. Надёжнее запросить новую конфигурацию, чем исправлять старую.
  • Endpoint. Опечатка в адресе или порте либо устаревший адрес сервера. Если из другой сети рукопожатие проходит, дело в настройках текущей: например, межсетевой экран офисной сети может не пропускать исходящий UDP — уточните это у администратора.
  • AllowedIPs и DNS. Если в AllowedIPs указана узкая подсеть, в туннель уходит только она, а остальной трафик идёт напрямую. Если 0.0.0.0/0 задан у двух туннелей, включённых одновременно, их маршруты конфликтуют. Если поле DNS пустое или указанный сервер недоступен, сайты по доменным именам могут не открываться, хотя адреса по IP работают.
  • Время на устройстве. Пакет инициации содержит метку времени, и сервер принимает его, только если метка новее предыдущей от того же ключа. Если часы на устройстве сдвинулись назад, например после ручной установки неверной даты, сервер отклоняет рукопожатия. Включите автоматическую синхронизацию времени.
  • MTU. Рукопожатие есть, лёгкие страницы открываются, а крупные загрузки зависают — типичный признак слишком большого пакета. WireGuard добавляет к каждому пакету 60 байт служебных данных при IPv4 и 80 — при IPv6, поэтому при стандартных 1500 байтах типовое значение MTU туннеля — 1420. Попробуйте указать в конфигурации 1380 или 1280.
  • Другой VPN. На Android и iOS одновременно может быть активен только один VPN, и включение второго приложения отключает первое. На компьютере с туннелем могут конфликтовать корпоративные VPN-клиенты и антивирусы со встроенным VPN или межсетевым экраном.

Общий порядок диагностики, который подходит для любого протокола, описан в статье почему не работает VPN.

WireGuard или AmneziaWG: что выбрать по ключу и приложению

Выбирать протокол в отрыве от ключа обычно не приходится: формат определяет тот, кто выдаёт конфигурацию, а от формата зависит подходящий клиент. Порядок такой:

  1. Посмотрите, для какого приложения выдан ключ, или откройте файл конфигурации. Если в секции [Interface] есть строки Jc, Jmin, Jmax, S1, S2 и H1–H4, это AmneziaWG; если только стандартные поля — обычный WireGuard.
  2. Для обычного WireGuard подойдут официальное приложение WireGuard, Amnezia VPN или роутер с поддержкой WireGuard.
  3. Для AmneziaWG нужен клиент, который понимает дополнительные поля: Amnezia VPN или прошивка роутера с поддержкой AmneziaWG.
  4. Если на разных устройствах у вас конфигурации обоих форматов, удобнее держать всё в Amnezia VPN — одно приложение читает оба.
  5. Не переделывайте один формат в другой вручную: удаление или правка полей ломает рукопожатие. Если нужен другой формат, запросите новый ключ.

Во Flex-VPN ключи AmneziaWG — вариант для быстрого и простого старта. Есть и профиль VLESS + Reality: он работает поверх TCP/TLS и добавляется по ссылке подписки в другие приложения, например Happ. Чем отличаются эти профили, разобрано в статье AmneziaWG и VLESS + Reality, а клиенты для ваших устройств — на странице приложений.

Частые вопросы

Чем AmneziaWG отличается от WireGuard?

AmneziaWG использует те же ключи и шифрование, что и WireGuard, но добавляет дополнительную маскировку служебных пакетов: junk-пакеты перед рукопожатием, случайные байты в пакетах рукопожатия и изменённые значения типов сообщений. Отсюда дополнительные поля Jc, Jmin, Jmax, S1, S2 и H1–H4.

Можно ли добавить ключ AmneziaWG в официальное приложение WireGuard?

Нет. Приложение WireGuard не знает дополнительных полей, поэтому не импортирует такую конфигурацию или не сможет завершить рукопожатие. Для ключей AmneziaWG используйте Amnezia VPN.

Как добавить WireGuard на iPhone по QR-коду?

Установите из App Store приложение WireGuard (для обычной конфигурации) или Amnezia VPN (для обоих форматов), выберите добавление туннеля по QR-коду и отсканируйте код камерой. При первом импорте iOS попросит разрешение на добавление VPN-конфигурации.

Какой порт использует WireGuard?

WireGuard работает только по UDP. Порт 51820 часто встречается в документации, но сервер может использовать любой; актуальное значение указано в поле Endpoint вашей конфигурации.

Откроет ли Amnezia VPN обычный файл .conf WireGuard?

Да, Amnezia VPN импортирует и обычные конфигурации WireGuard, и ключи AmneziaWG.

Рукопожатие проходит, но сайты не открываются. Что проверить?

Чаще всего причина в DNS, AllowedIPs или MTU: проверьте, что DNS задан, а AllowedIPs охватывает нужные адреса, и попробуйте уменьшить MTU до 1380 или 1280.

Flex-VPN

Готовы настроить подключение?

Выберите тариф на три устройства и получите профили подключения в Telegram.

Открыть бота