Одржавајте више vpnc тунела са проверама за сваки профил
Стандардна скрипта за поновно повезивање претпоставља један тунел. Дајте сваком vpnc профилу сопствени порт, проверите стварну услугу и повежите провере у једном фиксном редоследу.
Један vpnc профил се чисто поново повезује после роуминга; три од њих наизменично кваре једни другима сокете, руте и стање резолвера. Стандардна скрипта за поновно повезивање написана је за један тунел, па рестартује сваки профил кад год је било који од њих недоступан. Да би се то поправило, потребне су три ствари: одвојени локални портови, провера која тестира стварну услугу за сваки профил и један уређени ланац који никада не покреће две везе истовремено.
Дајте сваком профилу сопствени локални порт
vpnc профил остављен на подразумеваном локалном порту такмичи се са профилом који већ ради. Друга веза не успева док прва држи порт, а линија у дневнику изгледа као проблем са пролазом, а не као локални конфликт. Уместо тога поставите по једну линију за сваку датотеку профила:
Local Port 0Нула пушта језгро да изабере привремени порт, па два профила могу бити успостављена истовремено. Назовите сваку датотеку по пролазу и групи којој служи, држите је читљивом само за root и увек се повезујте одговарајућим профилом, а не заједничком подразумеваном. Заједничка подразумевана датотека је начин на који скрипта поново повезује погрешан тунел након што неко преименује профил.
Датотеке профила носе податке за пријаву, па су дозволе део дизајна, а не поспремања. Датотека читљива свима под /etc/vpnc предаје групну тајну сваком локалном кориснику. Држите режим на 0600 са root-ом као власником и пустите скрипте да читају датотеку као root уместо да копирају тајне у аргументе. Зато скрипта за проверу никада не би смела да исписује садржај датотеке у дневник.
Проверите једну услугу по профилу, не адресу тунела
Ехо захтев на сопствену адресу тунела углавном доказује да интерфејс постоји. Не говори ништа о томе да ли домаћин иза њега још увек достиже апликацију која оправдава тунел. Интерфејс може бити активан док је рута иза њега већ нестала.
Проверите једну услугу по профилу са кратким TCP роком и поново повежите само профил чија провера није успела. Две секунде деле мртву путању од споре, а TCP провера не зависи од тога да ли је ICMP дозвољен негде на путу. Мењајте само циљ и назив конфигурације између профила:
#!/bin/bash
set -eu
if ! nc -z -w 2 10.63.7.20 8443; then
/usr/sbin/vpnc-connect ops.conf
fiСачувајте то као /usr/local/bin/ensure-vpn-ops.sh, учините га извршним и поновите за сваки профил мењајући само циљ провере и назив конфигурације. Провера која одговара на протоколно питање преживљава пролазе који одбацују ехо, али и даље прослеђују услуге које су корисницима важне.
Повежите провере у ланац да се никада не утркују
Стандардна скрипта за поновно повезивање може да позива ваше провере редом, а редослед је цела поента. Два позива vpnc-connect која раде заједно преписују табелу рутирања редоследом који нико не контролише, и тако здрав профил губи своју руту.
Држите позиве у предњем плану, додајте кратку паузу за смиривање основног интерфејса и закажите ланац из root-ове cron табеле, јер само root може да преписује руте тунела:
#!/bin/bash
sleep 20
/usr/local/bin/ensure-vpn-ops.sh
/usr/local/bin/ensure-vpn-lab.shДржите редослед исти између скрипте за подизање и cron уноса, јер ланац који се при подизању извршава другим редоследом заправо је други програм. Када један профил зависи од рута другога, ставите зависност прву и пустите каснију проверу да безопасно не успе док се ранији тунел још подиже.
Пратите дневник, па намерно сломите један
Забележите по једну линију за свако покретање са профилом, циљем провере, резултатом и предузетом радњом. Без тога тунел који трепери сваког минута изгледа исто као онај који никада није пао, а грешка у провери не разликује се од испада пролаза. Дневник такође доказује да је ланац дотакао само профил који није успео. Пишите га негде где преживљава рестарт, иначе докази одлазе са процесом.
Затим намерно сломите тунел и гледајте шта се дешава. Зауставите један профил и потврдите који су процеси и руте још присутни:
pgrep -a vpnc
ip -4 route show | grep -E '10[.]63|10[.]90'
tail -n 5 /var/log/ensure-vpn.logСамо заустављени профил треба да се поново повеже, а остале сесије треба да задрже и процесе и руте. Ако се два профила рестартују, ваш ланац негде ради паралелно где то нисте очекивали.
Шта чувар не сме да ради
Чувар који рестартује све кад год нешто не успе изгледа здраво током тестирања и изазива испад у прозору за одржавање. Рестартујте по профилу, никада глобално.
Преферирајте одржаван клијент када пролаз нуди такав за исти протокол и никада не упишите лозинку у скрипту нити је преносите на командној линији, јер датотека профила већ чува тајну. Ако задатак мора да ради као обичан корисник након што је тунел подигнут, смањите привилегије изнутра скрипте уместо да цео ланац ради под тим налогом. На крају, поново прочитајте руте после поновног повезивања, јер профил може да се врати са другом додељеном адресом и остави застарелу руту коју ниједна провера усмерена на адресу тунела никада неће приметити.