Suorita VPN:n jälkeiset tehtävät dispatcherista, älä if-upista
Vanha liitännän hook ei näe VPN-yhteyttä. Yhdistä vpn-up profiilin UUID:hen, pidä tehtävä toistettavana ja varaudu katkeamiseen, jota ei koskaan laukaista.
Skripti, jonka on suorituttava VPN:n noustua, tarvitsee tapahtuman komponentilta, joka omistaa yhteyden. Vanhaan verkon hook-kansioon pudotettu tiedosto ei ole callback jokaiselle VPN:lle, jonka NetworkManager, pppd tai erillinen OpenVPN-prosessi voi luoda. Jokainen näistä omistajista raportoi eri tapahtuman eri ympäristöllä, joten omistaja on tunnistettava ennen hookin valintaa. Muuten skripti on oikein ja yksinkertaisesti ei koskaan käynnisty.
NetworkManagerin hallitsemalle VPN:lle dispatcher on oikea paikka ja vpn-up on oikea toiminto.
Käytä vpn-upia, älä liitännän tapahtumaa
Dispatcher erottaa up ja vpn-up. Ensimmäinen raportoi aktivoidun liitännän; toinen raportoi aktivoidun VPN-yhteyden. Wi-Fin nousu tarkoittaa vain, että alla oleva linkki on olemassa; tunneli voi yhä neuvotella tai se ei välttämättä koskaan todentaudu.
Skripti saa liitännän ja toiminnon, kun taas yhteyden tiedot tulevat ympäristön kautta, mukaan lukien profiilin UUID ja VPN:n IP-liitäntä. Lue nämä muuttujat sen sijaan, että päättelet identiteetin laitenimistä.
Rajaa vastaavuus yhteen yhteyteen
Yhdistä yhteyden UUID:hen tai muuhun identiteettiin, jonka dispatcher tarjoaa, älä tun-etuliitteeseen tai ppp0. Liitäntöjen nimet eivät ole vakaita, tunnelia voi olla useampi kuin yksi samanaikaisesti, ja kahdella profiililla voi olla sama näyttönimi. tun-etuliitteen yhdistäminen tarkoittaa, että skripti lopulta laukeaa yhteydelle, johon kukaan ei aikonut koskea. Se voi myös laueta kahdesti yhdelle profiilille, kun uudelleenyhdistäminen rakentaa laitteen uudelleen.
Tee tehtävästä idempotentti. Callback, joka lisää reitin joka kutsulla, täyttää taulukon lopulta kopioilla, ja juuri toinen kopio rikkoo reitityksen.
Tiedä, mitä aktivointi ei todista
vpn-pre-up suoritetaan ennen kuin NetworkManager ilmoittaa VPN:n olevan täysin aktivoitu, ja hallinta odottaa näitä skriptejä. Käytä estävää vaihetta vain, kun tehtävä todella kuuluu sinne, koska hidas tarkistus viivästyttää aktivointia, jota kaikki muut komponentit odottavat näkevänsä.
Reittien olemassaolo ei todista, että sovellus kuuntelee, että yksityinen nimi ratkeaa tai että käyttäjäistunto on olemassa. Tarkista ne erikseen rajatulla aikakatkaisulla ja raportoi, mikä kerros epäonnistui, sen sijaan että toistaisit koko ketjun.
Kunnioita ympäristöä, jossa skripti suoritetaan
Dispatcherin skriptit suoritetaan rootina, minkään käyttäjäistunnon ulkopuolella. Älä oleta, että kirjautuneen käyttäjän ympäristö, graafinen istunto tai avattu avainrengas on käytettävissä. Kenenkään ei pitäisi vastata puuttuvaan työpöytäympäristöön tekemällä jokaisesta tunnistetiedosta jokaisen prosessin luettavissa oleva. Pidä käyttäjäistunnon työ käyttäjäpalvelussa tai istuntoapurissa, jolle callback voi signaloida jäljittelemättä käyttäjää.
Skriptin omistajuus ja käyttöoikeudet ovat myös tärkeitä. Rootina suoritettava tiedosto, jonka kuka tahansa käyttäjä voi korvata, on polku käyttöoikeuksien korottamiseen, ja se on havainto riippumatta siitä, onko VPN-logiikka oikein.
Varaudu katkeamiseen, jota ei koskaan laukaista
NetworkManager dokumentoi, että vpn-pre-down ei lähetetä pakotetuista katkeamisista, kuten odottamattomasta lopetuksesta tai yhteyden menetyksestä. Siksi vain siistiin pre-downiin rakennettu siivous on rakenteellisesti puutteellinen. Jokainen jaettu tila, jota skripti muuttaa, tarvitsee toisen omistajan, joka voi palauttaa sen kaatumisen jälkeen, ja tämä palautuspolku on testattava eikä oletettava.
Testaa hook normaaliyhteydellä, uudelleenyhdistämisellä, tarkoituksellisella katkaisulla ja irrotetulla kaapelilla. Kirjaa UUID, toiminto ja liitäntä, joka laukesi, kirjaamatta salaisuuksia. Tämä kirjaus on ainoa luotettava todiste siitä, että hook suoritettiin tarkoittamallesi yhteydelle, ja juuri se tekee seuraavasta muutoksesta turvallisen.