Зашто 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 и збуњује следећу особу, која ће на крају изменити погрешну.