Uzturiet vairākus vpnc tuneļus ar pārbaudēm katram profilam
Standarta atkārtotās savienošanas skripts pieņem vienu tuneli. Dodiet katram vpnc profilam savu portu, pārbaudiet īstu pakalpojumu un savienojiet pārbaudes vienā fiksētā secībā.
Viens vpnc profils pēc viesabonēšanas atkārtoti savienojas tīri; trīs no tiem pēc kārtas lauž viens otra ligzdas, maršrutus un risinātāja stāvokli. Standarta skripts ir rakstīts vienam tunelim, tāpēc tas restartē katru profilu, tiklīdz kāds no tiem ir izkritis. Lai to salabotu, vajadzīgas trīs lietas: atsevišķi lokālie porti, pārbaude, kas katram profilam pārbauda īstu pakalpojumu, un viena sakārtota ķēde, kas nekad nepalaiž divus savienojumus vienlaikus.
Dodiet katram profilam savu lokālo portu
vpnc profils, kas atstāts uz noklusējuma lokālo portu, konkurē ar jau darbojošos profilu. Otrais savienojums neizdodas, kamēr pirmais tur portu, un žurnāla rinda izskatās pēc vārtejas problēmas, nevis lokāla konflikta. Tā vietā ievietojiet vienu rindu katram profila failam:
Local Port 0Nulle ļauj kodolam izvēlēties īslaicīgu portu, tāpēc divus profilus var izveidot vienlaikus. Nosauciet katru failu pēc vārtejas un grupas, kurai tas kalpo, turiet to lasāmu tikai root lietotājam un vienmēr savienojieties ar atbilstošo profilu, nevis ar kopīgu noklusējumu. Kopīgs noklusējuma fails ir veids, kā skripts atkārtoti savieno nepareizo tuneli pēc tam, kad kāds ir pārdēvējis profilu.
Profila faili satur pieteikšanās datus, tāpēc atļaujas ir daļa no projektēšanas, nevis uzkopšanas. Fails, kas ir lasāms visiem un atrodas zem /etc/vpnc, nodod grupas noslēpumu katram lokālajam lietotājam. Turiet režīmu 0600 ar root kā īpašnieku un ļaujiet skriptiem lasīt failu kā root, nevis kopēt noslēpumus argumentos. Tāpēc arī pārbaudes skriptam nekad nevajadzētu ierakstīt faila saturu žurnālā.
Pārbaudiet vienu pakalpojumu katram profilam, nevis tuneļa adresi
Atbalss pieprasījums uz paša tuneļa adresi galvenokārt pierāda, ka saskarne pastāv. Tas neko nepasaka par to, vai aiz tās esošais resursdators vēl sasniedz lietotni, kas attaisno tuneli. Saskarne var būt aktīva, kamēr maršruts aiz tās jau ir pazudis.
Pārbaudiet vienu pakalpojumu katram profilam ar īsu TCP taimautu un atkārtoti savienojiet tikai to profilu, kura pārbaude neizdevās. Divas sekundes atdala mirušu ceļu no lēna, un TCP pārbaude nav atkarīga no tā, vai ICMP kaut kur ceļā ir atļauts. Starp profiliem mainiet tikai mērķi un konfigurācijas nosaukumu:
#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
/usr/sbin/vpnc-connect ops.conf
fiSaglabājiet to kā /usr/local/bin/ensure-vpn-ops.sh, padariet to izpildāmu un atkārtojiet katram profilam, mainot tikai pārbaudes mērķi un konfigurācijas nosaukumu. Pārbaude, kas atbild uz protokola jautājumu, iztur vārtejas, kas atmet atbalsi, bet joprojām pārsūta pakalpojumus, kas lietotājiem ir svarīgi.
Savienojiet pārbaudes ķēdē, lai tās nekad nesacenstos
Standarta skripts var izsaukt jūsu pārbaudes secīgi, un secība ir visa būtība. Divi vienlaikus darbojoši vpnc-connect izsaukumi pārraksta maršrutēšanas tabulu tādā secībā, ko neviens nekontrolē, un tieši tā vesels profils zaudē savu maršrutu.
Turiet izsaukumus priekšplānā, pievienojiet īsu stabilizācijas aizkavi apakšējai saskarnei un ieplānojiet ķēdi no root cron tabulas, jo tikai root var pārrakstīt tuneļa maršrutus:
#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.shTuriet secību identisku starp palaišanas skriptu un cron ierakstu, jo ķēde, kas palaišanas laikā darbojas citā secībā, būtībā ir cita programma. Kad viens profils ir atkarīgs no cita maršrutiem, atkarību lieciet pirmo un ļaujiet vēlākajai pārbaudei nekaitīgi neizdoties, kamēr iepriekšējais tunelis vēl ceļas.
Vērojiet žurnālu, pēc tam tīši salauziet vienu
Reģistrējiet vienu rindu katram palaidienam ar profilu, pārbaudes mērķi, rezultātu un veikto darbību. Bez tā tunelis, kas katru minūti plīvo, izskatās tieši tāpat kā tas, kas nekad nav nokritis, un pārbaudes kļūdu nevar atšķirt no vārtejas pārtraukuma. Žurnāls arī pierāda, ka ķēde aizskāra tikai to profilu, kas neizdevās. Rakstiet to vietā, kas pārdzīvo pārstartēšanu, citādi pierādījumi aiziet kopā ar procesu.
Pēc tam tīši salauziet tuneli un skatieties, kas notiek. Apturiet vienu profilu un pārliecinieties, kuri procesi un maršruti vēl ir:
pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.logAtkārtoti jāsavieno tikai apturētais profils, un pārējām sesijām jāsaglabā gan procesi, gan maršruti. Ja tiek pārstartēti divi profili, jūsu ķēde darbojas paralēli kaut kur, kur jūs to negaidījāt.
Ko sargs nedrīkst darīt
Sargs, kas pārstartē visu, tiklīdz kaut kas neizdodas, testēšanas laikā izskatās vesels un izraisa pārtraukumu apkopes logā. Pārstartējiet pa profiliem, nekad globāli.
Dodiet priekšroku uzturētam klientam, kad vārteja piedāvā tādu pašam protokolam, un nekad neiestrādājiet paroli skriptā un nepārsūtiet to komandrindā, jo profila failā jau ir noslēpums. Ja uzdevumam jādarbojas kā parastam lietotājam pēc tam, kad tunelis ir pacelts, samaziniet privilēģijas skripta iekšienē, nevis lieciet visai ķēdei darboties ar šo kontu. Visbeidzot, pēc atkārtotas savienošanas vēlreiz izlasiet maršrutus, jo profils var atgriezties ar citu piešķirto adresi un atstāt novecojušu maršrutu, ko neviena uz tuneļa adresi vērsta pārbaude nekad nepamanīs.