Patvirtinimas administravimo konsolėje atrodo kaip paskutinis žingsnis, bet juo nėra. Pirmiausia programa baigiasi skirtojo laiko pabaiga, ir tik tada pamatote, kad maršrutizatorius prisijungęs, o maršrutas patvirtintas. Patvirtinimas yra platinimo žingsnis, o ne leidimas ir ne persiuntimo garantija. Keturi etapai turi sutapti, kol paketas pasieks mazgą už potinklio maršrutizatoriaus, ir kiekvienas gali pavykti, kai kitas nepavyksta. Pereikite juos iš eilės ir sustokite ties pirmuoju etapu, kuris neišsilaiko.

Keturi etapai, viena nesėkmė

Maršrutizatorius skelbia prefiksą, tailnet tą skelbimą patvirtina, klientas priima gautą maršrutą, o prieigos politika leidžia konkretų ryšį. Tai keturi atskiri sprendimai, kuriuos priima trys skirtingi komponentai. Todėl patvirtintas maršrutas tik sako, kad tinklas dabar yra tailnet maršrutizavimo lentelės dalis.

Ketvirtasis etapas praleidžiamas dažniausiai, nes pirmieji trys sukuria matomą būseną. Leidimas, apimantis paties maršrutizatoriaus tailnet adresą, automatiškai neapima už jo esančio privataus potinklio. Tai skirtingos paskirties vietos, o politika vertinama kiekvienai paskirties vietai atskirai.

Linux sistemoje trečiasis etapas taip pat turi numatytąjį nustatymą, kuris nustebina: potinklio maršrutų priėmimas yra neprivalomas. Keli GUI klientai pagal numatytuosius nustatymus priima paskelbtus maršrutus, todėl mišriame parke viena mašina gali atrodyti nepavykusi, kai kitos veikia.

Patvirtinkite nustatymą nepavykusioje mašinoje, o ne darykite prielaidą apie platformą. Maršrutas niekada nebuvo trūkstama dalis veikiančiose mašinose, todėl leiskite joms įrodyti, kad tailnet pusė sveika. Tailscale potinklio maršrutizatorių dokumentacija apima patvirtinimą, kliento maršrutų priėmimą ir politikos etapą.

Patikrinkite maršrutą ten, kur veikia klientas

Pradėkite nuo nepavykusio kliento, o ne nuo maršrutizatoriaus. Patvirtinkite, kad maršrutas yra ir kad kliento nustatymas apskritai leidžia priimti maršrutus.

tailscale status
tailscale debug prefs | grep -i route
ip route get 10.20.0.42

Pirmoji komanda rodo partnerių sąrašą ir ar potinklio maršrutizatorius pasiekiamas, antroji išspausdina kliento nuostatas, įskaitant maršrutų priėmimo vėliavėlę, o trečioji klausia branduolio, kurią sąsają jis naudotų tikram potinklio mazgui. Jei ta paskutinė komanda nurodo fizinę sąsają, o ne Tailscale sąsają, maršrutas niekada nepateko į lentelę. Trūkstamas maršrutas yra kliento pusės problema, o ne patvirtinimo problema. Ištaisykite tai prieš žiūrėdami į politiką.

Norėdami priimti maršrutus Linux sistemoje, prisijunkite iš naujo su vėliavėle, o ne manykite, kad ji nustatyta: tailscale up --accept-routes. Klientas, prisijungęs su kitomis vėliavėlėmis, jas išlaiko, kol jos pakeičiamos, todėl patikrinkite dabartinį nustatymą prieš pridėdami dar vieną. Pakartotinis pirmosios komandos vykdymas po pakeitimo turėtų parodyti maršrutą lentelėje.

Įrodykite persiuntimą ir grįžtamąjį kelią

Patvirtinimas nesukonfigūruoja maršrutizatoriaus persiųsti paketus ir nesutvarko atsakymo. Abu yra mazgo lygio klausimai maršrutizatoriaus LAN pusėje. Išbandykite juos maršrutizatoriuje, o ne kliente.

sysctl net.ipv4.ip_forward
iptables -t nat -L POSTROUTING -n -v
tcpdump -ni any host 10.20.0.42 and port 443

Pirmoji komanda turi pranešti 1, kitaip branduolys išmes persiųstą paketą. Antroji rodo, ar potinklio maršruto maskavimas perrašo šaltinį, o tai yra numatytasis elgesys ir paprastai tai, ko norite. Trečioji rodo, ar užklausa pasiekia paskirties vietą ir ar kas nors grįžta; užklausa be atsakymo yra grįžtamojo kelio problema, o ne patvirtinimo. Perskaitykite tris rezultatus kartu prieš keisdami bet kurį iš jų.

Jei maskavimas buvo išjungtas, paskirties tinklui reikia maršruto atgal į tailnet adresus, ir kiekvienas tarpinis šuolis turi tai žinoti. Maskavimo vėl įjungimas yra greičiausias vienos paslaugos sprendimas, bet kainuoja paslėpti pradinį kliento adresą nuo paskirties vietos. Šis mainas svarbus, kai paskirties vieta registruoja šaltinio adresus auditui, todėl nuspręskite sąmoningai, o ne perverskite vėliavėlę incidento metu. Dokumentuokite, kokį pasirinkimą padarėte, nes kitas žmogus matys tik vieną iš dviejų elgesio variantų.

Skaitykite ištekliaus prieigos taisyklę

Kai maršrutas yra ir persiuntimas įrodytas, likęs įtariamasis yra politika. Perskaitykite leidimą, kuris turėtų leisti ryšį, ir patikrinkite jo paskirties vietą, o ne tik šaltinį. Kliento tapatybė taip pat turi atitikti politikos selektorių, todėl užfiksuokite ją toje pačioje mašinoje, kuri nepavyksta.

tailscale status --json | head -40
tailscale ping <router-name-or-tailnet-ip>
ping -c 3 10.20.0.42

Būsenos išvestis nurodo paties kliento adresus ir partnerius, kuriuos jis mato, ir su tuo turi sutapti politikos šaltinio selektorius. tailscale ping įrodo tailnet kelią iki paties potinklio maršrutizatoriaus; ji išsprendžia partnerių vardus ir tailnet adresus, o ne mazgus paskelbtame potinklyje. Trečioji komanda siunčia įprastą ICMP aidą per potinklio maršrutą, todėl jos rezultatas apibūdina paskirties vietą, o ne maršrutizatorių. Atsisakymas tailnet lygiu paprastai grįžta kaip atsisakymas, o paketas, kuris išeina ir niekada negrįžta, baigiasi skirtojo laiko pabaiga.

Nepavykęs vardas yra kitas klausimas nei nepavykęs adresas; išspręskite mazgą tiesiogiai prieš kaltindami maršrutą. Rašykite leidimą pagal faktinį ištekliaus poreikį, o ne pagal visą potinklį. Atidaryti visą /24, kad viena programa veiktų, yra kelias, kuriuo siaura užklausa tampa plačiu leidimu, kurio vėliau niekas nedrįsta pašalinti.

Jei tikslas buvo išėjimas į internetą, o ne privatus potinklis, teisingas komponentas yra išėjimo mazgas, o ne potinklio maršrutizatorius, ir politika bei maršrutizavimas atitinkamai skiriasi. Patikrinkite tą sprendimą prieš išplėsdami leidimą. Išėjimo mazgas keičia numatytąjį maršrutą; potinklio maršrutizatorius tik skelbia prefiksą.

Susiję straipsniai