Udržte několik tunelů vpnc v chodu pomocí sond pro každý profil
Výchozí skript pro opětovné připojení předpokládá jeden tunel. Dejte každému profilu vpnc vlastní port, testujte skutečnou službu a spojte sondy do jednoho pevného pořadí.
Jeden profil vpnc se po roamingu čistě znovu připojí; tři se střídavě navzájem rozbíjejí sockety, trasy a stav resolveru. Skript pro opětovné připojení z balíčku je napsaný pro jediný tunel, takže restartuje každý profil, kdykoli je některý z nich dole. Oprava vyžaduje tři věci: oddělené místní porty, sondu, která pro každý profil testuje skutečnou službu, a jeden uspořádaný řetěz, který nikdy nespustí dvě připojení najednou.
Dejte každému profilu vlastní místní port
Profil vpnc ponechaný na výchozím místním portu soupeří s profilem, který už běží. Druhé připojení selže, zatímco první port drží, a řádek v logu vypadá jako problém brány, nikoli jako místní konflikt. Nastavte místo toho jeden řádek pro každý soubor profilu:
Local Port 0Nula nechá jádro vybrat dočasný port, takže dva profily lze navázat současně. Pojmenujte každý soubor podle brány a skupiny, které slouží, udržujte ho čitelný jen pro root a vždy se připojujte odpovídajícím profilem, ne sdílenou výchozí konfigurací. Sdílený výchozí soubor je způsob, jakým skript po přejmenování profilu připojí špatný tunel.
Soubory profilů nesou přihlašovací údaje, takže oprávnění patří k návrhu, ne k uklízení. Soubor čitelný všem pod /etc/vpnc vydává skupinové tajemství každému místnímu uživateli. Držte režim 0600 s rootem jako vlastníkem a nechte skripty číst soubor jako root, místo aby kopírovaly tajemství do argumentů. Proto by také skript se sondou nikdy neměl vypisovat obsah souboru do logu.
Testujte jednu službu pro každý profil, ne adresu tunelu
Požadavek na echo na vlastní adresu tunelu většinou dokazuje jen to, že rozhraní existuje. Nic neříká o tom, zda hostitel za ním ještě dosáhne na aplikaci, která tunel ospravedlňuje. Rozhraní může být nahoru, zatímco trasa za ním už zmizela.
Testujte jednu službu pro každý profil s krátkým časovým limitem TCP a znovu připojujte jen profil, jehož sonda selhala. Dvě sekundy oddělují mrtvou cestu od pomalé a sonda TCP nezávisí na tom, zda je ICMP někde po cestě povolen. Mezi profily měňte jen cíl a název konfigurace:
#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
/usr/sbin/vpnc-connect ops.conf
fiUložte to jako /usr/local/bin/ensure-vpn-ops.sh, nastavte spustitelný bit a zopakujte pro každý profil se změnou pouze cíle sondy a názvu konfigurace. Sonda, která odpovídá na protokolovou otázku, přežije brány, které zahazují echo, ale dál předávají služby, na kterých uživatelům záleží.
Zřetězte sondy tak, aby nikdy nezávodily
Skript pro opětovné připojení z balíčku může vaše sondy volat postupně a pořadí je celý smysl. Dvě volání vpnc-connect běžící současně přepisují směrovací tabulku v pořadí, které nikdo nekontroluje, a tak zdravý profil přichází o svou trasu.
Nechte volání běžet na popředí, přidejte krátkou prodlevu na ustálení podkladového rozhraní a naplánujte řetěz z rootovy tabulky cron, protože jen root může přepisovat trasy tunelu:
#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.shUdržujte stejné pořadí mezi bootovacím skriptem a položkou v cronu, protože řetěz, který při startu běží v jiném pořadí, je fakticky jiný program. Když jeden profil závisí na trasách druhého, dejte závislost na první místo a nechte pozdější sondu neškodně selhat, dokud se dřívější tunel ještě zvedá.
Sledujte log a pak jeden schválně rozbijte
Zapište jeden řádek na každé spuštění s profilem, cílem sondy, výsledkem a provedenou akcí. Bez toho tunel, který každou minutu kmitá, vypadá přesně jako ten, který nikdy nespadl, a chybu sondy nelze rozeznat od výpadku brány. Log také dokazuje, že řetěz se dotkl jen profilu, který selhal. Pište ho někam, kde přežije restart, jinak důkazy odejdou s procesem.
Pak tunel schválně rozbijte a sledujte, co se stane. Zastavte jediný profil a ověřte, které procesy a trasy ještě existují:
pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.logZnovu by se měl připojit jen zastavený profil a ostatní relace by si měly ponechat procesy i trasy. Pokud se restartují dva profily, váš řetěz běží paralelně někde, kde jste to nečekali.
Co hlídač nesmí dělat
Hlídač, který restartuje všechno, kdykoli něco selže, vypadá při testování zdravě a ve servisním okně způsobí výpadek. Restartujte po profilech, nikdy globálně.
Dejte přednost udržovanému klientovi, když brána nabízí nějakého pro stejný protokol, a nikdy nezapisujte heslo do skriptu ani ho nepředávejte na příkazovém řádku, protože soubor profilu už tajemství drží. Pokud má úloha po zvednutí tunelu běžet jako běžný uživatel, snižte oprávnění uvnitř skriptu, místo abyste celý řetěz pouštěli pod tím účtem. Nakonec po opětovném připojení znovu přečtěte trasy, protože profil se může vrátit s jinou přidělenou adresou a zanechat zastaralou trasu, které si žádná sonda mířená na adresu tunelu nevšimne.