Jeden profil vpnc sa po roamingu čisto znova pripojí; tri sa striedavo navzájom rozbíjajú sockety, trasy a stav resolvera. Skript opätovného pripojenia z balíka je napísaný pre jediný tunel, takže reštartuje každý profil, kedykoľvek je niektorý z nich dole. Oprava si vyžaduje tri veci: oddelené miestne porty, sondu, ktorá pre každý profil testuje skutočnú službu, a jeden usporiadaný reťaz, ktorý nikdy nespustí dve pripojenia naraz.

Dajte každému profilu vlastný miestny port

Profil vpnc ponechaný na predvolenom miestnom porte súperí s profilom, ktorý už beží. Druhé pripojenie zlyhá, kým prvý drží port, a riadok v logu vyzerá ako problém brány, nie ako miestny konflikt. Nastavte namiesto toho jeden riadok pre každý súbor profilu:

Local Port 0

Nula nechá jadro vybrať dočasný port, takže dva profily možno nadviazať súčasne. Pomenujte každý súbor podľa brány a skupiny, ktorej slúži, udržujte ho čitateľný len pre root a vždy sa pripájajte zodpovedajúcim profilom, nie zdieľanou predvolenou konfiguráciou. Zdieľaný predvolený súbor je spôsob, akým skript po premenovaní profilu pripojí nesprávny tunel.

Súbory profilov nesú prihlasovacie údaje, takže oprávnenia patria k návrhu, nie k upratovaniu. Súbor čitateľný všetkými pod /etc/vpnc vydáva skupinové tajomstvo každému miestnemu používateľovi. Držte režim 0600 s rootom ako vlastníkom a nechajte skripty čítať súbor ako root, namiesto kopírovania tajomstiev do argumentov. Preto by tiež skript so sondou nikdy nemal vypisovať obsah súboru do logu.

Testujte jednu službu pre každý profil, nie adresu tunela

Požiadavka na echo na vlastnú adresu tunela väčšinou dokazuje len to, že rozhranie existuje. Nič nehovorí o tom, či hostiteľ za ním ešte dosiahne aplikáciu, ktorá tunel ospravedlňuje. Rozhranie môže byť hore, kým trasa za ním už zmizla.

Testujte jednu službu pre každý profil s krátkym časovým limitom TCP a znova pripájajte len profil, ktorého sonda zlyhala. Dve sekundy oddeľujú mŕtvu cestu od pomalej a sonda TCP nezávisí od toho, či je ICMP niekde po ceste povolené. Medzi profilmi meňte len cieľ a názov konfigurácie:

#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
  /usr/sbin/vpnc-connect ops.conf
fi

Uložte to ako /usr/local/bin/ensure-vpn-ops.sh, nastavte spustiteľný bit a zopakujte pre každý profil so zmenou iba cieľa sondy a názvu konfigurácie. Sonda, ktorá odpovedá na protokolovú otázku, prežije brány, ktoré zahadzujú echo, ale ďalej preposielajú služby, na ktorých používateľom záleží.

Zreťazte sondy tak, aby nikdy nesúperili

Skript opätovného pripojenia z balíka môže vaše sondy volať postupne a poradie je celý zmysel. Dve volania vpnc-connect bežiace súčasne prepisujú smerovaciu tabuľku v poradí, ktoré nikto nekontroluje, a tak zdravý profil prichádza o svoju trasu.

Nechajte volania v popredí, pridajte krátke oneskorenie ustálenia pre podkladové rozhranie a naplánujte reťaz z rootovej tabuľky cron, pretože len root môže prepisovať trasy tunela:

#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.sh

Udržujte rovnaké poradie medzi štartovacím skriptom a položkou v crone, pretože reťaz, ktorá pri štarte beží v inom poradí, je fakticky iný program. Keď jeden profil závisí od trás druhého, dajte závislosť na prvé miesto a nechajte neskoršiu sondu neškodne zlyhať, kým sa skorší tunel ešte dvíha.

Sledujte log a potom jeden úmyselne rozbite

Zapíšte jeden riadok na každé spustenie s profilom, cieľom sondy, výsledkom a vykonanou akciou. Bez toho tunel, ktorý každú minútu kmitá, vyzerá presne ako ten, ktorý nikdy nespadol, a chybu sondy nemožno rozoznať od výpadku brány. Log tiež dokazuje, že reťaz sa dotkol len profilu, ktorý zlyhal. Píšte ho niekam, kde prežije reštart, inak dôkazy odídu s procesom.

Potom tunel úmyselne rozbite a sledujte, čo sa stane. Zastavte jediný profil a overte, ktoré procesy a trasy ešte existujú:

pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.log

Znova by sa mal pripojiť len zastavený profil a ostatné relácie by si mali ponechať procesy aj trasy. Ak sa reštartujú dva profily, váš reťaz beží paralelne niekde, kde ste to nečakali.

Čo strážca nesmie robiť

Strážca, ktorý reštartuje všetko, kedykoľvek niečo zlyhá, vyzerá pri testovaní zdravo a v servisnom okne spôsobí výpadok. Reštartujte po profiloch, nikdy globálne.

Uprednostnite udržiavaného klienta, keď brána ponúka nejakého pre rovnaký protokol, a nikdy nezapisujte heslo do skriptu ani ho neodovzdávajte na príkazovom riadku, pretože súbor profilu už tajomstvo drží. Ak má úloha po zdvihnutí tunela bežať ako bežný používateľ, znížte oprávnenia vnútri skriptu, namiesto toho aby celý reťaz bežal pod tým účtom. Nakoniec po opätovnom pripojení znova prečítajte trasy, pretože profil sa môže vrátiť s inou pridelenou adresou a zanechať zastaranú trasu, ktorej si žiadna sonda mierená na adresu tunela nikdy nevšimne.

Súvisiace články