Hold flere vpnc-tunneler oppe med sonder per profil
Standardgjenoppkoblingsskriptet forutsetter én tunnel. Gi hver vpnc-profil sin egen port, sonder en ekte tjeneste, og kjede sammen sondene i én fast rekkefølge.
Én vpnc-profil kobler seg rent opp igjen etter en roaming; tre av dem ødelegger på omgang hverandres sockets, ruter og resolver-tilstand. Gjenoppkoblingsskriptet fra pakken er skrevet for én tunnel, så det starter hver profil på nytt når som helst en av dem er nede. Å rette det krever tre ting: separate lokale porter, en sonder som tester en ekte tjeneste per profil, og én ordnet kjede som aldri kjører to tilkoblinger samtidig.
Gi hver profil sin egen lokale port
En vpnc-profil som blir stående på den lokale standardporten, konkurrerer med profilen som allerede kjører. Den andre tilkoblingen feiler mens den første holder porten, og logglinjen ser ut som et gateway-problem snarere enn en lokal konflikt. Sett i stedet én linje per profilfil:
Local Port 0Null lar kjernen velge en tilfeldig port, så to profiler kan etableres samtidig. Navngi hver fil etter gatewayen og gruppen den betjener, hold den lesbar bare for root, og koble alltid til med den samsvarende profilen i stedet for en delt standard. En delt standardfil er måten et skript kobler til feil tunnel igjen etter at noen har gitt en profil nytt navn.
Profilfiler inneholder påloggingsdata, så rettigheter er en del av designet og ikke av oppryddingen. En fil under /etc/vpnc som alle kan lese, gir gruppehemmeligheten til hver lokal bruker. Hold modusen på 0600 med root som eier, og la skriptene lese filen som root i stedet for å kopiere hemmeligheter inn i argumenter. Det er også derfor et sondeskript aldri bør skrive filinnholdet til loggen.
Sonder én tjeneste per profil, ikke tunneladressen
En ekko-forespørsel til tunnelens egen adresse beviser stort sett bare at grensesnittet finnes. Den sier ingenting om verten bak fortsatt når applikasjonen som rettferdiggjør tunnelen. Grensesnittet kan være oppe mens ruten bak allerede er borte.
Sonder én tjeneste per profil med en kort TCP-tidsavbrudd, og koble bare profilen hvis sonder feilet på nytt. To sekunder skiller en død vei fra en langsom, og en TCP-sonder avhenger ikke av at ICMP er tillatt noe sted langs veien. Endre bare målet og konfigurasjonsnavnet mellom profilene:
#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
/usr/sbin/vpnc-connect ops.conf
fiLagre det som /usr/local/bin/ensure-vpn-ops.sh, gjør det kjørbart, og gjenta for hver profil med bare sondemålet og konfigurasjonsnavnet endret. En sonder som svarer på et protokollspørsmål, overlever gateways som dropper ekko men fortsatt videresender tjenestene brukerne bryr seg om.
Kjede sammen sondene slik at de aldri kappes
Gjenoppkoblingsskriptet fra pakken kan kalle sondene dine i rekkefølge, og rekkefølgen er hele poenget. To vpnc-connect-kall som kjører samtidig, skriver om rutetabellen i en rekkefølge ingen kontrollerer, og det er slik en sunn profil mister ruten sin.
Hold kallene i forgrunnen, legg til en kort innsvingningsforsinkelse for grensesnittet under, og planlegg kjeden fra roots cron-tabell, siden bare root kan skrive om tunnelrutene:
#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.shHold rekkefølgen identisk mellom oppstartsskriptet og cron-oppføringen, siden en kjede som ved oppstart kjører i en annen rekkefølge, i praksis er et annet program. Når én profil avhenger av en annens ruter, plasser avhengigheten først og la den senere sonden feile ufarlig mens den tidligere tunnelen fortsatt kommer opp.
Følg med på loggen, og ødelegg så en med vilje
Logg én linje per kjøring med profilen, sondemålet, resultatet og handlingen som ble gjort. Uten det ser en tunnel som blafrer hvert minutt, nøyaktig ut som en som aldri falt, og en sonderfeil kan ikke skilles fra et gateway-utfall. Loggen beviser også at kjeden bare rørte profilen som feilet. Skriv den et sted som overlever en omstart, ellers forsvinner bevisene med prosessen.
Ødelegg så en tunnel med vilje og se hva som skjer. Stopp én enkelt profil og bekreft hvilke prosesser og ruter som fortsatt finnes:
pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.logBare den stoppede profilen bør kobles til igjen, og de andre sesjonene bør beholde både prosessene og rutene sine. Hvis to profiler starter på nytt, kjører kjeden din parallelt et sted du ikke forventet.
Hva vakthunden ikke må gjøre
En vakthund som starter alt på nytt når noe feiler, ser sunn ut under testing og forårsaker et utfall i et vedlikeholdsvindu. Start på nytt per profil, aldri globalt.
Foretrekk en vedlikeholdt klient når gatewayen tilbyr en for samme protokoll, og hardkod aldri et passord i skriptet eller send ett på en kommandolinje, fordi profilfilen allerede holder hemmeligheten. Hvis en oppgave må kjøre som vanlig bruker når tunnelen er oppe, senk privilegiene inne fra skriptet i stedet for å la hele kjeden kjøre under den kontoen. Til slutt, les rutene på nytt etter en gjenoppkobling, fordi en profil kan komme tilbake med en annen tildelt adresse og etterlate en utdatert rute som ingen sonder rettet mot tunneladressen noen gang vil legge merke til.