Ne întâlnim cu serviciul de la Cloudflare la adresele 1.1.1.1 și 1.0.0.1, sau „raftul DNS public a sosit!”

Ne întâlnim cu serviciul de la Cloudflare la adresele 1.1.1.1 și 1.0.0.1, sau „raftul DNS public a sosit!”

Compania Cloudflare prezentat DNS public la adrese:

  • 1.1.1.1
  • 1.0.0.1
  • 2606: 4700: 4700 1111 ::
  • 2606: 4700: 4700 1001 ::

Se susține că este folosită o politică „Privacy first”, astfel încât utilizatorii să poată fi siguri de conținutul solicitărilor lor.

Serviciul este interesant deoarece, pe lângă DNS-ul obișnuit, oferă posibilitatea de a utiliza tehnologii DNS-over-TLS и DNS-over-HTTPS, ceea ce va împiedica foarte mult furnizorii să asculte cu urechea solicitărilor dvs. de-a lungul căii solicitărilor - și să colecteze statistici, să monitorizeze și să gestioneze publicitatea. Cloudflare susține că data anunțului (1 aprilie 2018, sau 04/01 în notație americană) nu a fost aleasă întâmplător: în ce altă zi a anului ar fi prezentate „patru unități”?

Deoarece publicul lui Habr este priceput din punct de vedere tehnic, secțiunea tradițională „De ce avem nevoie de DNS?” O voi pune la sfârșitul postării și aici voi sublinia lucruri mai utile practic:

Cum se utilizează noul serviciu?

Cel mai simplu lucru este să specificați adresele serverului DNS de mai sus în clientul DNS (sau ca un upstream în setările serverului DNS local pe care îl utilizați). Are sens să înlocuim valorile obișnuite? DNS Google (8.8.8.8, etc.), sau puțin mai puțin frecvente Servere DNS publice Yandex (77.88.8.8 și altele asemenea) către serverele de la Cloudflare - vor decide pentru tine, dar vorbește pentru un începător programa viteza răspunsurilor, conform căreia Cloudflare funcționează mai repede decât toți concurenții (dați-mi voie să clarific: măsurătorile au fost făcute de un serviciu terț, iar viteza către un anumit client, desigur, poate diferi).

Ne întâlnim cu serviciul de la Cloudflare la adresele 1.1.1.1 și 1.0.0.1, sau „raftul DNS public a sosit!”

Este mult mai interesant să lucrezi cu moduri noi în care cererea zboară către server printr-o conexiune criptată (de fapt, răspunsul este returnat prin intermediul acesteia), DNS-over-TLS și DNS-over-HTTPS menționate. Din păcate, ele nu sunt acceptate din fabricație (autorii cred că acest lucru este „încă”), dar organizarea muncii lor în software-ul tău (sau chiar pe hardware-ul tău) nu este dificilă:

DNS prin HTTPs (DoH)

După cum sugerează și numele, comunicarea are loc pe un canal HTTPS, ceea ce implică

  1. prezența unui punct de aterizare (punct final) - este situat la https://cloudflare-dns.com/dns-queryși
  2. un client care poate trimite cereri și poate primi răspunsuri.

Solicitările pot fi fie în formatul firului DNS definit în RFC1035 (trimis folosind metodele POST și GET HTTP) sau în format JSON (folosind metoda GET HTTP). Pentru mine personal, ideea de a face interogări DNS prin solicitări HTTP mi s-a părut neașteptată, dar există o grămadă rațională în ea: o astfel de solicitare va trece de multe sisteme de filtrare a traficului, analizarea răspunsurilor este destul de simplă, iar generarea de cereri este și mai simplă. Bibliotecile și protocoalele familiare sunt responsabile de securitate.

Exemple de interogări, direct din documentație:

Solicitare GET în format DNS Wireformat

$ curl -v "https://cloudflare-dns.com/dns-query?ct=application/dns-udpwireformat&dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" | hexdump
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x7f968700a400)
GET /dns-query?ct=application/dns-udpwireformat&dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB HTTP/2
Host: cloudflare-dns.com
User-Agent: curl/7.54.0
Accept: */*

* Connection state changed (MAX_CONCURRENT_STREAMS updated)!
HTTP/2 200
date: Fri, 23 Mar 2018 05:14:02 GMT
content-type: application/dns-udpwireformat
content-length: 49
cache-control: max-age=0
set-cookie: __cfduid=dd1fb65f0185fadf50bbb6cd14ecbc5b01521782042; expires=Sat, 23-Mar-19 05:14:02 GMT; path=/; domain=.cloudflare.com; HttpOnly
server: cloudflare-nginx
cf-ray: 3ffe69838a418c4c-SFO-DOG

{ [49 bytes data]
100    49  100    49    0     0    493      0 --:--:-- --:--:-- --:--:--   494
* Connection #0 to host cloudflare-dns.com left intact
0000000 ab cd 81 80 00 01 00 01 00 00 00 00 03 77 77 77
0000010 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
0000020 01 c0 0c 00 01 00 01 00 00 0a 8b 00 04 5d b8 d8
0000030 22
0000031

Solicitare POST în DNS Wireformat

$ echo -n 'q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB' | base64 -D | curl -H 'Content-Type: application/dns-udpwireformat' --data-binary @- https://cloudflare-dns.com/dns-query -o - | hexdump

{ [49 bytes data]
100    49  100    49    0     0    493      0 --:--:-- --:--:-- --:--:--   494
* Connection #0 to host cloudflare-dns.com left intact
0000000 ab cd 81 80 00 01 00 01 00 00 00 00 03 77 77 77
0000010 07 65 78 61 6d 70 6c 65 03 63 6f 6d 00 00 01 00
0000020 01 c0 0c 00 01 00 01 00 00 0a 8b 00 04 5d b8 d8
0000030 22
0000031

La fel, dar folosind JSON

$ curl 'https://cloudflare-dns.com/dns-query?ct=application/dns-json&name=example.com&type=AAAA'

{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": true,
  "CD": false,
  "Question": [
    {
      "name": "example.com.",
      "type": 1
    }
  ],
  "Answer": [
    {
      "name": "example.com.",
      "type": 1,
      "TTL": 1069,
      "data": "93.184.216.34"
    }
  ]
}

Evident, puține (dacă există) routere de acasă pot funcționa cu DNS astfel, dar asta nu înseamnă că suportul nu va apărea mâine - și, interesant, aici putem implementa cu ușurință lucrul cu DNS în aplicația noastră (ca deja va face Mozilla, doar pe serverele Cloudflare).

DNS peste TLS

În mod implicit, interogările DNS sunt trimise fără criptare. DNS prin TLS este o modalitate de a le trimite printr-o conexiune sigură. Cloudflare acceptă DNS prin TLS pe ​​portul standard 853, așa cum este prescris RFC7858. Aceasta utilizează un certificat emis pentru gazda cloudflare-dns.com, sunt acceptate TLS 1.2 și TLS 1.3.

Stabilirea unei conexiuni și lucrul cu protocolul merge cam așa:

  • Înainte de a stabili o conexiune la DNS, clientul stochează un hash SHA64 codificat în base256 al certificatului TLS al cloudflare-dns.com (numit SPKI)
  • Clientul DNS stabilește o conexiune TCP la cloudflare-dns.com:853
  • Clientul DNS inițiază procedura de strângere de mână TLS
  • În timpul strângerii de mână TLS, gazda cloudflare-dns.com își prezintă certificatul TLS.
  • Odată stabilită conexiunea TLS, clientul DNS poate trimite interogări DNS pe un canal securizat, ceea ce previne interceptarea și falsificarea cererilor și răspunsurilor.
  • Toate cererile DNS trimise printr-o conexiune TLS trebuie să respecte specificația conform trimiterea DNS prin TCP.

Exemplu de solicitare prin DNS prin TLS:

$ kdig -d @1.1.1.1 +tls-ca +tls-host=cloudflare-dns.com  example.com
;; DEBUG: Querying for owner(example.com.), class(1), type(1), server(1.1.1.1), port(853), protocol(TCP)
;; DEBUG: TLS, imported 170 system certificates
;; DEBUG: TLS, received certificate hierarchy:
;; DEBUG:  #1, C=US,ST=CA,L=San Francisco,O=Cloudflare, Inc.,CN=*.cloudflare-dns.com
;; DEBUG:      SHA-256 PIN: yioEpqeR4WtDwE9YxNVnCEkTxIjx6EEIwFSQW+lJsbc=
;; DEBUG:  #2, C=US,O=DigiCert Inc,CN=DigiCert ECC Secure Server CA
;; DEBUG:      SHA-256 PIN: PZXN3lRAy+8tBKk2Ox6F7jIlnzr2Yzmwqc3JnyfXoCw=
;; DEBUG: TLS, skipping certificate PIN check
;; DEBUG: TLS, The certificate is trusted.
;; TLS session (TLS1.2)-(ECDHE-ECDSA-SECP256R1)-(AES-256-GCM)
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 58548
;; Flags: qr rd ra; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 1

;; EDNS PSEUDOSECTION:
;; Version: 0; flags: ; UDP size: 1536 B; ext-rcode: NOERROR
;; PADDING: 408 B

;; QUESTION SECTION:
;; example.com.             IN  A

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

;; Received 468 B
;; Time 2018-03-31 15:20:57 PDT
;; From 1.1.1.1@853(TCP) in 12.6 ms

Această opțiune pare să fie mai potrivită pentru serverele DNS locale care servesc nevoile unei rețele locale sau ale unui singur utilizator. Adevărat, suportul pentru standard nu este foarte bun, dar să sperăm!

Două cuvinte de explicație despre ceea ce vorbim

Abrevierea DNS înseamnă Domain Name Service (așa că a spune „serviciu DNS” este oarecum redundant; acronimul conține deja cuvântul „serviciu”) și este folosită pentru a rezolva o sarcină simplă - pentru a înțelege ce adresă IP are un anumit nume de gazdă. De fiecare dată când o persoană face clic pe un link sau introduce o adresă în bara de adrese a browserului (de exemplu, ceva de genul „https://habrahabr.ru/post/346430/"), computerul unei persoane încearcă să-și dea seama ce server să trimită o solicitare pentru a primi conținutul unei pagini. În cazul habrahabr.ru, răspunsul de la DNS va conține o indicație a adresei IP a serverului web: 178.248.237.68, iar apoi browserul va încerca să contacteze serverul cu adresa IP specificată.

La rândul său, serverul DNS, după ce a primit solicitarea „care este adresa IP a gazdei numită habrahabr.ru?”, determină dacă știe ceva despre gazda specificată. Dacă nu, face o interogare către alte servere DNS din lume și, pas cu pas, încearcă să afle răspunsul la întrebarea adresată. Ca urmare, la găsirea răspunsului final, datele găsite sunt trimise către clientul încă în așteptare, plus că sunt stocate în cache-ul serverului DNS propriu-zis, ceea ce vă va permite să răspundeți la o întrebare similară mult mai rapid data viitoare.

O problemă comună este că, în primul rând, datele de interogare DNS sunt trimise în clar (ceea ce permite oricui cu acces la fluxul de trafic să izoleze interogările DNS și răspunsurile rezultate, apoi să le analizeze în propriile scopuri; acest lucru permite capacitatea pentru a viza publicitatea cu precizie pentru clientul DNS, iar asta este destul de mult!). În al doilea rând, unii furnizori de internet (nu vom arăta cu degetul, dar nu pe cei mai mici) tind să arate reclame în loc de una sau alta pagină solicitată (care este implementată foarte simplu: în loc de adresa IP specificată pentru o solicitare pentru numele gazdei). habranabr.ru unei persoane aleatorii În acest fel, se returnează adresa serverului web al furnizorului, unde este difuzată pagina care conține reclama). În al treilea rând, există furnizori de acces la Internet care implementează un mecanism pentru îndeplinirea cerințelor de blocare a site-urilor individuale prin înlocuirea răspunsurilor DNS corecte despre adresele IP ale resurselor web blocate cu adresa IP a serverului lor care conține pagini stub (ca urmare, accesul la astfel de site-uri devin considerabil mai complicate) sau la adresa serverului dumneavoastră proxy care efectuează filtrarea.

Probabil ar trebui să pui aici o poză de pe site http://1.1.1.1/, care servește pentru a descrie conexiunea la serviciu. Autorii, aparent, sunt complet încrezători în calitatea DNS-ului lor (cu toate acestea, este greu să ne așteptăm la ceva diferit de la Cloudflare):

Ne întâlnim cu serviciul de la Cloudflare la adresele 1.1.1.1 și 1.0.0.1, sau „raftul DNS public a sosit!”

Se poate înțelege complet Cloudflare, creatorul serviciului: își câștigă pâinea susținând și dezvoltând una dintre cele mai populare rețele CDN din lume (ale căror funcții includ nu numai distribuția de conținut, ci și găzduirea zonelor DNS) și, din dorinta celor , care nu știe multe, învață-i pe aceștia pe care nu-l cunosc, la asta unde să mergem pe rețeaua globală, destul de des suferă de blocarea adreselor serverului său de către nu vom spune cine - deci a avea un DNS care nu este influențat de „strigăte, fluiere și mâzgăliri” înseamnă mai puțin rău pentru afacerea lor pentru o companie. Iar avantajele tehnice (un lucru mic, dar frumos: în special, pentru clienții DNS Cloudflare gratuit, actualizarea înregistrărilor DNS ale resurselor găzduite pe serverele DNS ale companiei va fi instantanee) fac folosirea serviciului descris în postare și mai interesantă. .

Numai utilizatorii înregistrați pot participa la sondaj. Loghează-te, Vă rog.

Veți folosi noul serviciu?

  • Da, doar specificându-l în sistemul de operare și/sau pe router

  • Da, și voi folosi protocoale noi (DNS prin HTTP și DNS prin TLS)

  • Nu, am destule servere actuale (acesta este un furnizor public: Google, Yandex etc.)

  • Nu, nici nu știu ce folosesc acum

  • Eu folosesc propriul meu DNS recursiv cu un tunel SSL înaintea lor

Au votat 693 utilizatori. 191 utilizator s-a abținut.

Sursa: www.habr.com

Adauga un comentariu