Настройка клиента WireGuard
Клиентская сторона WireGuard — это один файл .conf и его импорт в приложение. В [Interface] обязательно ровно одно поле, PrivateKey: адрес, DNS и MTU протоколу не принадлежат, их обрабатывает wg-quick. Серверная часть — в гайде «Настройка WireGuard на своём VPS».
Коротко.
[Interface]— про ваше устройство,[Peer]— про сервер. Ключи base64 — ровно 44 символа.PersistentKeepaliveпо умолчанию 0, по документации разумны 25 секунд. Рукопожатие повторяется каждые 5 секунд и прекращается примерно через 90 секунд.
Что за файл вам прислали?
Обычный ini-файл, который все официальные приложения читают одинаково. Протоколу принадлежит меньшая часть строк: wg(8) отдаёт файл подкоманде setconf, а Address, DNS, MTU и Table добавляет обёртка. Имя файла становится именем интерфейса: на Linux — до 15 символов, в Windows-клиенте до 32.
[Interface]
PrivateKey = приватный ключ ЭТОГО устройства
Address = 10.8.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = публичный ключ сервера
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = host.example.net:51820
PersistentKeepalive = 25
Что означает каждое поле конфигурации?
Путаницу создаёт то, что поля принадлежат разным слоям — ядру и утилите-обёртке.
| Поле | Секция | Что задаёт |
|---|---|---|
PrivateKey | Interface | ключ устройства, обязателен |
Address | Interface | адрес устройства в вашей сети |
DNS | Interface | резолверы на время работы канала |
MTU | Interface | размер пакета; Apple: 576–65535 |
PublicKey | Peer | публичный ключ сервера |
AllowedIPs | Peer | маршрут наружу и фильтр входящих |
Endpoint | Peer | «хост:порт», обновляется сам |
PersistentKeepalive | Peer | интервал 1–65535 с, по умолчанию 0 |
Чем AllowedIPs отличается от списка сайтов?
У поля две роли сразу: наружу — таблица маршрутизации, внутрь — список контроля доступа. По wg(8), подсети задают, откуда разрешён входящий трафик пира и куда идёт исходящий. Сузив значение до 10.8.0.0/24, вы не «ограничите сайты», а оставите остальной интернет мимо канала.
Как подключить конфигурацию на своём устройстве?
Пять официальных клиентов читают один формат и различаются только пунктами меню. Ставить их нужно с wireguard.com/install и из официальных магазинов: в сторонних сборках и на «зеркалах» неизвестно, что код делает с приватным ключом.
Шаг 1. Проверить файл до импорта
Ключи — ровно 44 символа base64 (32 байта): при другой длине Android отвечает «Incorrect key length», при постороннем символе внутри строки — «Bad characters in key». В [Interface] — приватный ключ вашего устройства, в [Peer] — публичный серверный: перепутанные местами ошибки не дают, канал молчит.
Шаг 2. Импортировать в настольное приложение
Windows: «Add Tunnel» → «Import tunnel(s) from file…», принимаются .conf и .zip. macOS: «Add a tunnel» → «Create from file or archive». Windows хранит туннель не там, где лежал файл, а в %ProgramFiles%\WireGuard\Data\Configurations под DPAPI.
Шаг 3. Разложить конфигурацию на Linux
Пакет: apt install wireguard в Ubuntu, dnf install wireguard-tools в Fedora, pacman -S wireguard-tools в Arch. Файл кладётся как /etc/wireguard/<имя>.conf, подъём — wg-quick up <имя>, автозапуск — systemctl enable --now wg-quick@<имя>.
Шаг 4. Подключить телефон по QR-коду
Android: «Import from file or archive» либо «Scan from QR code». iOS: «Add a tunnel» → «Create from QR code». Код делается командой qrencode -t ansiutf8 < tunnel.conf и содержит конфигурацию целиком, вместе с ключом, — фото экрана пересылать нельзя.
Шаг 5. Убедиться, что канал живой
Смотреть надо не на значок подключения, а на время рукопожатия: Apple показывает «Latest handshake», «Data received» и «Data sent», Android — «Latest handshake» и «Transfer», на Linux — wg show.
Какие ошибки клиента встречаются чаще всего?
Почти всё сводится к шести ситуациям, и в пяти виновато поле в конфигурации, а не сервер.
| Симптом | Причина | Решение |
|---|---|---|
| Нет строки Latest handshake | ключи перепутаны | приватный — свой, публичный — серверный |
| «Incorrect key length» | ключ обрезан при копировании | ровно 44 символа без пробелов |
| Рукопожатие есть, сайтов нет | Windows: один пир с /0, пустой DNS | резолвер или 0.0.0.0/1 + 128.0.0.0/1 |
| Канал замолкает через минуту | PersistentKeepalive = 0 | поставить значение 25 |
| «Unable to resolve DNS hostname» | домен в Endpoint не разрешился | подставить IP-адрес сервера |
| Страницы «висят» только на ПК | разные MTU по умолчанию | задать MTU явно в обоих |
Почему рукопожатие не завершается?
Строка «Handshake did not complete» приходит от реализации протокола, а не от приложения, и одинакова на всех платформах. Попытка повторяется каждые 5 секунд, окно попыток — 90 секунд. Поэтому «did not complete after 5 seconds, retrying (try 2)» в первые секунды норма, а финальная строка в логе — «after 20 attempts, giving up». Если рукопожатия нет вовсе, правка .conf не поможет: маскировка трафика и работа поверх TCP в WireGuard не предусмотрены принципиально, нужен другой транспорт — гайды в разделе «Настройка защищённого канала».
Что делать, если канал есть, а интернета нет?
На Windows это документированное поведение: при единственном пире с маршрутом /0 служба включает kill-switch. Наружу остаются петля, трафик канала, DHCP и NDP, порт 53 — только к серверам из поля DNS, остальное блокируется. Решения два: вписать работающий резолвер либо заменить 0.0.0.0/0 парой 0.0.0.0/1 и 128.0.0.0/1, что равно снятию отметки «Block untunneled traffic». На Linux вместо этого работает policy routing с таблицей от 51820. Смежное — на странице «VPN подключён, но сайты не открываются».
Почему MTU на телефоне и ноутбуке разный?
При пустом поле MTU платформы считают его по-разному. На десктопе wg-quick берёт MTU маршрута до Endpoint и вычитает 80 байт, откуда типовое 1420; служба Windows делает то же. Android подставляет жёсткие 1280. Отсюда «на телефоне открывается, на ноутбуке висит» — лечится явным MTU в обоих.
Как задаётся DNS и почему он молчит?
На Linux поле DNS реализовано внешней утилитой: при подъёме выполняется resolvconf -a tun.<интерфейс> -m 0 -x. У wireguard-tools зависимость необязательная (Suggests), а сам /usr/sbin/resolvconf в Ubuntu 24.04 приносит пакет systemd-resolved: на штатной системе команда есть, а на минимальных образах и в контейнерах без него канал поднимется, команда упадёт с «command not found», и резолвинг останется провайдерским. Проверка — command -v resolvconf. На Android адреса из поля DNS уходят системе через VpnService.Builder.addDnsServer. Смежное — в материале «VPN не работает на Android».
Частые вопросы
Собрали то, что спрашивают чаще всего при первом импорте.
Можно ли использовать один конфиг на телефоне и ноутбуке?
Нет, каждому устройству нужна своя пара ключей и свой адрес в поле Address. Значение Endpoint у пира на сервере автоматически обновляется адресом последнего корректно аутентифицированного пакета, поэтому два устройства с одинаковыми ключами начинают вытеснять друг друга. Симптом выглядит как случайные обрывы: работает то одно устройство, то другое.
Где Windows-клиент хранит импортированные туннели?
В каталоге %ProgramFiles%\WireGuard\Data\Configurations, доступ к которому имеют только SYSTEM и администраторы. Файлы лежат там не в исходном виде: к имени добавляется суффикс .conf.dpapi, а содержимое шифруется механизмом DPAPI. Открыть и отредактировать их блокнотом не получится — правки вносятся через редактор туннеля в самом приложении. Имя туннеля при этом ограничено 32 символами из набора a-zA-Z0-9_=+.- и не может совпадать с зарезервированными именами Windows вроде CON или NUL.
Какой MTU ставить, если страницы грузятся не полностью?
Сначала посмотрите, что стоит сейчас. Если поле MTU пустое, десктопные реализации берут MTU маршрута и вычитают 80 байт, откуда типовое значение 1420, а Android-приложение подставляет жёсткие 1280. Из-за этого один и тот же файл ведёт себя на телефоне и ноутбуке по-разному. Задайте MTU явно одним числом в обеих конфигурациях; приложения Apple принимают значения только в диапазоне 576–65535.
Что означает PersistentKeepalive = 25 в конфигурации?
Это интервал отправки служебных пакетов, чтобы запись трансляции в NAT не истекла. Допустимый диапазон — от 1 до 65535 секунд, значение по умолчанию 0, то есть функция выключена. Документация проекта называет 25 секунд интервалом, который работает с широким набором брандмауэров. Ставится параметр на той стороне, которая находится за NAT, то есть обычно у клиента, а не у сервера.
Почему приложение пишет Incorrect key length?
Ключ WireGuard в base64 — это ровно 44 символа, что соответствует 32 байтам. Чаще всего строка ломается при копировании из терминала или мессенджера: добавляется перенос строки, лишний пробел или обрезается хвост. Неверная длина даёт Incorrect key length с пояснением WireGuard base64 keys must be 44 characters (32 bytes), а посторонний символ внутри строки — Bad characters in key; приложения Apple формулируют то же самое как требование 32-byte key in base64 encoding. Если же подставлен визуально похожий, но чужой ключ, ошибки не будет вовсе — просто не появится рукопожатие.
Нужно ли на Linux ставить что-то помимо пакета wireguard?
Для самого канала достаточно: wireguard в Ubuntu — метапакет, который тянет wireguard-tools с утилитами wg и wg-quick. А вот строка DNS в конфигурации реализована вызовом внешней команды resolvconf, и у wireguard-tools пакет openresolv или resolvconf указан только в Suggests. Сам файл /usr/sbin/resolvconf в Ubuntu 24.04 приносит пакет systemd-resolved: на штатной системе команда есть, а на минимальных образах и в контейнерах без него канал поднимется, команда завершится ошибкой command not found, а резолвинг тихо останется провайдерским. Проверить наличие можно командой command -v resolvconf.