scutil --dns išspausdina sprendiklio konfigūraciją, kurios macOS iš tikrųjų klausia, o ne tą vienintelį DNS serverį, kurį įvedėte nustatymų skydelyje. Išvestis ilgesnė, nei dauguma tikisi, nes sistema laiko atskirus sprendiklio blokus numatytajam keliui, apribotoms sąsajoms ir konkrečiam domenui skirtam persiuntimui. Viršutinis išvesties blokas nebūtinai yra tas, kuris atsako į užklausą. Jei privatus vardas biure išsprendžiamas, o VPN įsijungimo akimirką nepavyksta, neatitikimas yra derinimo taisyklėse ir maršrutuose, o ne serverio adrese. Pirmiausia perskaitykite tvarką, tada įrodykite atsakymą tikra paieška.

Perskaitykite blokų tvarką prieš adresus

Kiekvienas įrašas prasideda resolver #N ir išvardija nameserver[0], kartais if_index, flags eilutę, reach ir, kai blokas nėra paprastas numatytasis, domain bei search domain sąrašą. Sprendiklis numeris 1 be domeno yra numatytasis, kuris tvarko viešus vardus. Viskas, kas savo vėliavose turi Scoped, yra susieta su sąsaja, kurią nurodo if_index, o viskas, pažymėta Supplemental, galioja tik žemiau išvardytiems domenams.

Pasirinkimas yra priesagos derinimas. Vardui kaip intranet.corp.example macOS teikia pirmenybę sprendikliui, kurio domain įrašas yra ilgiausia atitinkanti priesaga, todėl blokas su domain : corp.example nugali numatytąjį net tada, kai yra labai žemai išvestyje. order išsprendžia lygiąsias tarp vienodo ilgio domenų. Pirmam žvilgsniui retai reikia daugiau: visos išvesties, kai norite perskaityti vieną bloką nuo pradžios iki pabaigos, pradinių eilučių blokų tvarkai sužinoti ir filtruotos eigos, kuri spausdina blokų antraštes šalia laukų eilučių. Apriboti blokai rodomi po savo antrašte ir skaitomi kaip aukščiau esančio sąrašo tęsinys, todėl cituodami išvestį visada laikykite antraštę akyse.

scutil --dns
scutil --dns | sed -n '1,45p'
scutil --dns | grep -nE '^resolver #|^DNS configuration'
scutil --dns | grep -nE 'resolver #[0-9]+|if_index|domain|flags|nameserver'

Susiekite if_index su tunelio sąsaja

Indeksas naudingas tik tada, kai galite įvardyti už jo esančią sąsają. scutil --nwi išvardija tinklo informaciją, kurią laiko sistema, įskaitant pagrindinę sąsają ir pasiekiamumą, o ifconfig -l pateikia vardus, kur utun0 iki utun9 yra tunelio kandidatai, kuriuos klientas paprastai sukuria. Apple naudoja scutil --dns kaip savo patikros pavyzdį diegimo vadove, ir dokumentuoja, kaip Network Extension gali nukreipti pasirinktus domenus į pasirinktus sprendiklius, ir būtent šį mechanizmą atskleidžia tie apriboti blokai.

Patikra, kuri išsprendžia klausimą, yra ar sprendiklis yra tame kelyje, kurį įdiegė tunelis:

scutil --nwi
ifconfig utun4
route -n get 10.20.0.53
netstat -rn | grep -m5 utun

Jei route -n get grąžina tinklų sietuvą ir sąsają, kurie neatitinka sprendiklio įrašo, adresas gali būti visiškai teisingas ir vis tiek nepasiekiamas. Padalintas tunelis, kuris neša tik įmonės potinklius, meta užklausas į DNS serverį už jų ribų, o gedimas pasireiškia kaip skirtasis laikas, todėl konfigūracijos išvestis vis dar atrodo švari.

Klauskite sistemos sprendiklio, tada serverio

Trys įrankiai atsako į tris skirtingus klausimus, o jų painiojimas sukuria daugumą klaidingų išvadų šioje srityje. dscacheutil -q host -a name eina per tą patį sistemos sprendiklį, kurį naudoja įprastos programos, todėl galioja apriboti ir papildomi blokai. dig be serverio argumento skaito /etc/resolv.conf, kuris macOS nėra apriboto sprendimo tiesos šaltinis, ir visiškai praleidžia taisykles pagal domeną. dig @address pasiekia lygiai vieną serverį ir nieko nesako apie pasirinkimą.

dscacheutil -q host -a name intranet.corp.example
dig intranet.corp.example
dig @10.20.0.53 intranet.corp.example
nslookup intranet.corp.example

Kai pirmoji komanda atsako, o antroji grąžina NXDOMAIN, radote ieškomą atskyrimą ir niekas nesugedę. Kai pirmoji baigiasi skirtuoju laiku, o dig @10.20.0.53 atsako, sprendiklis veikia, bet nepasiekiamas tunelio pasirinktame kelyje, todėl kitas žingsnis yra route -n get, o ne DNS nustatymų keitimas. Laikykite privačius vardus toliau nuo visko, ką įklijuojate į bilietą ar bendrą užrašą.

Ko išvestis negali jums parodyti

Keli sluoksniai sėdi virš sprendiklių sąrašo ar šalia jo, ir kiekvienas gali nusiųsti užklausą ten, ko išvestis niekada nemini. Naršyklė su įjungtu saugiu DNS gali spręsti savo šifruotu kanalu, todėl puslapis, kuris įkeliamas, kai dscacheutil baigiasi skirtuoju laiku, nėra prieštaravimas. Saugumo programinės įrangos įdiegtas DNS tarpinis serveris veikia kaip Network Extension teikėjas ir pats persiunčia užklausas, o scutil --dns rodo, kas buvo sukonfigūruota, o ne aukštupio adresą, kurį tarpinis serveris galiausiai naudojo. Paieškos domenai prideda trečią raukšlę: nekvalifikuotam vardui iš eilės pridedama kiekviena išvardyta priesaga, todėl atsakęs blokas gali būti toks, kurio niekada neįtartumėte.

Pasenę atsakymai yra pigiausia atskirti ir dažniausiai praleidžiami:

sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder
scutil --dns | head -20

Jei po išvalymo išvestis pasikeičia, būsena buvo podėlyje, o ankstesnė išvestis aprašė tunelį, kurio nebebuvo. Jei nesikeičia, konfigūracija yra tokia, kokia yra, ir klausimas persikelia į maršrutus ir programų politiką.

Trumpas vadovas prieš ir po

Fiksuokite bazinę liniją tik ten, kur politika leidžia, ir laikykite failus už bet kurio sinchronizuoto aplanko ribų. Toliau pateikta seka yra tai, ką vykdau klientų kompiuteriuose: užfiksuokite bazinę liniją, prisijunkite, užfiksuokite dar kartą, tada palyginkite ir ieškokite.

scutil --dns > ~/dns-before.txt
# connect the VPN, then:
scutil --dns > ~/dns-after.txt
diff -u ~/dns-before.txt ~/dns-after.txt
dscacheutil -q host -a name intranet.corp.example

Skirtumą skaitykite blokais, o ne eilutėmis. Numatoma forma yra naujas apribotas sprendiklis, turintis tunelio sąsajos indeksą ir domain įrašą privačiai priesagai. Naujas numatytasis sprendiklis, nurodantis į viešą adresą, yra radinys, kurį verta iškelti tam, kam priklauso kliento profilis. Tada pakartokite paiešką programoje, kuri iš tikrųjų nepavyko, o ne tik apvalkale, ir šalia rezultato užsirašykite sąsają iš route -n get.

Norėdami atšaukti pakeitimą, atjunkite ir pakartokite bazinės linijos fiksavimą. Jei apribotas blokas dingo, klientas po savęs sutvarkė. Jei blokas vis dar išvardytas prie sąsajos, kurios nebėra, būsena pasenusi, o išvalymas kartu su prisijungimu iš naujo yra švelniausias pataisymas, kol kas nors nelies profilio.

Keturi patikrinimai šia tvarka: ar koks nors sprendiklio blokas atitinka ilgiausią vardo priesagą; ar tas blokas susietas su sąsaja, kurią įdiegė tunelis; ar maršrutas iki jo vardų serverio naudoja tunelį; ir ar atsakymą grąžina sistemos sprendiklis, o ne dig. Pirmasis nepavykęs patikrinimas pasako, ar keisti DNS politiką, tunelio maršrutus, ar programą. Jei visi keturi praeina, o vardas vis tiek nepavyksta, problema yra virš DNS, o kitas dalykas, kurį reikia apžiūrėti, yra viskas, kas prieš jį atsako į 53 prievadą.

Susiję straipsniai