Почему wg-quick перезаписывает wg0.conf при остановке интерфейса
SaveConfig — это сохранение при выключении, а не фоновая синхронизация. Редактируйте файл, пока туннель активен, и перезапуск может записать старое состояние поверх него.
Вы добавляете peer в /etc/wireguard/wg0.conf, запускаете systemctl restart wg-quick@wg0, и при следующем взгляде peer исчезает из файла. Ничто ничего не повредило. Перезапуск — это остановка, за которой следует запуск, и шаг остановки может записать текущее состояние выполнения поверх файла, который вы только что отредактировали. Ответственная настройка живёт в том же файле, который вы редактировали, и именно это делает цикл таким запутанным в первый раз.
Два состояния, один файл и сохранение при выключении
Состояние выполнения WireGuard и конфигурационный файл wg-quick связаны, но различны. Файл — это вход: wg-quick читает его, создаёт интерфейс, задаёт адреса и маршруты и настраивает peer'ы. Устройство ядра — живой объект, и низкоуровневые изменения, сделанные с помощью wg, никогда не записываются обратно сами.
За исключением одного направления. Когда SaveConfig = true появляется в разделе интерфейса, wg-quick сохраняет живую конфигурацию в файл как часть опускания интерфейса. Руководство wg-quick предупреждает именно об этом: изменения, внесённые в файл, пока интерфейс активен, могут быть перезаписаны при его удалении. Это сохранение при выключении, а не фоновый таймер, поэтому оно срабатывает только когда что-то останавливает интерфейс.
| Action | What it writes | When it surprises you |
|---|---|---|
wg set on a live interface | Kernel state only | After reboot, when the file was never updated |
wg-quick down with SaveConfig | Live state into the file | Right after you edited the file |
wg syncconf | Kernel state only | Never; it does not touch the file |
wg-quick up | Kernel state from the file | If the file is stale, you get the old tunnel |
Читайте таблицу как предупреждение о порядке. Каждая случайная потеря в этой области происходит из-за правки, сделанной до сохранения, а не после.
Сначала остановите, потом отредактируйте, в конце запустите
Если файл — ваш источник истины, сделайте файл авторитетным построением, а не надеждой. Опустите интерфейс, убедитесь, что он исчез, затем отредактируйте и затем поднимите его снова. Правило простое: никакой правки не существует, пока сохранение ещё может выполняться.
sudo cp -a /etc/wireguard/wg0.conf /root/wg0.conf.$(date +%F-%H%M)
sudo wg-quick down wg0
ls /sys/class/net/wg0 2>/dev/null || echo "interface is gone"
sudoedit /etc/wireguard/wg0.conf
sudo wg-quick up wg0
Строка резервной копии — не церемония. Если туннель — ваш путь к этой машине, шаг опускания может завершить вашу сессию, и копия на диске плюс консоль или внешний путь — единственный работающий откат. Проверьте эту вторую строку, прежде чем доверять ей: устаревшее имя интерфейса в скрипте, который молча завершается с ошибкой, — это способ, которым люди редактируют всё ещё живой файл.
Установка SaveConfig = false перед обычным опусканием — другой принятый путь, и это нужно сделать в файле, который wg-quick действительно читает. Это предотвращает то самое одно автоматическое сохранение. Это не заставляет отдельный профиль NetworkManager, экспорт маршрутизатора или точку входа контейнера перезагружать ваши правки, потому что эти менеджеры вообще не читают этот файл.
Применяйте изменения peer'ов, не разрывая интерфейс
Не каждая правка требует простоя. Изменения на уровне peer'ов можно применить к работающему интерфейсу, преобразовав файл в конфигурацию и синхронизировав её, что полностью избегает шага опускания и поэтому избегает сохранения:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
sudo wg show wg0 peers
sudo wg show wg0 latest-handshakes
Шаг strip важен. Он выводит файл с удалёнными ключами, принадлежащими только wg-quick, чтобы адреса, DNS и директивы маршрутизации не попадали в инструмент, который их не понимает. Затем синхронизация применяет peer'ы и ключи к живому устройству, не пересоздавая интерфейс, поэтому существующие сессии и маршруты выживают.
Будьте точны насчёт ограничений. Синхронизация peer'ов не меняет адрес интерфейса, маршруты, добавленные wg-quick, или конфигурацию резолвера, потому что ничто из этого не принадлежит устройству WireGuard. Добавление подсети в AllowedIPs и ожидание, что ядро её маршрутизирует, — классическое неверное прочтение; маршрут должен быть добавлен wg-quick при подъёме или вами.
Проверьте, кому принадлежит интерфейс, прежде чем что-либо редактировать
На настольном компьютере или сервере, управляемом системой конфигурации, файл может быть выходом, а не входом. Подключение NetworkManager, профиль, созданный маршрутизатором, или скрипт запуска контейнера могут владеть одним и тем же именем интерфейса, и в этом случае безупречная последовательность wg-quick всё равно редактирует не тот артефакт.
systemctl status wg-quick@wg0 --no-pager
nmcli connection show | grep -i wireguard
sudo wg showconf wg0 | head -n 5
Третья команда выводит живую конфигурацию в том же формате, что и файл, включая закрытый ключ, что полезно для сравнения и опасно в тикете. Отредактируйте его перед вставкой; закрытый ключ в ветке поддержки — это постоянная компрометация, а не опечатка.
Если сервисный модуль неактивен, но интерфейс существует, его создало что-то другое, и файл не является авторитетным. Это единственное наблюдение экономит час редактирования файла, который никто не читает.
Проверьте следующий перезапуск, затем сохраните откат
Тест, который действительно доказывает исправление, — это второй перезапуск, потому что именно эта последовательность не удалась в первый раз. Убедитесь, что peer его переживает и что живая конфигурация всё ещё совпадает с тем, что на диске:
sudo systemctl restart wg-quick@wg0
sudo wg show wg0 latest-handshakes
sudo grep -c '^\[Peer\]' /etc/wireguard/wg0.conf
Запустите перезапуск дважды. Один чистый проход может быть удачей: первый перезапуск может израсходовать изменение времени выполнения, которое ещё не было сохранено, поэтому второй — тот, который говорит вам, что файл и среда выполнения совпали в конце первого.
Сохраняйте резервную копию с начала процесса, пока не сделаете двойной перезапуск, затем удалите её или переместите из каталога конфигурации. Заблудившийся wg0.conf.bak рядом с настоящим файлом безвреден для wg-quick и сбивает с толку следующего человека, который в итоге отредактирует не тот.