Yksi vpnc-profiili yhdistyy siististi uudelleen roamingin jälkeen; kolme niistä rikkovat vuorotellen toistensa soketteja, reittejä ja nimipalvelimen tilaa. Paketin mukana tuleva uudelleenyhdistysskripti on kirjoitettu yhdelle tunnelille, joten se käynnistää jokaisen profiilin uudelleen aina, kun mikä tahansa niistä on alhaalla. Korjaus vaatii kolme asiaa: erilliset paikalliset portit, testin joka kokeilee todellista palvelua profiilia kohden, ja yhden järjestetyn ketjun, joka ei koskaan aja kahta yhteyttä samaan aikaan.

Anna jokaiselle profiilille oma paikallinen portti

Oletuspaikallisporttiin jätetty vpnc-profiili kilpailee jo käynnissä olevan profiilin kanssa. Toinen yhteys epäonnistuu, kun ensimmäinen pitää porttia, ja lokirivi näyttää yhdyskäytäväongelmalta eikä paikalliselta ristiriidalta. Aseta sen sijaan yksi rivi profiilitiedostoa kohden:

Local Port 0

Nolla antaa ytimen valita lyhytaikaisen portin, joten kaksi profiilia voidaan pystyttää samaan aikaan. Nimeä jokainen tiedosto yhdyskäytävän ja sen palveleman ryhmän mukaan, pidä se vain rootin luettavana ja yhdistä aina vastaavalla profiililla jaetun oletuksen sijaan. Jaettu oletustiedosto on tapa, jolla skripti yhdistää väärän tunnelin uudelleen, kun joku on nimennyt profiilin uudelleen.

Profiilitiedostot sisältävät tunnistetietoja, joten käyttöoikeudet kuuluvat suunnitteluun eivätkä taloustöihin. Kaikkien luettavissa oleva tiedosto /etc/vpnc-hakemistossa antaa ryhmän salaisuuden jokaiselle paikalliselle käyttäjälle. Pidä tilana 0600 ja omistajana root, ja anna skriptien lukea tiedosto rootina sen sijaan, että salaisuuksia kopioidaan argumentteihin. Siksi testiskriptin ei pitäisi koskaan tulostaa tiedoston sisältöä lokiin.

Testaa yksi palvelu profiilia kohden, ei tunnelin osoitetta

Kaikupyyntö tunnelin omaan osoitteeseen todistaa lähinnä, että rajapinta on olemassa. Se ei kerro mitään siitä, tavoittaako sen takana oleva isäntä yhä sovelluksen, joka tunnelin oikeuttaa. Rajapinta voi olla ylhäällä, vaikka sen takana oleva reitti on jo kadonnut.

Testaa yksi palvelu profiilia kohden lyhyellä TCP-aikakatkaisulla ja yhdistä uudelleen vain se profiili, jonka testi epäonnistui. Kaksi sekuntia erottaa kuolleen polun hitaasta, eikä TCP-testi riipu siitä, sallitaanko ICMP jossain matkan varrella. Muuta profiilien välillä vain kohdetta ja kokoonpanon nimeä:

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

Tallenna se nimellä /usr/local/bin/ensure-vpn-ops.sh, tee siitä suoritettava ja toista jokaiselle profiilille muuttaen vain testin kohdetta ja kokoonpanon nimeä. Protokollakysymykseen vastaava testi selviytyy yhdyskäytävistä, jotka pudottavat kaikua mutta välittävät yhä palvelut, joista käyttäjät välittävät.

Ketjuta testit, jotta ne eivät koskaan kilpaile

Paketin uudelleenyhdistysskripti voi kutsua testejäsi peräkkäin, ja järjestys on koko pointti. Kaksi samanaikaisesti ajettavaa vpnc-connect-kutsua kirjoittaa reititystaulun uudelleen järjestyksessä, jota kukaan ei valvo, ja niin terve profiili menettää reittinsä.

Pidä kutsut taustalla käynnistämättä, lisää lyhyt asettumisviive alla olevalle rajapinnalle ja ajasta ketju rootin cron-taulusta, koska vain root voi kirjoittaa tunnelin reitit uudelleen:

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

Pidä järjestys samana käynnistysskriptin ja cron-merkinnän välillä, koska ketju, joka käynnistyksessä ajaa eri järjestyksessä, on käytännössä eri ohjelma. Kun yksi profiili riippuu toisen reiteistä, aseta riippuvuus ensimmäiseksi ja anna myöhemmän testin epäonnistua vaarattomasti, kun aikaisempi tunneli on vielä nousemassa.

Seuraa lokia ja riko sitten yksi tahallasi

Kirjaa yksi rivi jokaista ajoa kohden: profiili, testin kohde, tulos ja tehty toimenpide. Ilman sitä joka minuutti väreilevä tunneli näyttää täsmälleen samalta kuin sellainen, joka ei koskaan pudonnut, eikä testin virhettä voi erottaa yhdyskäytävän katkosta. Loki todistaa myös, että ketju koski vain sitä profiilia, joka epäonnistui. Kirjoita se paikkaan, joka kestää uudelleenkäynnistyksen, muuten todisteet lähtevät prosessin mukana.

Riko sitten tunneli tahallasi ja katso, mitä tapahtuu. Pysäytä yksi profiili ja varmista, mitkä prosessit ja reitit ovat yhä olemassa:

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

Vain pysäytetty profiili pitäisi yhdistää uudelleen, ja muiden istuntojen pitäisi säilyttää sekä prosessinsa että reittinsä. Jos kaksi profiilia käynnistyy uudelleen, ketjusi ajaa rinnakkain jossain, missä et odottanut.

Mistä vahtikoiran ei pidä tehdä

Vahtikoira, joka käynnistää kaiken uudelleen aina kun jokin epäonnistuu, näyttää testauksessa terveeltä ja aiheuttaa katkon huoltoikkunassa. Käynnistä uudelleen profiileittain, ei koskaan globaalisti.

Suosi ylläpidettyä asiakasta, kun yhdyskäytävä tarjoaa sellaisen samalle protokollalle, äläkä koskaan kovakoodaa salasanaa skriptiin tai välitä sitä komentorivillä, koska profiilitiedosto pitää salaisuuden jo. Jos tehtävän on ajettava tavallisena käyttäjänä, kun tunneli on ylhäällä, vähennä oikeuksia skriptin sisällä sen sijaan, että koko ketju ajetaan tuon tilin alla. Lue lopuksi reitit uudelleen yhteyden palautuksen jälkeen, koska profiili voi palata eri osoitteella ja jättää vanhentuneen reitin, jota mikään tunnelin osoitteeseen suunnattu testi ei koskaan huomaa.

Aiheeseen liittyvät artikkelit