En profil vpnc se po gostovanju čisto znova poveže; trije si izmenično lomijo vtičnice, poti in stanje razreševalnika. Skript za ponovno povezavo iz paketa je napisan za en tunel, zato znova zažene vsak profil, kadar koli je kateri od njih nedosegljiv. Za popravilo so potrebne tri stvari: ločena lokalna vrata, preizkus, ki za vsak profil preizkusi resnično storitev, in en urejen sklop, ki nikoli ne zažene dveh povezav hkrati.

Vsakemu profilu dajte lastna lokalna vrata

Profil vpnc, ki ostane na privzetih lokalnih vratih, tekmuje s profilom, ki že teče. Druga povezava ne uspe, medtem ko prva drži vrata, in vrstica v dnevniku je videti kot težava s prehodom, ne kot lokalni konflikt. Namesto tega nastavite eno vrstico na datoteko profila:

Local Port 0

Nič prepusti jedru izbiro efemernih vrat, zato je mogoče dva profila vzpostaviti hkrati. Vsako datoteko poimenujte po prehodu in skupini, ki ji služi, ohranite jo berljivo samo za root in vedno se povežite z ustreznim profilom, ne s skupno privzeto nastavitvijo. Skupna privzeta datoteka je način, kako skript znova poveže napačen tunel, potem ko je nekdo preimenoval profil.

Datoteke profilov vsebujejo poverilnice, zato so dovoljenja del zasnove in ne pospravljanja. Datoteka, berljiva vsem pod /etc/vpnc, izroči skupno skrivnost vsakemu lokalnemu uporabniku. Ohranite način 0600 z lastnikom root in pustite skriptom, da datoteko berejo kot root, namesto da kopirajo skrivnosti v argumente. Zato tudi skript za preizkus nikoli ne bi smel izpisovati vsebine datoteke v dnevnik.

Preizkusite eno storitev na profil, ne naslova tunela

Zahteva za odmev na lastni naslov tunela večinoma dokaže le, da vmesnik obstaja. Ne pove ničesar o tem, ali gostitelj za njim še doseže aplikacijo, ki upravičuje tunel. Vmesnik je lahko aktiven, medtem ko je pot za njim že izginila.

Preizkusite eno storitev na profil s kratkim časovnim omejitvijo TCP in znova povežite le profil, katerega preizkus ni uspel. Dve sekundi ločita mrtvo pot od počasne, in preizkus TCP ni odvisen od tega, ali je ICMP kje na poti dovoljen. Med profili spreminjajte le cilj in ime konfiguracije:

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

Shranite to kot /usr/local/bin/ensure-vpn-ops.sh, naredite datoteko izvršljivo in ponovite za vsak profil, pri čemer spremenite le cilj preizkusa in ime konfiguracije. Preizkus, ki odgovori na protokolno vprašanje, preživi prehode, ki zavržejo odmev, a še vedno posredujejo storitve, ki so uporabnikom pomembne.

Povežite preizkuse v sklop, da ne tekmujejo nikoli

Skript za ponovno povezavo iz paketa lahko vaše preizkuse kliče po vrsti, in vrstni red je ves smisel. Dva klica vpnc-connect, ki tečeta skupaj, prepišeta usmerjevalno tabelo v vrstnem redu, ki ga nihče ne nadzoruje, in tako zdrav profil izgubi svojo pot.

Klice držite v ospredju, dodajte kratko zakasnitev umiritve za spodnji vmesnik in sklop načrtujte iz rootove tabele cron, saj lahko le root prepiše poti tunela:

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

Ohranite enak vrstni red med zagonskim skriptom in vnosom v cron, ker je sklop, ki se ob zagonu izvaja v drugačnem vrstnem redu, dejansko drug program. Ko je en profil odvisen od poti drugega, odvisnost postavite na prvo mesto in pustite poznejšemu preizkusu, da neškodljivo ne uspe, medtem ko se prejšnji tunel še dviga.

Opazujte dnevnik, nato enega namerno zlomite

Zapišite eno vrstico na vsak zagon s profilom, ciljem preizkusa, rezultatom in izvedenim dejanjem. Brez tega je tunel, ki vsako minuto niha, videti natanko tako kot tisti, ki ni nikoli padel, in napake v preizkusu ni mogoče ločiti od izpada prehoda. Dnevnik tudi dokazuje, da se je sklop dotaknil le profila, ki ni uspel. Zapišite ga nekam, kjer preživi ponovni zagon, sicer dokazi odidejo s procesom.

Nato namerno zlomite tunel in opazujte, kaj se zgodi. Ustavite en sam profil in potrdite, kateri procesi in poti še obstajajo:

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

Znova naj bi se povezal le ustavljeni profil, druge seje pa naj bi ohranile tako procese kot poti. Če se znova zaženeta dva profila, vaš sklop teče vzporedno nekje, kjer tega niste pričakovali.

Česa čuvaj ne sme početi

Čuvaj, ki znova zažene vse, kadar koli kaj ne uspe, je med testiranjem videti zdrav in povzroči izpad v vzdrževalnem oknu. Znova zaženite po profilih, nikoli globalno.

Prednost dajte vzdrževanemu odjemalcu, kadar prehod ponuja enega za isti protokol, in nikoli ne vgradite gesla v skript ali ga posredujte v ukazni vrstici, ker datoteka profila že hrani skrivnost. Če mora opravilo teči kot običajen uporabnik, ko je tunel vzpostavljen, zmanjšajte pravice znotraj skripta, namesto da bi celoten sklop tekel pod tem računom. Nazadnje po ponovni povezavi znova preberite poti, ker se lahko profil vrne z drugačnim dodeljenim naslovom in pusti zastarelo pot, ki je noben preizkus, usmerjen na naslov tunela, nikoli ne bo opazil.

Sorodni članki