Читайте конфигурацию WireGuard строка за строкой, от Interface до Peer
Ключи Interface принадлежат этому концу, ключи peer — другой стороне. Читайте каждую строку как одно направление, затем проверьте, что wg-quick добавил вокруг протокола.
Большинство сломанных конфигураций WireGuard ошибаются не в значении; они ставят правильное значение не на ту сторону. Закрытый ключ принадлежит этой машине, peer несёт открытый ключ другой машины, а адрес находится в блоке interface, хотя описывает, где живёт туннель. Читайте файл как два встречающихся направления, затем проверьте, что добавил сверху вспомогательный скрипт. У самого протокола меньше полей, чем у файла, и дополнительные стоит знать отдельно.
Ключи interface описывают эту машину
Блок interface хранит собственную идентичность этого конца. PrivateKey — это та идентичность, и она никогда не покидает хост; из неё выводится соответствующий открытый ключ, и именно его перечисляют другие peers. ListenPort — это место, где эта сторона принимает рукопожатия, поэтому двум клиентам за одним адресом нужны разные порты.
Address — это адрес туннеля, на который отвечает этот хост, записанный с длиной префикса, потому что он же будет и источником. Ошибка в префиксе здесь меняет, какие адресаты хост считает подключёнными напрямую, и это даёт сбои, похожие на маршрутизацию, а не на конфигурацию.
Всё остальное в [Interface] блоке с настоящим клиентом обычно добавляет wg-quick: DNS, MTU, Table, и строки перехватчиков. Это не поля протокола, и голая wg установка полностью их игнорирует.
Каждая запись peer описывает одну другую сторону
[Peer] блок — это удалённая сторона. PublicKey — выведенный ключ этой стороны, никогда не её закрытый ключ, а PresharedKey — необязательный дополнительный секрет, который обе стороны должны держать одинаково. Endpoint — это куда отправлять, а PersistentKeepalive просит этот хост отправить пакет после интервала, когда больше ничего не уходит.
Две ошибки объясняют большую часть путаницы здесь. Копирование своего закрытого ключа в блок peer заставляет два конца делить одну идентичность, и рукопожатие срывается так, что это плохо логируется. Endpoint оставить снаружи на клиенте обычно намеренно, потому что сервер узнаёт адрес из входящего рукопожатия; оставить его снаружи на сервере, который должен инициировать, — нет. Помните также, что keepalive держит отображение NAT открытым, и он не улучшает пропускную способность и не снижает задержку, поэтому тридцать секунд лишних пакетов ничего не покупают, когда трафик уже идёт.
AllowedIPs — это маршрутизация, а не список разрешений
AllowedIPs — это криптоключевая маршрутизация WireGuard. На выходе она решает, какой peer получит пакет по его назначению. На входе она решает, будет ли принят пакет, пришедший от этого peer, по его источнику. Одно и то же поле делает обе работы, поэтому это не список контроля доступа и не список разрешённых сайтов.
Узкий AllowedIPs на сервере для клиента означает, что сервер примет только пакеты, заявляющие эти источники, и отправит только эти адреса тому клиенту. Расширьте одну сторону, не расширяя другую, и получите туннель, который поднимается и ничего не пропускает.
Что wg-quick добавляет вокруг протокола
wg-quick читает тот же файл и выполняет сетевые шаги, которые протокол оставляет операционной системе. Он назначает адрес interface, добавляет маршруты, выведенные из AllowedIPs, записывает настройки резолвера и выполняет команды перехватчиков по порядку.
Этот слой объясняет классическую асимметрию. Файл с 0.0.0.0/0 и строкой DNS даёт клиенту маршрут по умолчанию и резолвер, и он совершенно ничего не делает с правилами перенаправления или NAT сервера. Они принадлежат собственной конфигурации сервера, и ни один клиентский файл не может их предоставить.
Держите одного владельца файла. Ручное редактирование, пока SaveConfig включён, означает, что ваша правка исчезнет в следующий раз, когда интерфейс опустится, и интерфейс не скажет вам, что это произошло.
Проверяйте применённое состояние, а не файл
Файл — это намерение. Применённое состояние — то, что держит ядро, и они расходятся каждый раз, когда помощник, drop-in или перехватчик что-то изменил после активации.
Читайте живое состояние и адресацию вместе, затем сравните оба с тем, что вы написали:
sudo wg show
ip -4 addr show dev wg0
ip -4 route show dev wg0
grep -v "^#" /etc/wireguard/wg0.confЕсли список peers пуст, интерфейс создан без применения его конфигурации. Если адреса и маршруты есть, но счётчики остаются на нуле, файл загрузился и рукопожатие срывается, и это проблема ключа или конца, а не порядка разделов. Сравните два вида перед редактированием, потому что разрыв между ними обычно и есть настоящая неисправность.