Основы конфигурации 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Как настроить сервер: пошаговый пример конфигурации
Рассмотрим настройку сервера 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:
- Скачайте официальный клиент WireGuard с сайта.
- Нажмите «Добавить туннель» → «Добавить пустой туннель».
- Приложение автоматически сгенерирует ключи и заполнит
PrivateKey. Вам нужно добавить:
Address = 10.0.0.2/24DNS = 8.8.8.8- В секцию
[Peer]— публичный ключ сервера,AllowedIPs = 0.0.0.0/0,EndpointиPersistentKeepalive = 25.
- Сохраните и активируйте туннель.
Важно: AllowedIPs = 0.0.0.0/0 направляет весь трафик через VPN. Если нужно только для определённых сайтов, укажите их подсети (например, 10.0.0.0/24 для доступа к локальной сети сервера).
Типичные ошибки при заполнении конфигурации и их диагностика
- Перепутаны роли: Endpoint на сервере. Сервер не должен содержать
Endpoint— он ждёт подключения. Если указать, сервер попытается сам инициировать соединение, что приведёт к ошибке.
- AllowedIPs слишком широкий на сервере. Если на сервере указать
AllowedIPs = 0.0.0.0/0для клиента, сервер будет пытаться маршрутизировать весь интернет-трафик через клиента, что обычно не нужно и ломает связь.
- Отсутствие PersistentKeepalive на клиенте за NAT. Без keepalive NAT-таблица провайдера «забудет» сессию через 1–5 минут, и туннель перестанет пропускать трафик, хотя статус будет «подключён».
- Конфликт подсетей. Если локальная сеть клиента (например,
192.168.1.0/24) совпадает с сетью WireGuard, маршрутизация сломается. Используйте разные подсети (например,10.x.x.x).
- Неправильный 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/24ListenPort = 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 нет интернета?
Проверьте несколько моментов:
- Убедитесь, что на сервере включён форвардинг (
net.ipv4.ip_forward=1) и настроен NAT (правилаPostUp). - Проверьте, что
AllowedIPsна клиенте включает0.0.0.0/0(если нужен полный туннель). - Проверьте, что DNS-серверы указаны в секции
[Interface]клиента. - Проверьте статус handshake командой
wg show. - Убедитесь, что файрвол не блокирует UDP-порт WireGuard.
Как сгенерировать ключи для WireGuard?
Для генерации пары ключей выполните команду:
wg genkey | tee private.key | wg pubkey > public.keyОна создаст файлы private.key (приватный ключ) и public.key (публичный ключ). Приватный ключ нужно скопировать в конфигурацию, а публичный передать другой стороне. Установите права chmod 600 private.key для защиты.