Prečo wg-quick prepisuje wg0.conf, keď zastavíte rozhranie
SaveConfig je uloženie pri vypnutí, nie synchronizácia na pozadí. Upravte súbor, kým je tunel aktívny, a reštart môže starý stav prepísať späť cez neho.
Pridáte peer do /etc/wireguard/wg0.conf, spustíte systemctl restart wg-quick@wg0 a pri ďalšom pohľade peer zo súboru zmizne. Nič nič nepoškodilo. Reštart je zastavenie nasledované spustením a krok zastavenia môže zapísať aktuálny behový stav cez súbor, ktorý ste práve upravili. Nastavenie, ktoré za to môže, žije v tom istom súbore, ktorý ste upravovali, a práve to robí slučku takú mätúcu, keď na ňu narazíte prvýkrát.
Dva stavy, jeden súbor a uloženie pri vypnutí
Behový stav WireGuardu a konfiguračný súbor wg-quick spolu súvisia, ale líšia sa. Súbor je vstup: wg-quick ho prečíta, vytvorí rozhranie, nastaví adresy a trasy a nakonfiguruje peery. Zariadenie jadra je živý objekt a zmeny na nízkej úrovni vykonané pomocou wg sa nikdy samy nezapisujú späť.
Až na jeden smer. Keď sa v sekcii rozhrania objaví SaveConfig = true, wg-quick uloží živú konfiguráciu do súboru ako súčasť spúšťania rozhrania nadol. Manuál wg-quick varuje presne pred týmto: zmeny vykonané v súbore, kým je rozhranie aktívne, môžu byť pri jeho odstránení prepísané. Je to uloženie pri vypnutí, nie časovač na pozadí, takže sa spustí len vtedy, keď niečo rozhranie zastaví.
| 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 |
Čítajte tabuľku ako varovanie o poradí. Každá náhodná strata v tejto oblasti pochádza z úpravy, ktorá sa stala pred uložením, a nie po ňom.
Najprv zastavte, potom upravte, nakoniec spustite
Ak je súbor vaším zdrojom pravdy, urobte súbor autoritatívnym konštrukciou, nie nádejou. Spustite rozhranie nadol, overte, že zmizlo, potom upravte a potom ho znova zdvihnite. Pravidlo je jednoduché: žiadna úprava neexistuje, kým ešte môže bežať uloženie.
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
Riadok so zálohou nie je ceremónia. Ak je tunel spôsob, ako sa dostanete k tomuto stroju, krok nadol môže ukončiť vašu reláciu, a kópia na disku plus konzola alebo mimopásmová cesta je jediné vrátenie, ktoré funguje. Overte ten druhý riadok, než mu uveríte: zastaraný názov rozhrania v skripte, ktorý ticho zlyhá, je spôsob, akým ľudia upravujú súbor, ktorý je stále živý.
Nastavenie SaveConfig = false pred bežným vypnutím je druhá prijateľná cesta a musí sa vykonať v súbore, ktorý wg-quick skutočne číta. Zabráni tomu jednému automatickému uloženiu. Nespôsobí, že samostatný profil NetworkManageru, export routera alebo vstupný bod kontajnera znovu načítajú vaše úpravy, pretože títo správcovia tento súbor vôbec nečítajú.
Aplikujte zmeny peerov bez trhania rozhrania
Nie každá úprava potrebuje výpadok. Zmeny na úrovni peerov možno aplikovať na bežiace rozhranie prevodom súboru na konfiguráciu a jej synchronizáciou, čo úplne obíde krok nadol, a tým obíde aj uloženie:
sudo wg syncconf wg0 <(sudo wg-quick strip wg0)
sudo wg show wg0 peers
sudo wg show wg0 latest-handshakes
Krok strip je dôležitý. Vypíše súbor s odstránenými kľúčmi, ktoré patria len wg-quick, takže adresy, DNS a smerovacie direktívy sa nedostanú do nástroja, ktorý im nerozumie. Synchronizácia potom aplikuje peery a kľúče na živé zariadenie bez opätovného vytvorenia rozhrania, takže existujúce relácie a trasy prežijú.
Buďte presní ohľadom limitov. Synchronizácia peerov nemení adresu rozhrania, trasy pridané wg-quick ani konfiguráciu prekladača, pretože nič z toho nepatrí zariadeniu WireGuard. Pridanie podsiete do AllowedIPs a očakávanie, že ju jadro bude smerovať, je klasické nesprávne čítanie; trasu musí pridať wg-quick pri zdvihnutí alebo vy.
Overte, komu rozhranie patrí, než čokoľvek upravíte
Na počítači alebo serveri spravovanom konfiguračným systémom môže byť súbor výstupom, nie vstupom. Pripojenie NetworkManageru, profil generovaný routerom alebo spúšťací skript kontajnera môžu všetky vlastniť rovnaký názov rozhrania, a v takom prípade bezchybná postupnosť wg-quick stále upravuje nesprávny artefakt.
systemctl status wg-quick@wg0 --no-pager
nmcli connection show | grep -i wireguard
sudo wg showconf wg0 | head -n 5
Tretí príkaz vypíše živú konfiguráciu v rovnakom formáte ako súbor, vrátane súkromného kľúča, čo je užitočné na porovnanie a nebezpečné v tikete. Pred vložením ho začiernite; súkromný kľúč vo vlákne podpory je trvalé kompromitovanie, nie preklep.
Ak je servisná jednotka neaktívna, ale rozhranie existuje, vytvorilo ho niečo iné a súbor nie je autoritatívny. Toto jediné pozorovanie ušetrí hodinu úprav súboru, ktorý nič nečíta.
Overte ďalší reštart a potom si ponechajte možnosť vrátenia
Test, ktorý opravu skutočne dokazuje, je druhý reštart, pretože práve táto postupnosť zlyhala prvýkrát. Overte, že peer prežije, a že živá konfigurácia stále zodpovedá tomu, čo je na disku:
sudo systemctl restart wg-quick@wg0
sudo wg show wg0 latest-handshakes
sudo grep -c '^\[Peer\]' /etc/wireguard/wg0.conf
Spustite reštart dvakrát. Jediné čisté prejdenie môže byť šťastie: prvý reštart môže spotrebovať behovú zmenu, ktorá ešte nebola uložená, takže druhý je ten, ktorý vám povie, že súbor a beh sa na konci prvého zhodli.
Uchovajte zálohu od začiatku procesu, kým nevykonáte dvojitý reštart, potom ju vymažte alebo presuňte mimo konfiguračného adresára. Zblúdilý wg0.conf.bak vedľa skutočného súboru je pre wg-quick neškodný a pre ďalšieho človeka mätúci, ktorý nakoniec upraví ten nesprávny.