Zadržite nekoliko vpnc tunela aktivnim uz probe po profilu
Standardna skripta za ponovno povezivanje pretpostavlja jedan tunel. Dajte svakom vpnc profilu vlastiti port, provjerite stvarnu uslugu i povežite probe u jednom fiksnom redoslijedu.
Jedan vpnc profil se čisto ponovno povezuje nakon roaminga; tri se naizmjenice međusobno lome utičnice, rute i stanje razrješivača. Skripta za ponovno povezivanje iz paketa napisana je za jedan tunel, pa restarta svaki profil kad god je bilo koji od njih neaktivan. Da se to popravi, potrebne su tri stvari: odvojeni lokalni portovi, proba koja testira stvarnu uslugu po profilu i jedan uređeni lanac koji nikada ne pokreće dva povezivanja istovremeno.
Dajte svakom profilu vlastiti lokalni port
vpnc profil ostavljen na zadanom lokalnom portu takmiči se s profilom koji već radi. Drugo povezivanje ne uspijeva dok prvi drži port, a linija u dnevniku izgleda kao problem s pristupnikom, a ne kao lokalni sukob. Umjesto toga postavite po jednu liniju za svaku datoteku profila:
Local Port 0Nula pušta jezgru da izabere efemerni port, pa dva profila mogu biti uspostavljena istovremeno. Svaku datoteku nazovite po pristupniku i grupi kojoj služi, držite je čitljivom samo za root i uvijek se povezujte odgovarajućim profilom, a ne zajedničkim zadanim. Zajednička zadana datoteka je način na koji skripta ponovno povezuje pogrešan tunel nakon što neko preimenuje profil.
Datoteke profila nose podatke za prijavu, pa su dozvole dio dizajna, a ne pospremanja. Datoteka čitljiva svima pod /etc/vpnc predaje grupnu tajnu svakom lokalnom korisniku. Držite način 0600 s rootom kao vlasnikom i pustite skripte da čitaju datoteku kao root umjesto da kopiraju tajne u argumente. Zato skripta za probu nikada ne bi smjela ispisivati sadržaj datoteke u dnevnik.
Provjerite jednu uslugu po profilu, ne adresu tunela
Eho zahtjev na vlastitu adresu tunela uglavnom dokazuje da interfejs postoji. Ne govori ništa o tome može li host iza njega još uvijek dohvatiti aplikaciju koja opravdava tunel. Interfejs može biti aktivan dok je ruta iza njega već nestala.
Provjerite jednu uslugu po profilu s kratkim TCP istekom i ponovno povežite samo profil čija je proba neuspješna. Dvije sekunde dijele mrtav put od sporog, a TCP proba ne zavisi od toga je li ICMP dopušten bilo gdje na putu. Mijenjajte samo cilj i naziv konfiguracije između profila:
#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
/usr/sbin/vpnc-connect ops.conf
fiSačuvajte to kao /usr/local/bin/ensure-vpn-ops.sh, učinite ga izvršnim i ponovite za svaki profil mijenjajući samo cilj probe i naziv konfiguracije. Proba koja odgovara na protokolno pitanje preživljava pristupnike koji odbacuju eho, a i dalje prosljeđuju usluge do kojih je korisnicima stalo.
Povežite probe u lanac da se nikada ne utrkuju
Skripta za ponovno povezivanje iz paketa može pozivati vaše probe redom, a redoslijed je cijela poanta. Dva vpnc-connect poziva koji rade zajedno prepisuju tablicu usmjeravanja redoslijedom koji niko ne kontrolira, i tako zdrav profil gubi svoju rutu.
Držite pozive u prednjem planu, dodajte kratku pauzu za smirivanje temeljnog interfejsa i zakažite lanac iz rootove cron tablice, jer samo root može prepisivati rute tunela:
#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.shDržite redoslijed istim između skripte za podizanje i cron unosa, jer lanac koji se pri podizanju izvršava drugim redoslijedom zapravo je drugi program. Kada jedan profil zavisi od ruta drugoga, stavite zavisnost prvo i pustite kasniju probu da bezopasno ne uspije dok se raniji tunel još diže.
Pratite dnevnik, pa namjerno slomite jedan
Zapišite jednu liniju po pokretanju s profilom, ciljem probe, rezultatom i poduzetom radnjom. Bez toga tunel koji treperi svake minute izgleda isto kao onaj koji nikada nije pao, a greška u probi ne razlikuje se od ispada pristupnika. Dnevnik dokazuje i da je lanac dotaknuo samo profil koji je pao. Pišite ga negdje gdje preživljava restart, inače dokazi odlaze s procesom.
Zatim namjerno slomite tunel i gledajte šta se događa. Zaustavite jedan profil i potvrdite koji su procesi i rute još prisutni:
pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.logSamo zaustavljeni profil treba biti ponovno povezan, a ostale sesije treba da zadrže i svoje procese i svoje rute. Ako se dva profila restarta, vaš lanac negdje radi paralelno gdje to niste očekivali.
Šta nadzornik ne smije raditi
Nadzornik koji restarta sve kad god nešto ne uspije izgleda zdravo tokom testiranja i izaziva ispad u prozoru za održavanje. Restartajte po profilu, nikada globalno.
Prednost dajte održavanom klijentu kada pristupnik nudi takav za isti protokol i nikada ne upisujte lozinku u skriptu niti je prosljeđujte na naredbenoj liniji, jer datoteka profila već drži tajnu. Ako zadatak mora raditi kao običan korisnik nakon što je tunel podignut, smanjite privilegije iz same skripte umjesto da cijeli lanac radi pod tim računom. Na kraju, ponovno pročitajte rute nakon ponovnog povezivanja, jer se profil može vratiti s drugom dodijeljenom adresom i ostaviti zastarjelu rutu koju nijedna proba usmjerena na adresu tunela nikada neće primijetiti.