Mal som laboratórny stroj, ktorý prijímal tunel zo vzdialeného pracoviska a zároveň sa vytáčal do siete dodávateľa. Odchádzajúci profil fungoval týždne. Po pridaní prichádzajúceho servera sa odchádzajúci pripojil a potom v priebehu niekoľkých sekúnd prestal prenášať prevádzku, alebo odmietol naštartovať s chybou, že adresa sa už používa. Konfiguračné súbory sa nezmenili; hostiteľ jednoducho získal druhý proces OpenVPN s vlastným názorom na porty a trasy.

Zlyhanie nie je náhodné a nie je to problém autentifikácie. Dvaja démóni na jednom stroji súťažia o ten istý lokálny socket a tú istú smerovaciu tabuľku a ten, kto naštartuje alebo sa znovu pripojí ako posledný, zvyčajne vyhrá. Znalosť toho, ktorú z týchto dvoch kolízií máte, rozhoduje o tom, kam sa pozrieť najskôr.

Čítajte symptóm pozpátku

Začnite tým, kedy tunel umiera. Chyba pri viazaní pri štarte ukazuje na počúvajúcu stranu: niečo už ten port vlastní a OpenVPN odmietne naštartovať, namiesto toho, aby sa oň podelil. Tunel, ktorý naskočí a potom stíchne, ukazuje na smerovanie, pretože trasa nainštalovaná druhou inštanciou môže stiahnuť pakety vonkajšieho spojenia z ich cesty.

Oba prípady vytvárajú rovnakú sťažnosť používateľa, a preto opakované slučky a watchdog skripty nič neopravia. Znovu pripájajú klienta do toho istého konfliktu. Užitočná prvá otázka je, či proces pri zastavení prevádzky stále beží.

Jeden socket a jedno zariadenie na inštanciu

Počúvajúci server viaže svoj port; odchádzajúci klient tiež potrebuje lokálny port pre svoju zapuzdrenú prevádzku. Keď obaja žijú na tom istom hostiteľovi, predvolené správanie klienta môže kolidovať s portom servera. Lokálny port klienta možno zafixovať a viazanie možno preskočiť tam, kde partner nepotrebuje pevný zdrojový port:

lport 1195
nobind
dev tun1

Tie čísla sú príklady, nie požiadavka. Dôležité je, že klient prestane súťažiť o port servera a každá inštancia dostane samostatné tunelové zariadenie. Dvaja démóni, ktorí zdieľajú tun0, si navzájom prepisujú stav zariadenia, aj keď sa ich porty líšia, takže jedno zariadenie na tunel nie je voliteľné.

nobind patrí klientskej strane. Server stále musí viazať a počúvať, takže riadok nekopírujte do konfigurácie servera a nevypínajte viazanie na klientovi, ktorého partner filtruje podľa pevného zdrojového portu.

Zvoľte jedného vlastníka predvolenej trasy

Predvolenú trasu môže nainštalovať len jedno pripojenie. Ak oba profily presmerúvajú všetku prevádzku, druhé pripojenie ticho nahradí prvé a prvé vyzerá ako pokazené. Buď ponechajte odchádzajúci tunel rozdelený a posielajte len prefixy dodávateľa, alebo mu dajte samostatnú smerovaciu tabuľku.

ip rule add from 10.9.0.2 table 120
ip route add default dev tun1 table 120
ip route get 10.9.0.2

Adresy a číslo tabuľky vyššie sú zástupné. Hneď po pridaní pravidla overte, že sa vlastná adresa VPN servera stále prekladá cez normálnu tabuľku; tabuľka, ktorá zachytí vonkajší transport, pokazí tunel, ktorý mala chrániť, a nasledujúca slučka opätovného pripojenia vyzerá ako nespoľahlivý poskytovateľ.

Pre nastavenie, ktoré musí prežiť opätovné pripojenia a reštarty, je sieťový namespace pevnejšou hranicou. Druhý klient beží vo svojom vlastnom namespace so svojimi rozhraniami a trasami a vystavené sú len služby, ktoré musia prejsť hranicu. Hostiteľ si drží jednu predvolenú trasu a opätovné pripojenie namespace ju nemôže prepísať.

Overujte tabuľkou, nie stavovým riadkom

Klient, ktorý hlási pripojenie, dokazuje len svoj riadiaci kanál. Zachyťte stav smerovania pred a po každom pripojení a potom sa spýtajte jadra, ktoré zariadenie by použil skutočný cieľ:

ip route show
ip route get 10.40.0.20
ss -lunp | grep 1194

Ak sa zvolené zariadenie pre adresu dodávateľa zmení pri štarte druhého tunela, máte kolíziu trás. Ak sa oba procesy objavia na tom istom lokálnom porte, máte kolíziu socketov. Oprava prvého bez druhého len presúva zlyhanie na ďalšie opätovné pripojenie.

Zapíšte porty, zariadenia, tabuľky a vlastníka trasy do runbooku hostiteľa. Inak ďalší človek, ktorý pridá tretí tunel, znova objaví tú istú kolíziu a jediným viditeľným dôkazom bude spojenie, ktoré funguje, kým sa nereštartuje démon niekoho iného.

Súvisiace články