Această postare va folosi întrebarea de mai sus pentru a explora DNS, dig, A înregistrări, CNAME înregistrări și ALIAS/ANAME înregistrări din perspectiva unui începător. Deci sa începem.

În primul rând, câteva definiții

  • numele domeniului (DNS): sistemul general pentru conversia unui nume de domeniu memorabil uman (exemplu.com) la o adresă IP (93.184.216.34). Adresa IP este a unui server, de obicei un server web, unde sunt stocate fișierele necesare pentru afișarea unei pagini web.
  • Server DNS (cunoscut și sub numele de server de nume sau server de nume): folosește software-ul DNS pentru a stoca informații despre adresele de domeniu. Există mai multe niveluri – cele care aparțin fiecărui ISP, Root (13 în total la nivel mondial), Domeniu de nivel superior (TLD, de exemplu „.com”) și servere DNS de nivel domeniu.
  • Numele domeniului: domeniul (exemplu) combinat cu TLD (.com). Termenul „domeniu” este adesea folosit sinonim cu numele domeniului, deși sunt diferite. Când cumpărați un „domeniu” de la un registrator sau revânzător, cumpărați drepturile asupra unui anumit nume de domeniu (exemplu.com) și a oricăror subdomenii pe care doriți să le creați (site-ul meu.exemplu.com, mail.exemplu.com, etc).

Flux de interogări la nivel înalt

Fluxul la nivel înalt a ceea ce se întâmplă când introduceți „example.com” în browserul dvs. poate fi simplificat pentru a elimina hameiul către serverele DNS ISP, Root și TLD, după cum urmează:

De ce radacina unui domeniu nu poate fi un CNAME
Flux de cereri DNS simplificat, mai multe pot fi văzute într-un flux mai detaliat

Un domeniu are de obicei două sau mai multe servere de nume, care conțin înregistrări referitoare la numele de domeniu (exemplu.com).

Pot fi stocate multe tipuri de înregistrări, dintre care majoritatea pot avea mai multe intrări pe tip:

  • A: Înregistrări de adrese care mapează numele domeniului la o adresă IP
  • CNAME: Înregistrare nume canonic. Folosit pentru a aliasa un nume de domeniu (sau un nume de subdomeniu) la altul. Ne vom uita mai detaliat la aceasta mai târziu.
  • MX: Înregistrați prin e-mail schimburi care le comunică agenților de livrare a e-mailului unde ar trebui să vă trimită e-mailul
  • TXT: înregistrări de text flexibile, pentru stocarea șirurilor pentru o varietate de utilizări
  • SOA: înregistrarea singulară a începutului autorității păstrată la nivelul superior al domeniului. Conține informații specifice necesare despre domeniu, de exemplu serverul său principal de nume
  • NS: Serverele de nume asociate domeniului

Când dispozitivul dvs. trimite o interogare care ajunge la un server de nume, serverul caută în nodul de înregistrare al domeniului un A înregistrare și adresa IP stocată asociată (exemplu.com: 93.184.216.34). Aceasta este apoi returnată dispozitivului, pentru a fi utilizată pentru a trimite o cerere către serverul web corect pentru a recupera pagina web sau resursa solicitată.

ad-banner

Folosind „dig”

dig (groper de informații despre domeniu) este un instrument de linie de comandă pentru interogarea serverelor DNS. Această comandă este în general utilizată pentru depanare sau ca acum pentru a înțelege mai multe despre configurarea unui sistem.

$ dig example.com rezultă un răspuns lung tipărit la terminal, ieșire implicită detaliată aici, de care ne interesează ANSWER SECTION.

;; ANSWER SECTION:
example.com.       72703      IN     A       93.184.216.34

Și acolo mergem, putem vedea asta example.com returnează un A record de 93.184.216.34. Uneori domeniile vor avea mai multe A înregistrare, dacă mai mult de un server web poate furniza informațiile necesare.

Mai este! Dacă încercăm alte exemple, putem vedea în curând că apare o altă înregistrare comună: CNAME.

$ dig www.skyscanner.net:

;; ANSWER SECTION:
www.skyscanner.net. 169 IN CNAME www.skyscanner.net.edgekey.net.
www.skyscanner.net.edgekey.net. 5639 IN CNAME e11316.a.akamaiedge.net.
e11316.a.akamaiedge.net. 20 IN A 23.217.6.192
www.skyscanner.net.edgekey.net. 5639 IN CNAME e11316.a.akamaiedge.net.
e11316.a.akamaiedge.net. 20 IN A 23.217.6.192

Folosind +short steagul ne permite să vedem clar calea formată:

$ dig www.skyscanner.net +short

www.skyscanner.net.edgekey.net.
e11316.a.akamaiedge.net.
23.217.6.192

CNAME

A CNAME înregistrarea permite ca un nume de domeniu să fie folosit ca alias pentru un alt domeniu canonic (adevărat).

Când serverul DNS returnează un CNAME înregistrare, nu va returna acest lucru clientului. Mai degrabă va căuta din nou numele de domeniu returnat și, la rândul său, va returna A adresa IP a înregistrării. Acest lanț poate continua multe CNAME niveluri adânci, dar apoi suferă accesări minore de performanță din mai multe căutări înainte de a avea loc cache.

Un exemplu simplu în acest sens ar putea fi dacă aveți un server în care vă păstrați toate fotografiile. În mod normal, îl puteți accesa prin photos.example.com. Cu toate acestea, ați putea dori, de asemenea, să permită accesul prin photographs.example.com. O modalitate de a face acest lucru posibil este să adăugați un CNAME înregistrați aceste puncte photographs la photos. Aceasta înseamnă că atunci când cineva vizitează photographs.example.com li s-ar da același conținut ca photos.example.com.

Folosind interogarea $ dig photographs.example.com am vedea:

photographs.example.com    IN   CNAME photos.example.com
photos.example.com         IN   A     xx.xxx.x.xxx

Este important să rețineți că CNAME este acea piesă din partea dreaptă. Partea stângă este numele aliasului sau eticheta.

O altă utilizare obișnuită este pentru www subdomeniu. După ce am cumpărat example.com probabil că doriți și utilizatori care introduc www.example.com pentru a vedea același conținut.

Merită menționat aici că example.com poate fi numit apex, rădăcină sau nume de domeniu gol.

O opțiune ar fi să configurați alta A înregistrare, indicând aceeași adresă IP ca pentru example.com. Acest lucru este complet valabil și este ceea ce este real example.com o face, dar nu scară bine. Ce se întâmplă dacă trebuie să actualizați adresa IP example.com arata spre? De asemenea, ar trebui să îl actualizați pentru www subdomeniu și orice altele pe care le puteți folosi.

În cazul în care un CNAME înregistrarea a fost folosită pentru alias www.example.com a arăta spre example.com atunci doar domeniul rădăcină ar trebui actualizat, deoarece toate celelalte noduri indică acest lucru.

Limitări CNAME

La momentul în care au fost scrise standardele DNS, au fost stabilite unele reguli care să guverneze utilizarea acestora. RFC 1912 și RFC 2181 stabiliți că:

  • SOA și NS înregistrările sunt obligatorii pentru a fi prezente la domeniul rădăcină
  • CNAME înregistrările pot exista numai ca înregistrări unice și nu pot fi combinate cu nicio altă înregistrare de resurse (DNSSEC SIG, NXT, și KEY RR cu excepția înregistrărilor)

Aceasta exclude o CNAME fiind folosit pe domeniul rădăcină, deoarece cele două reguli s-ar contrazice.

Ceea ce este important aici este că aceasta este o limitare contractuală, nu una tehnică. Este posibil să utilizați un CNAME la rădăcină, dar poate duce la erori neașteptate, deoarece încalcă contractul de comportament așteptat.

Un exemplu în acest sens este spus de Cloudflare, descriind problemele pe care le-au întâmpinat cu serverele de poștă Microsoft Exchange după ce au folosit un CNAME pe domeniul lor rădăcină:

Domeniile desemnează, în general, serverele care își gestionează e-mailul prin ceea ce este cunoscut sub numele de înregistrare MX. Problema era că serverele Exchange … puteau prelua CNAME la înregistrarea rădăcină și apoi să nu respecte corect CNAME setat la înregistrarea MX. Nu poți da vina pe Exchange. Aceștia funcționau în conformitate cu ipotezele stabilite de specificația DNS.

Aici vedeți dezavantajul care poate apărea în mai multe software-uri de servere sau biblioteci. Deoarece există un standard pentru un CNAME a fi numai înregistrați la un nod, nu se caută alte înregistrări. Toate celelalte înregistrări vor fi ignorate în tăcere, fără avertisment sau mesaje de eroare. Chiar dacă un MX înregistrarea a fost setată pentru a primi e-mail, MX va fi ignorat ca și cum nu ar exista pentru că CNAME este evaluat mai întâi. Același lucru este valabil dacă ar exista un A înregistrare: CNAME ar avea prioritate și A înregistrarea nu ar fi citită.

Internetul modern

Deci, de ce este aceasta o problemă? De ce ai vrea vreodată să folosești un CNAME pentru domeniul dvs. rădăcină oricum? Cu siguranță acesta este sfârșitul căii atunci când căutați adresa IP a serverului web care găzduiește conținutul dvs.?

În peisajul modern al internetului, nu mai este cazul. Lumea este foarte diferită de când au fost scrise standardele DNS.

Puteți alege să utilizați o platformă ca furnizor de servicii (PaaS), cum ar fi Heroku și stochează conținut pe serverele lor web. Tu controlați conținutul, dar nu și infrastructura, iar furnizorul PaaS face greutatea întreținerii rețelei. De obicei, acestea vă oferă o adresă URL (my-app.herokuapp.com) care este un subdomeniu al domeniului rădăcină al acestora și puteți vizualiza adresele IP pentru serverele web pe care se află conținutul dvs. Dar acestea sunt în totalitate sub controlul furnizorului PaaS și se vor schimba fără avertisment.

Scara și frecvența modificărilor de backend efectuate de furnizorul PaaS pot face dificilă menținerea domeniului dvs. root A înregistrare care indică o singură adresă IP. În mod ideal, ați dori să faceți acest lucru:

example.com      IN   CNAME    my-app.herokuapp.com.www.example.com  IN   CNAME    my-app.herokuapp.com.example.com      IN   CNAME    my-app.herokuapp.com.
www.example.com  IN   CNAME    my-app.herokuapp.com.

pentru a permite Heroku (sau furnizorul dvs. de gazdă ales) să gestioneze actualizarea A consemnează că CNAME indică fără modificări făcute de partea ta. Cu toate acestea, după cum știm acum, acest lucru încalcă specificațiile DNS, deci este o idee foarte proastă.

Este posibil să implementați pur și simplu un 301/302 redirecționează de la example.com la www.example.com. Cu toate acestea, acea instrucțiune are loc fie pe serverul web (așa că încă mai aveți problema necesității de a utiliza un dispozitiv fix A înregistrare în DNS pentru a indica serverul web respectiv) sau o redirecționare personalizată a furnizorului DNS (care suferă de complicații cu HTTPS).

Acest lucru are, de asemenea, efectul secundar al schimbării domeniului pe care îl vedeți în bara URL, pe care este posibil să nu-l doriți. Această metodă este destinată atunci când site-ul dvs. web sa mutat permanent sau când încercați păstrează clasamentele SEO, mai degrabă decât să rezolvăm problema noastră de a indica o schemă complexă în schimbare într-un mod scalabil.

Soluția

Mai mulți furnizori DNS au dezvoltat acum soluții personalizate pentru a rezolva această problemă, inclusiv:

  • ALIAS la DNSimple
  • ANAME la DNS Made Easy
  • ANAME la easyDNS
  • CNAME (virtual) la CloudFlare

Acestea sunt toate tipurile de înregistrări virtuale care oferă CNAME ca un comportament, fără niciunul dintre dezavantaje. Implementarea exactă poate diferi, dar la un nivel ridicat atunci când serverul DNS vede unul dintre aceste tipuri de înregistrări virtuale, acționează ca un rezolvator DNS. Urmează lanțul creat de alias până când se rezolvă la un A înregistrează (sau înregistrează) și le returnează A înregistrează pe serverul DNS. Acest lucru „aplatizează” CNAME lanț în A înregistrarea a fost returnată și nu se distinge de interogarea trimisă. Interogarea vede doar un pur A record, care nu încalcă specificațiile DNS și nu are niciunul dintre dezavantajele unui CNAME.

Aceste înregistrări virtuale pot sta alături de alte înregistrări la rădăcină, fără nici o teamă de comportamente neintenționate. În funcție de metoda furnizorului de rezoluție DNS atunci când urmați CNAME lanț, acestea pot avea, de asemenea, beneficii de performanță din cache-ul căutărilor anterioare.

Pentru o configurare simplă DNS, vom configura apoi după cum urmează. Această soluție are toate avantajele aliasării numelor de domeniu și niciunul dintre riscurile utilizării acesteia la nivel de rădăcină.

example.com      IN   ALIAS    my-app.herokuapp.com.www.example.com  IN   CNAME    my-app.herokuapp.com.

Mulțumesc pentru lectură! ?

Ca întotdeauna, deschideți orice corecții sau puncte suplimentare.

Resurse