Přidáte peer do /etc/wireguard/wg0.conf, spustíte systemctl restart wg-quick@wg0 a peer při dalším pohledu ze souboru zmizí. Nic nic nepoškodilo. Restart je zastavení následované spuštěním a krok zastavení může zapsat aktuální běhový stav přes soubor, který jste právě upravili. Nastavení, které za to může, žije ve stejném souboru, který jste upravovali, a právě to dělá smyčku tak matoucí, když na ni narazíte poprvé.

Dva stavy, jeden soubor a uložení při vypnutí

Běhový stav WireGuardu a konfigurační soubor wg-quick spolu souvisejí, ale liší se. Soubor je vstup: wg-quick jej přečte, vytvoří rozhraní, nastaví adresy a trasy a nakonfiguruje peery. Zařízení jádra je živý objekt a změny na nízké úrovni provedené pomocí wg se nikdy samy nezapisují zpět.

Až na jeden směr. Když se v sekci rozhraní objeví SaveConfig = true, wg-quick uloží živou konfiguraci do souboru jako součást spouštění rozhraní dolů. Manuál wg-quick varuje přesně před tímto: změny provedené v souboru, dokud je rozhraní aktivní, mohou být při jeho odstranění přepsány. Je to uložení při vypnutí, ne časovač na pozadí, takže se spustí jen tehdy, když něco rozhraní zastaví.

ActionWhat it writesWhen it surprises you
wg set on a live interfaceKernel state onlyAfter reboot, when the file was never updated
wg-quick down with SaveConfigLive state into the fileRight after you edited the file
wg syncconfKernel state onlyNever; it does not touch the file
wg-quick upKernel state from the fileIf the file is stale, you get the old tunnel

Čtěte tabulku jako varování o pořadí. Každá náhodná ztráta v této oblasti pochází z úpravy, která proběhla před uložením, a ne po něm.

Nejprve zastavte, potom upravte, nakonec spusťte

Pokud je soubor vaším zdrojem pravdy, udělejte soubor autoritativním konstrukcí, ne nadějí. Spusťte rozhraní dolů, ověřte, že zmizelo, pak upravte a pak je znovu zvedněte. Pravidlo je jednoduché: žádná úprava nesmí existovat, dokud ještě může běžet uložení.

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

Řádek se zálohou není ceremonie. Pokud je tunel způsobem, jak se k tomuto stroji dostanete, krok dolů může ukončit vaši relaci, a kopie na disku plus konzole nebo mimopásmová cesta je jediné vrácení, které funguje. Ověřte ten druhý řádek, než mu uvěříte: zastaralý název rozhraní ve skriptu, který tiše selže, je způsob, jakým lidé upravují soubor, který je stále živý.

Nastavení SaveConfig = false před běžným vypnutím je druhá přijatelná cesta a musí se provést v souboru, který wg-quick skutečně čte. Zabrání tomu jednomu automatickému uložení. Nezpůsobí, že samostatný profil NetworkManageru, export routeru nebo vstupní bod kontejneru znovu načtou vaše úpravy, protože tito správci tento soubor vůbec nečtou.

Aplikujte změny peerů bez trhání rozhraní

Ne každá úprava potřebuje výpadek. Změny na úrovni peerů lze aplikovat na běžící rozhraní převodem souboru na konfiguraci a její synchronizací, což zcela obejde krok dolů, a tím obejde i uložení:

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 soubor s odstraněnými klíči, které patří jen wg-quick, takže adresy, DNS a směrovací direktivy se nedostanou do nástroje, který jim nerozumí. Synchronizace pak aplikuje peery a klíče na živé zařízení bez opětovného vytvoření rozhraní, takže stávající relace a trasy přežijí.

Buďte přesní ohledně limitů. Synchronizace peerů nemění adresu rozhraní, trasy přidané wg-quick ani konfiguraci překladače, protože nic z toho nepatří zařízení WireGuard. Přidání podsítě do AllowedIPs a očekávání, že ji jádro bude směrovat, je klasické chybné čtení; trasu musí přidat wg-quick při zvednutí nebo vy.

Ověřte, komu rozhraní patří, než cokoli upravíte

Na počítači nebo serveru spravovaném konfiguračním systémem může být soubor výstupem, nikoli vstupem. Připojení NetworkManageru, profil generovaný routerem nebo spouštěcí skript kontejneru mohou všichni vlastnit stejný název rozhraní, a v takovém případě bezchybná posloupnost wg-quick stále upravuje špatný artefakt.

systemctl status wg-quick@wg0 --no-pager
nmcli connection show | grep -i wireguard
sudo wg showconf wg0 | head -n 5

Třetí příkaz vypíše živou konfiguraci ve stejném formátu jako soubor, včetně soukromého klíče, což je užitečné pro srovnání a nebezpečné v tiketu. Před vložením jej začerněte; soukromý klíč ve vlákně podpory je trvalé kompromitování, ne překlep.

Pokud je servisní jednotka neaktivní, ale rozhraní existuje, vytvořilo ho něco jiného a soubor není autoritativní. Toto jediné pozorování ušetří hodinu úprav souboru, který nic nečte.

Ověřte další restart a pak si ponechte možnost vrácení

Test, který opravu skutečně dokazuje, je druhý restart, protože právě tato posloupnost poprvé selhala. Ověřte, že peer přežije, a že živá konfigurace stále odpovídá tomu, co je na disku:

sudo systemctl restart wg-quick@wg0
sudo wg show wg0 latest-handshakes
sudo grep -c '^\[Peer\]' /etc/wireguard/wg0.conf

Spusťte restart dvakrát. Jediné čisté projití může být štěstí: první restart může spotřebovat běhovou změnu, která ještě nebyla uložena, takže druhý je ten, který vám řekne, že soubor a běh se na konci prvního shodly.

Uchovejte zálohu od začátku procesu, dokud neprovedete dvojitý restart, poté ji smažte nebo přesuňte mimo konfigurační adresář. Zbloudilý wg0.conf.bak vedle skutečného souboru je pro wg-quick neškodný a pro dalšího člověka matoucí, protože nakonec upraví ten špatný.

Související články