Antrojo VPN kliento įdiegimas vienam kliento tinklui pasiekti yra įprastas būdas, kaip tai prasideda, ir pirmasis tunelis užgęsta, kol abu klientai praneša apie sėkmę. Kiekvienas klientas įdiegė numatytąjį maršrutą, antrasis buvo konkretesnis, ir branduolys dabar jo laikosi viskam, išskyrus paties pirmojo tunelio išorinį ryšį. Niekas nesugriuvo ir joks profilis nėra neteisingas. Vienas maršrutas pakeitė kitą, o sprendimas – nuspręsti, kuris tunelis turi turėti numatytąjį.

Simptomas: antrasis klientas tyliai laimi

OpenVPN: parinktis redirect-gateway def1 neperrašo 0.0.0.0/0. Ji prideda 0.0.0.0/1 ir 128.0.0.0/1: kartu jie apima kiekvieną IPv4 adresą, ir kiekvienas priešdėlis ilgiu nugali paprastą numatytąjį. Pradinis numatytasis lieka lentelėje ir nebenaudojamas įprastam srautui, o maršrutas iki VPN serverio neleidžia tuneliui pagauti savo išorinių paketų. Abu klientai tai daro, o antrasis tiesiog įdiegia savo porą vėliau.

Todėl pirmasis tunelis atrodo miręs, o ne atjungtas. Jo sąsaja pakelta, valdymo kanalas gyvas, ir joks programos srautas į jį nebeateina. Priešingas skundas turi tą patį trūkstamą push: telefonas, kuris prisijungia, bet nieko nesiunčia, paprastai kalba su serveriu, kuris niekada neskelbė redirect-gateway, todėl įrenginys išlaiko savo numatytąjį ir pasiekia tik baseiną.

Padarykite maršrutų nuotrauką prieš ir po antrojo kliento prisijungimo. Du pusiniai maršrutai, atsirandantys lentelėje, yra visas pokytis, ir jie paaiškina abu skundus. Niekas kitas lentelėje neturi judėti, kad atsirastų simptomas. Todėl pašalinus antrąjį klientą pirmasis atkuriamas akimirksniu.

Perskaitykite, kuris tunelis iš tikrųjų laimi

Neišveskite nugalėtojo iš klientų paleidimo eilės ar dėklo piktogramos. Paklauskite branduolio, kokį maršrutą jis naudotų paskirčiai už abiejų privačių tinklų, ir perskaitykite grąžintą sąsają.

ip route show
ip route get 198.51.100.24
route print -4
Find-NetRoute -RemoteIPAddress 198.51.100.24

Pirmieji du yra Linux atsakymas, o paskutiniai du – Windows atitikmuo. Vykdykite juos, kol abu tuneliai pakelti, tada atjunkite vieną ir vykdykite dar kartą. Skirtumas tarp dviejų išvesčių yra faktas, kurio reikia prieš renkantis sprendimą, ir tai užima mažiau laiko nei bet kurio kliento žurnalo skaitymas.

Užrašykite rezultatą, įskaitant sąsajos pavadinimą ir atitikusį priešdėlį. Bilietas, kuriame sakoma, kad antrasis VPN sugadino pirmąjį, yra simptomo aprašymas, o ne maršrutizavimo teiginys, kuriuo kas nors galėtų vadovautis. Paieška paverčia jį faktu, kurį kitas inžinierius gali atkartoti viena komanda.

Windows: neleiskite vienam profiliui turėti numatytojo

Windows saugo profilius, o įtaisytasis klientas leidžia vienam priklausyti nuo kito, kad pirmasis automatiškai pakiltų, kai antrasis skambina. Profilis, prisijungęs paskutinis, linkęs išlaikyti numatytąjį, todėl praktinis savininkas yra paskutinis skambutis, o ne pirmasis. Duokite kiekvienam profiliui savo push maršrutus ir įjunkite split tunneling tam, kuris neturėtų turėti numatytojo.

Set-VpnConnection -Name "Contoso" -SplitTunneling $true
rasdial Contoso

Split tunneling tai keičia: į lentelę patenka tik serverio pushinami priešdėliai, o tai palieka numatytąjį pirmajam tuneliui. Dizainas vis tiek žlunga, jei abu serveriai pushina numatytąjį maršrutą, nes tada laimi paskutinis ryšys ir jokia kliento pusės nuostata to nepakeis. Pataisykite push serverio pusėje arba priimkite vieną savininką.

Programos paleidžiami profiliai yra kita funkcija ir verta žinoti: Windows profilis gali pradėti veikti, kai paleidžiamas nurodytas vykdomasis failas, o srauto filtrai sprendžia, ką jis neša. Tai profilio nuostata, o ne ugniasienės taisyklė, ir ji sprendžia kitą problemą nei numatytojo maršruto konfliktas.

Linux: laikykite antrąjį tunelį už pagrindinės lentelės

Dviejų openvpn --config egzempliorių paleidimas vienoje mašinoje padeda abu klientus į tą pačią lentelę, o trys parinktys atskiria juos didėjančia izoliacija. Lengviausia – neleisti antrajam klientui apskritai redaguoti lentelės: route-nopull su aiškiais maršrutais arba route-up scenarijus, įdiegiantis tik tai, ko ketinate. Tada antrasis tunelis neša būtent jūsų įvardintus priešdėlius ir nieko daugiau. Tada jūs nusprendžiate, kurie priešdėliai kur eina, o ne atrandate tai vėliau.

Politikos maršrutizavimas yra vidurinė parinktis. Taisyklė parenka atskirą lentelę vienam šaltinio adresui ar ugniasienės žymei, ir ta lentelė neša antrojo tunelio maršrutus. Atvirkštinio kelio filtravimas čia yra spąstai, nes atsakymas, atėjęs per kitą sąsają nei rinktųsi lentelė, išmetamas, todėl patikrinkite rp_filter nuostatą prieš darydami išvadą, kad tunelis sugadintas.

ip rule add from 10.44.7.0/24 table 100
ip route add default dev tun1 table 100
sysctl net.ipv4.conf.all.rp_filter

Tinklo vardų erdvės yra sunkiausia ir švariausia parinktis. Paleiskite antrąjį klientą ip netns viduje, duokite jam veth porą ir įeikite į tą vardų erdvę, kad juo naudotumėtės. Trikdžiai išnyksta, nes kiekviena vardų erdvė turi savo lenteles, o ne dalijasi viena, ir tai verta papildomo nustatymo, kai abu tuneliai turi likti pakelti savaitėmis.

Pagal programą, o grandinimas yra atskira problema

Kartais tik viena programa turėtų naudoti antrąjį tunelį. Linux sistemoje politikos maršrutizavimas pagal naudotoją, cgroup ar prievadą pasiekia tą rezultatą, o vieną paskirties tašką galima prisegti prie sąsajos visai neliečiant numatytojo. Programa, prisėgusi savo lizdą prie vienos sąsajos, visiškai nesikreipia į maršrutizavimo lentelę, todėl paleidiklis gali toliau naudoti fizinį adapterį, kol jo paties nustatymuose nebus pasirinktas adresas.

Grandinimas yra kita operacija nei dviejų tunelių paleidimas greta. Grandininti A per B reiškia, kad vidinio serverio adresas turi būti pasiekiamas iš išorinio tunelio vidaus. Išorinis klientas taip pat neturi palaikyti vidinio kliento šifruotų paketų nuotėkiu. Vienas klientas virtualioje mašinoje yra grubi, bet patikima versija; abu viename hoste reikalauja aukščiau aprašyto maršrutizavimo darbo ir išorinio kelio link vidinio serverio, kuris niekada neįeina į vidinį tunelį.

Užrašykite numatytojo savininką, kiekvieno tunelio nešamų priešdėlių sąrašą ir DNS kelią. Tie trys faktai paverčia kitą incidentą paieška, o ne tyrimu.

Susiję straipsniai