Что вставлять в каждую строку VPN WireGuard: полный разбор конфигурации

Подробное руководство по заполнению конфигурационных файлов WireGuard для сервера и клиента. Разбор каждой строки, примеры, типичные ошибки и ответы на частые вопросы.

Основы конфигурации WireGuard: структура файла и роли узлов

WireGuard — это современный протокол VPN, который использует пары асимметричных ключей для аутентификации и шифрования. Конфигурация описывается в текстовых файлах с расширением .conf, которые обычно хранятся в /etc/wireguard/ на Linux-системах. Каждый файл соответствует одному сетевому интерфейсу (например, wg0.conf).

В WireGuard нет жёсткого разделения на «сервер» и «клиент» на уровне протокола — все узлы равноправны и называются пирами (peer). Однако в практических схемах (например, «звезда») один узел ожидает входящие подключения (сервер), а другие инициируют соединение (клиенты). Это различие определяет, какие параметры нужно указывать в каждой строке конфигурации.

Файл конфигурации состоит из двух основных секций:

  • [Interface] — настройки самого узла (IP-адрес, приватный ключ, порт прослушивания).
  • [Peer] — настройки удалённого узла (публичный ключ, разрешённые IP-адреса, адрес для подключения).

Для каждого удалённого пира создаётся отдельная секция [Peer]. Это позволяет гибко управлять доступом и маршрутизацией.

Секция [Interface]: что вставлять в строку Address

Параметр Address задаёт IP-адрес (или несколько адресов) виртуального интерфейса WireGuard на данном узле. Адреса указываются в формате CIDR (например, 10.0.0.1/24). Это означает, что интерфейсу присваивается адрес 10.0.0.1 с маской подсети 255.255.255.0.

Что вставлять:

  • Для сервера: обычно первый адрес из выбранной подсети, например 10.0.0.1/24.
  • Для клиента: любой свободный адрес из той же подсети, например 10.0.0.2/24.

Подсеть должна быть уникальной и не пересекаться с другими VPN-сетями или локальными сетями. Можно указывать несколько адресов через запятую, в том числе IPv6 (например, 10.0.0.1/24, fd00::1/64).

Важно: адрес в Address не обязательно должен быть частью AllowedIPs у пира — это разные параметры. Address назначается самому интерфейсу, а AllowedIPs определяет, какие сети маршрутизируются через туннель.

Секция [Interface]: PrivateKey, ListenPort и другие параметры

PrivateKey — это закрытый (приватный) ключ узла. Он генерируется командой wg genkey и должен храниться в секрете. В конфигурацию вставляется строка в формате base64, например:

PrivateKey = uD9x...Z3k=

ListenPort — порт UDP, на котором узел ожидает входящие соединения от других пиров. Для сервера это обязательный параметр (обычно 51820). Для клиента его можно не указывать — тогда порт выбирается случайно. Если клиент также должен принимать входящие подключения (например, в mesh-сети), порт нужно задать явно.

Дополнительные параметры:

  • MTU — максимальный размер пакета. По умолчанию 1420 байт, но может потребоваться уменьшить (например, до 1280) при использовании PPPoE или других туннелей.
  • DNS — серверы DNS, которые будут использоваться после подключения. Указывается в клиентской конфигурации, например DNS = 8.8.8.8, 1.1.1.1.
  • Table — управляет таблицей маршрутизации. По умолчанию auto, но можно указать off, чтобы не добавлять маршруты автоматически.

Пример для сервера:

[Interface]
Address = 10.0.0.1/24
PrivateKey = SERVER_PRIVATE_KEY
ListenPort = 51820

Секция [Peer]: PublicKey, AllowedIPs и Endpoint

Секция [Peer] описывает удалённый узел. Каждый пир идентифицируется своим публичным ключом.

PublicKey — открытый ключ удалённого узла. Он генерируется из приватного ключа командой wg pubkey и может передаваться по открытым каналам. Вставляется строка base64, например:

PublicKey = 9E...Xw=

AllowedIPs — список IP-адресов и подсетей, которые разрешено направлять через данный туннель. Это ключевой параметр для маршрутизации.

  • На сервере для каждого клиента обычно указывается только его IP-адрес (например, 10.0.0.2/32), чтобы не маршрутизировать чужой трафик.
  • На клиенте часто указывается 0.0.0.0/0 (весь трафик) или конкретные подсети, которые должны идти через VPN.

Endpoint — адрес и порт удалённого узла в формате IP:порт или домен:порт. Указывается только на стороне, которая инициирует соединение (клиент). Для сервера этот параметр отсутствует — он ждёт входящие подключения.

Пример для клиента:

[Peer]
PublicKey = SERVER_PUBLIC_KEY
AllowedIPs = 0.0.0.0/0
Endpoint = 203.0.113.10:51820

PersistentKeepalive, PresharedKey и другие опции пира

PersistentKeepalive — интервал (в секундах) отправки keepalive-пакетов, чтобы поддерживать NAT-таблицу открытой. Обязателен для клиентов за NAT или CGNAT. Типичное значение — 25 секунд. Если не указать, туннель может «зависнуть» через несколько минут простоя.

PresharedKey — дополнительный симметричный ключ, который добавляет слой шифрования к рукопожатию. Генерируется командой wg genpsk. Указывается в обеих секциях [Peer] (на сервере и клиенте) для одного и того же соединения. Повышает устойчивость к квантовым атакам в будущем.

Пример с PresharedKey:

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
PresharedKey = PSK_STRING
AllowedIPs = 10.0.0.2/32

PersistentKeepalive не нужен на серверной стороне, так как сервер не инициирует соединение. Однако если сервер также является клиентом для другого узла, keepalive может потребоваться.

Важно: keepalive увеличивает нагрузку на канал, но незначительно. Для мобильных устройств можно установить больший интервал (например, 60 секунд), чтобы экономить батарею.

Как настроить сервер: пошаговый пример конфигурации

Рассмотрим настройку сервера WireGuard на Ubuntu 22.04. После установки пакета wireguard и генерации ключей создаём файл /etc/wireguard/wg0.conf:

[Interface]
Address = 10.0.0.1/24
PrivateKey = <приватный_ключ_сервера>
ListenPort = 51820

# Правила для NAT (если сервер — шлюз)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Первый клиент
PublicKey = <публичный_ключ_клиента1>
AllowedIPs = 10.0.0.2/32

[Peer]
# Второй клиент
PublicKey = <публичный_ключ_клиента2>
AllowedIPs = 10.0.0.3/32

Пояснения:

  • PostUp и PostDown — команды, выполняемые при поднятии/опускании интерфейса. Включают форвардинг и NAT, чтобы клиенты могли выходить в интернет через сервер.
  • AllowedIPs на сервере — только IP-адреса клиентов, а не 0.0.0.0/0. Иначе сервер будет пытаться маршрутизировать весь трафик через клиента, что сломает связь.
  • После создания конфига запускаем сервис: systemctl enable --now wg-quick@wg0.

Как настроить клиента: пример конфигурации для Windows и Linux

Клиентская конфигурация отличается наличием Endpoint и часто PersistentKeepalive. Пример для клиента на Linux (файл /etc/wireguard/wg0-client.conf):

[Interface]
Address = 10.0.0.2/24
PrivateKey = <приватный_ключ_клиента>
DNS = 8.8.8.8, 1.1.1.1

[Peer]
PublicKey = <публичный_ключ_сервера>
AllowedIPs = 0.0.0.0/0
Endpoint = <IP_сервера>:51820
PersistentKeepalive = 25

Для Windows:

  1. Скачайте официальный клиент WireGuard с сайта.
  2. Нажмите «Добавить туннель» → «Добавить пустой туннель».
  3. Приложение автоматически сгенерирует ключи и заполнит PrivateKey. Вам нужно добавить:
  • Address = 10.0.0.2/24
  • DNS = 8.8.8.8
  • В секцию [Peer] — публичный ключ сервера, AllowedIPs = 0.0.0.0/0, Endpoint и PersistentKeepalive = 25.
  1. Сохраните и активируйте туннель.

Важно: AllowedIPs = 0.0.0.0/0 направляет весь трафик через VPN. Если нужно только для определённых сайтов, укажите их подсети (например, 10.0.0.0/24 для доступа к локальной сети сервера).

Типичные ошибки при заполнении конфигурации и их диагностика

  1. Перепутаны роли: Endpoint на сервере. Сервер не должен содержать Endpoint — он ждёт подключения. Если указать, сервер попытается сам инициировать соединение, что приведёт к ошибке.
  1. AllowedIPs слишком широкий на сервере. Если на сервере указать AllowedIPs = 0.0.0.0/0 для клиента, сервер будет пытаться маршрутизировать весь интернет-трафик через клиента, что обычно не нужно и ломает связь.
  1. Отсутствие PersistentKeepalive на клиенте за NAT. Без keepalive NAT-таблица провайдера «забудет» сессию через 1–5 минут, и туннель перестанет пропускать трафик, хотя статус будет «подключён».
  1. Конфликт подсетей. Если локальная сеть клиента (например, 192.168.1.0/24) совпадает с сетью WireGuard, маршрутизация сломается. Используйте разные подсети (например, 10.x.x.x).
  1. Неправильный MTU. Слишком большой MTU приводит к фрагментации пакетов. Начните с 1420 и уменьшайте, если возникают проблемы.

Диагностика:

  • Проверьте статус: wg show — должен быть установлен handshake (время последнего обмена).
  • Проверьте маршруты: ip route — должен быть маршрут через интерфейс wg.
  • Проверьте логи: journalctl -u wg-quick@wg0.
  • Используйте tcpdump или ping для проверки связности.

Сценарии использования: роутер как клиент и сервер одновременно

Один роутер может одновременно выступать и клиентом (для выхода в интернет через внешний VPN), и сервером (для доступа к домашней сети извне). Для этого создаются два разных интерфейса WireGuard, например wg-out и wg-in.

Клиентская роль (wg-out):

  • Address = 10.66.66.2/24
  • [Peer] с Endpoint внешнего сервера и AllowedIPs = 0.0.0.0/0.
  • Весь трафик локальной сети направляется через этот туннель.

Серверная роль (wg-in):

  • Address = 10.10.10.1/24
  • ListenPort = 51830
  • [Peer] для каждого устройства (телефон, ноутбук) с их публичными ключами и AllowedIPs = 10.10.10.x/32.
  • Необходим проброс порта 51830 на роутер, если он за NAT.

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

Пример на MikroTik RouterOS 7:

/interface wireguard add name=wg-out listen-port=13231 private-key="..."
/interface wireguard peers add interface=wg-out public-key="..." endpoint-address=... endpoint-port=51820 allowed-address=0.0.0.0/0 persistent-keepalive=25s
/ip address add address=10.66.66.2/24 interface=wg-out
/ip route add gateway=wg-out

/interface wireguard add name=wg-in listen-port=51830 private-key="..."
/interface wireguard peers add interface=wg-in public-key="..." allowed-address=10.10.10.2/32
/ip address add address=10.10.10.1/24 interface=wg-in

Безопасность конфигурации: хранение ключей и дополнительные меры

Приватные ключи — это основа безопасности WireGuard. Их нельзя передавать по открытым каналам и хранить в незащищённом виде.

Рекомендации:

  • Установите права доступа на файлы конфигурации: chmod 600 /etc/wireguard/*.conf.
  • Используйте PresharedKey для дополнительной защиты рукопожатия.
  • Регулярно обновляйте ключи, особенно если есть подозрение на компрометацию.
  • Для серверной роли ограничьте количество попыток подключения с помощью файрвола (например, iptables или nftables).
  • Не используйте одинаковые ключи для разных пиров — каждый клиент должен иметь уникальную пару.

Дополнительные меры:

  • Настройте файрвол для разрешения только UDP-трафика на порт WireGuard.
  • Используйте PostUp/PostDown для динамического управления правилами файрвола.
  • Включите логирование, но не храните логи дольше необходимого.

WireGuard считается одним из самых безопасных протоколов VPN благодаря минимальной кодовой базе и современной криптографии (Curve25519, ChaCha20, Poly1305). Однако безопасность всей системы зависит от правильной настройки и управления ключами.

Вопросы и ответы

Что вставлять в строку PrivateKey в конфигурации WireGuard?

В строку PrivateKey вставляется закрытый (приватный) ключ узла, сгенерированный командой wg genkey. Это строка в формате base64 длиной около 44 символов, например uD9x...Z3k=. Ключ должен храниться в секрете и не передаваться по открытым каналам.

Нужно ли указывать Endpoint на сервере WireGuard?

Нет, на сервере (узле, который ожидает входящие подключения) параметр Endpoint не указывается. Сервер не знает заранее адрес клиента — он принимает соединения от любого пира, чей публичный ключ добавлен в конфигурацию. Endpoint указывается только на стороне, которая инициирует соединение (клиент).

Что означает AllowedIPs = 0.0.0.0/0 в конфигурации клиента?

Значение 0.0.0.0/0 означает, что весь IPv4-трафик будет направляться через VPN-туннель. Это стандартная настройка для полного туннелирования (full-tunnel). Если нужно направлять только трафик к определённым сетям, укажите их подсети через запятую, например 10.0.0.0/24, 192.168.1.0/24.

Зачем нужен PersistentKeepalive и какое значение ставить?

PersistentKeepalive необходим для поддержания NAT-таблицы на маршрутизаторе провайдера. Без него туннель может «зависнуть» через 1–5 минут простоя. Рекомендуемое значение — 25 секунд. Для мобильных устройств можно увеличить до 60 секунд для экономии батареи.

Можно ли использовать один конфигурационный файл для нескольких клиентов?

Нет, каждый клиент должен иметь свой уникальный файл конфигурации с собственным приватным ключом и IP-адресом. На сервере для каждого клиента создаётся отдельная секция [Peer] с его публичным ключом. Использование одного ключа для всех клиентов снижает безопасность и не позволяет управлять доступом индивидуально.

Что делать, если после настройки WireGuard нет интернета?

Проверьте несколько моментов:

  1. Убедитесь, что на сервере включён форвардинг (net.ipv4.ip_forward=1) и настроен NAT (правила PostUp).
  2. Проверьте, что AllowedIPs на клиенте включает 0.0.0.0/0 (если нужен полный туннель).
  3. Проверьте, что DNS-серверы указаны в секции [Interface] клиента.
  4. Проверьте статус handshake командой wg show.
  5. Убедитесь, что файрвол не блокирует UDP-порт WireGuard.
Как сгенерировать ключи для WireGuard?

Для генерации пары ключей выполните команду:

wg genkey | tee private.key | wg pubkey > public.key

Она создаст файлы private.key (приватный ключ) и public.key (публичный ключ). Приватный ключ нужно скопировать в конфигурацию, а публичный передать другой стороне. Установите права chmod 600 private.key для защиты.