Incontriamo il servizio di Cloudflare agli indirizzi 1.1.1.1 e 1.0.0.1, ovvero "lo scaffale DNS pubblico è arrivato!"

Incontriamo il servizio di Cloudflare agli indirizzi 1.1.1.1 e 1.0.0.1, ovvero "lo scaffale DNS pubblico è arrivato!"

Azienda Cloudflare presentato DNS pubblici agli indirizzi:

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

Si dice che la politica sia "Privacy first" in modo che gli utenti possano stare tranquilli riguardo al contenuto delle loro richieste.

Il servizio è interessante in quanto, oltre ai soliti DNS, offre la possibilità di utilizzare le tecnologie DNS-over-TLS и DNS-over-HTTPS, che impedirà notevolmente ai fornitori di intercettare le tue richieste lungo il percorso delle richieste e di raccogliere statistiche, monitorare e gestire la pubblicità. Cloudflare sostiene che la data dell'annuncio (1 aprile 2018, ovvero 04/01 nella notazione americana) non è stata scelta a caso: in quale altro giorno dell'anno verranno presentate le “quattro unità”?

Poiché il pubblico di Habr è tecnicamente esperto, la sezione tradizionale "perché hai bisogno del DNS?" Lo metterò alla fine del post, ma qui dirò cose più utili dal punto di vista pratico:

Come utilizzare il nuovo servizio?

La cosa più semplice è specificare gli indirizzi del server DNS sopra indicati nel tuo client DNS (o come upstream nelle impostazioni del server DNS locale che utilizzi). Ha senso sostituire i soliti valori DNS di Google (8.8.8.8, ecc.), o leggermente meno comune Server DNS pubblici Yandex (77.88.8.8 e altri simili) ai server di Cloudflare: decideranno per te, ma parla per un principiante programmare velocità di risposta, secondo la quale Cloudflare è più veloce di tutti i concorrenti (chiarirò: le misurazioni sono state effettuate da un servizio di terze parti e la velocità per un cliente specifico, ovviamente, può differire).

Incontriamo il servizio di Cloudflare agli indirizzi 1.1.1.1 e 1.0.0.1, ovvero "lo scaffale DNS pubblico è arrivato!"

È molto più interessante lavorare con nuove modalità in cui la richiesta vola al server tramite una connessione crittografata (in effetti, la risposta viene restituita attraverso di essa), le citate DNS-over-TLS e DNS-over-HTTPS. Sfortunatamente, non sono supportati “out of the box” (gli autori ritengono che ciò sia “ancora”), ma non è difficile organizzare il loro lavoro nel tuo software (o anche nel tuo hardware):

DNS su HTTP (DoH)

Come suggerisce il nome, la comunicazione avviene tramite un canale HTTPS, il che significa

  1. la presenza di un punto di atterraggio (endpoint): si trova all'indirizzo https://cloudflare-dns.com/dns-queryE
  2. un client che può inviare richieste e ricevere risposte.

Le richieste possono essere nel formato DNS Wireformat definito in RFC1035 (inviato utilizzando i metodi POST e GET HTTP), oppure in formato JSON (utilizzando il metodo GET HTTP). Per me personalmente, l'idea di effettuare richieste DNS tramite richieste HTTP sembrava inaspettata, ma c'è una parte razionale in essa: una richiesta del genere passerà molti sistemi di filtraggio del traffico, l'analisi delle risposte è abbastanza semplice e la generazione di richieste è ancora più semplice. Le solite librerie e protocolli sono responsabili della sicurezza.

Richiedi esempi, direttamente dalla documentazione:

Richiesta GET in formato 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

Richiesta POST in formato 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

Lo stesso ma usando 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"
    }
  ]
}

Ovviamente, un raro (se non almeno uno) router domestico può funzionare con DNS in questo modo, ma ciò non significa che il supporto non apparirà domani - e, cosa interessante, qui possiamo implementare del tutto il lavoro con DNS nella nostra applicazione (come già realizzerò Mozilla, solo sui server Cloudflare).

DNS su TLS

Per impostazione predefinita, le query DNS vengono trasmesse senza crittografia. DNS su TLS è un modo per inviarli tramite una connessione sicura. Cloudflare supporta DNS su TLS sulla porta standard 853 come prescritto RFC7858. Utilizza un certificato emesso per l'host cloudflare-dns.com, sono supportati TLS 1.2 e TLS 1.3.

Stabilire una connessione e lavorare secondo il protocollo avviene in questo modo:

  • Prima di stabilire una connessione DNS, il client memorizza un hash SHA64 con codifica base256 del certificato TLS di cloudflare-dns.com (chiamato SPKI)
  • Il client DNS stabilisce una connessione TCP a cloudflare-dns.com:853
  • Il client DNS avvia l'handshake TLS
  • Durante il processo di handshake TLS, l'host cloudflare-dns.com presenta il suo certificato TLS.
  • Una volta stabilita una connessione TLS, il client DNS può inviare query DNS su un canale sicuro, che impedisce che richieste e risposte vengano intercettate e falsificate.
  • Tutte le query DNS inviate tramite una connessione TLS devono essere conformi a invio DNS su TCP.

Un esempio di richiesta tramite DNS su 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

Questa opzione sembra funzionare meglio per i server DNS locali che soddisfano le esigenze di una rete locale o di un singolo utente. È vero, con il supporto dello standard non è molto buono, ma - speriamo!

Due parole di spiegazione di cosa tratta la conversazione

L'abbreviazione DNS sta per Domain Name Service (dire quindi "servizio DNS" è un po' ridondante, l'abbreviazione contiene già la parola "servizio") e viene utilizzata per risolvere un compito semplice: capire quale indirizzo IP ha un particolare nome host. Ogni volta che una persona fa clic su un collegamento o inserisce un indirizzo nella barra degli indirizzi del browser (ad esempio, qualcosa come "https://habrahabr.ru/post/346430/"), il computer umano sta cercando di capire a quale server inviare una richiesta per ottenere il contenuto della pagina. Nel caso di habrahabr.ru, la risposta del DNS conterrà l'indicazione dell'indirizzo IP del server web: 178.248.237.68, quindi il browser tenterà già di contattare il server con l'indirizzo IP specificato.

A sua volta, il server DNS, dopo aver ricevuto la richiesta "qual è l'indirizzo IP dell'host chiamato habrahabr.ru?", determina se sa qualcosa sull'host specificato. In caso contrario, effettua una richiesta ad altri server DNS nel mondo e, passo dopo passo, cerca di trovare la risposta alla domanda posta. Di conseguenza, dopo aver trovato la risposta finale, i dati trovati vengono inviati al client che li sta ancora aspettando, inoltre vengono archiviati nella cache del server DNS stesso, che ti consentirà di rispondere a una domanda simile molto più velocemente la prossima volta.

Un problema comune è che, in primo luogo, i dati delle query DNS vengono trasmessi in chiaro (il che dà a chiunque abbia accesso al flusso di traffico la possibilità di isolare le query DNS e le risposte che riceve e quindi analizzarle per i propri scopi; questo dà la capacità di indirizzare gli annunci con precisione per un client DNS, il che è parecchio!). In secondo luogo, alcuni ISP (non punteremo il dito, ma non i più piccoli) tendono a mostrare annunci invece dell'una o dell'altra pagina richiesta (che è implementata in modo abbastanza semplice: invece dell'indirizzo IP specificato per una query da habranabr.ru nome host, una persona a caso. Pertanto, viene restituito l'indirizzo del server web del provider, dove viene servita la pagina contenente l'annuncio). In terzo luogo, ci sono fornitori di accesso a Internet che implementano un meccanismo per soddisfare i requisiti per il blocco di singoli siti sostituendo le risposte DNS corrette sugli indirizzi IP delle risorse web bloccate con l'indirizzo IP del loro server contenente le pagine stub (di conseguenza, l'accesso a tali siti notevolmente più complicati) o all'indirizzo del tuo server proxy che esegue il filtraggio.

Probabilmente dovrebbe essere un'immagine dal sito. http://1.1.1.1/, utilizzato per descrivere la connessione al servizio. Gli autori sembrano essere abbastanza fiduciosi nella qualità dei loro DNS (tuttavia, è difficile aspettarsi qualcos'altro da Cloudflare):

Incontriamo il servizio di Cloudflare agli indirizzi 1.1.1.1 e 1.0.0.1, ovvero "lo scaffale DNS pubblico è arrivato!"

Si può comprendere appieno Cloudflare, il creatore del servizio: si guadagnano il pane mantenendo e sviluppando una delle reti CDN più popolari al mondo (le cui funzioni includono non solo la distribuzione di contenuti, ma anche l'hosting di zone DNS) e, a causa di il desiderio di quelli, chi non è esperto, insegna quelli chi non conoscono, a tale dove andare nella rete globale, molto spesso soffre di blocco degli indirizzi dei propri server non diciamo chi - quindi avere un DNS che non sia intaccato da “urla, fischi e scarabocchi” per l'azienda significa meno danni al proprio business. E i vantaggi tecnici (insignificanti, ma carini: in particolare, per i clienti del DNS gratuito Cloudflare, l'aggiornamento dei record DNS delle risorse ospitate sui server DNS dell'azienda sarà istantaneo) rendono ancora più interessante l'utilizzo del servizio descritto nel post.

Solo gli utenti registrati possono partecipare al sondaggio. AccediPer favore.

Utilizzerai il nuovo servizio?

  • Sì, semplicemente specificandolo nel sistema operativo e/o sul router

  • Sì, e utilizzerò nuovi protocolli (DNS su HTTP e DNS su TLS)

  • No, ho abbastanza server attuali (questo è un fornitore pubblico: Google, Yandex, ecc.)

  • No, non so nemmeno cosa sto usando in questo momento

  • Utilizzo il mio DNS ricorsivo con un tunnel SSL verso di loro

693 utenti hanno votato. 191 utente si è astenuto.

Fonte: habr.com

Aggiungi un commento