
Het bedrijf Cloudflare heeft geïntroduceerd publieke DNS op de adressen:
- 1.1.1.1
- 1.0.0.1
- 2606:4700:4700::1111
- 2606:4700:4700::1001
Er wordt beweerd dat het beleid "Privacy first" wordt toegepast, zodat gebruikers zich geen zorgen hoeven te maken over de inhoud van hun verzoeken.
De service is interessant omdat het, naast de gebruikelijke DNS, de mogelijkheid biedt om technologieën te gebruiken zoals DNS-over-TLS en DNS-over-HTTPS, wat het voor providers moeilijker maakt om onderweg uw verzoeken te onderscheppen — en statistieken te verzamelen, advertenties te volgen en te beheren. Cloudflare beweert dat de datum van aankondiging (1 april 2018, of 04/01 in Amerikaanse notatie) niet toevallig werd gekozen: op welke andere dag van het jaar zou je "vier enen" presenteren?
Aangezien het publiek van Habr technisch onderlegd is, plaats ik de traditionele sectie "waarom is DNS nodig?" aan het einde van de post, en zal ik hier praktisch nuttiger dingen uiteenzetten:
Hoe gebruik je de nieuwe service?
Het eenvoudigste — in uw DNS-client (of als upstream in de instellingen van uw lokale DNS-server) geeft u de bovenstaande DNS-adressen op.servers. Heeft het zin om de bekende waarden van Google's DNS (8.8.8.8 enz.), of iets minder gangbare van de Yandex publieke DNS-servers (77.88.8.8 en gelijksoortig) te vervangen door servers van Cloudflare — dat blijft aan u belaten, maar voor nieuwkomers spreekt het schema van de responssnelheden, waaruit blijkt dat Cloudflare sneller werkt dan alle concurrenten (ik moet opmerken: de metingen zijn gedaan door een derdenservice, en de snelheid tot een specifieke klant kan natuurlijk verschillen).

Veel interessanter is het werken met de nieuwe modi, waarin het verzoek wordt gestuurd via server een versleutelde verbinding (het antwoord wordt trouwens ook op dezelfde manier teruggestuurd), genoemd DNS-over-TLS en DNS-over-HTTPS. Helaas worden ze "out of the box" niet ondersteund (de auteurs geloven dat dit "voorlopig" is), maar het is niet moeilijk om hun werking in uw software (of zelfs op uw eigen apparatuur) te organiseren:
DNS over HTTPs (DoH)
Zoals de naam al aangeeft, vindt de communicatie plaats bovenop een HTTPS-kanaal, wat inhoudt
- dat er een endpoint moet zijn — deze bevindt zich op het adres https://cloudflare-dns.com/dns-query, en
- een client die in staat is om verzoeken te sturen en antwoorden te ontvangen.
Verzoeken kunnen ofwel in het DNS Wireformat worden gedaan, zoals gedefinieerd in RFC1035 (verzenden met HTTP-methoden POST en GET), of in JSON-formaat (gebruikmaakt van de HTTP-methode GET). Persoonlijk leek het idee om DNS-verzoeken via HTTP-verzoeken te doen mij onverwacht, maar er is een rationele kern in: zo'n verzoek zal veel systeemfilters voor verkeer omzeilen, het parseren van antwoorden is vrij eenvoudig, en het vormen van verzoeken is nog eenvoudiger. Voor veiligheid zorgen vertrouwde bibliotheken en protocollen.
Voorbeelden van verzoeken, direct uit de documentatie:
GET-verzoek in DNS Wireformat
$ curl -v "https://cloudflare-dns.com/dns-query?ct=application/dns-udpwireformat&dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" | hexdump
* HTTP2 in gebruik, server ondersteunt multi-use
* Verbindingstoestand gewijzigd (HTTP/2 bevestigd)
* HTTP/2-gegevens in streambuffer kopiëren naar verbindingsbuffer na upgrade: len=0
* Gebruik makend van Stream ID: 1 (eenvoudig handvat 0x7f968700a400)
GET /dns-query?ct=application/dns-udpwireformat&dns=q80BAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB HTTP/2
Host: cloudflare-dns.com
User-Agent: curl/7.54.0
Accept: */*
* Verbindingstoestand gewijzigd (MAX_CONCURRENT_STREAMS bijgewerkt)!
HTTP/2 200
datum: vr, 23 mrt 2018 05:14:02 GMT
content-type: application/dns-udpwireformat
content-length: 49
cache-control: max-age=0
set-cookie: __cfduid=dd1fb65f0185fadf50bbb6cd14ecbc5b01521782042; expires=za, 23-mar-19 05:14:02 GMT; pad=/; domein=.cloudflare.com; HttpOnly
server: cloudflare-nginx
cf-ray: 3ffe69838a418c4c-SFO-DOG
{ [49 bytes data]
100 49 100 49 0 0 493 0 --:--:-- --:--:-- --:--:-- 494
* Verbinding #0 met host cloudflare-dns.com bleef 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
POST-verzoek in 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
* Verbinding #0 met host cloudflare-dns.com bleef 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
Hetzelfde, maar met gebruik van 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"
}
]
}
Overduidelijk, dat zeldzame (als er überhaupt één is) thuisrouter zo werkt met DNS, maar dat betekent niet dat ondersteuning morgen niet kan verschijnen — en wat interessant is, hier kunnen we behoorlijk goed DNS-werking in onze applicatie implementeren (zoals al) Mozilla van plan is, precies op de servers van Cloudflare).
DNS over TLS
Standaard worden DNS-verzoeken verzonden zonder encryptie. DNS over TLS is een manier om deze over een beveiligde verbinding te verzenden. Cloudflare ondersteunt DNS over TLS op de standaardpoort 853, zoals voorgeschreven. RFC7858. Hierbij wordt een certificaat gebruikt dat is uitgegeven voor de host cloudflare-dns.com, en TLS 1.2 en TLS 1.3 worden ondersteund.
De verbinding en werking via het protocol verlopen ongeveer als volgt:
- Voor de totstandkoming van de verbinding houdt de DNS-client de base64-gecodeerde SHA256-hash van het TLS-certificaat van cloudflare-dns.com (de SPKI genoemd) vast.
- De DNS-client maakt een TCP-verbinding met cloudflare-dns.com:853
- De DNS-client initieert de TLS-handshakeprocedure.
- Tijdens de TLS-handshake presenteert de host cloudflare-dns.com zijn TLS-certificaat.
- Zodra de TLS-verbinding is opgezet, kan de DNS-client DNS-verzoeken verzenden via het beveiligde kanaal, wat afluisteren en vervalsing van verzoeken en antwoorden voorkomt.
- Alle DNS-verzoeken die via de TLS-verbinding worden verzonden, moeten voldoen aan de specificatie voor verzending van DNS over TCP..
Voorbeeld van een verzoek via DNS over TLS:
$ kdig -d @1.1.1.1 +tls-ca +tls-host=cloudflare-dns.com example.com
;; DEBUG: Vraagt om eigenaar(example.com.), klasse(1), type(1), server(1.1.1.1), poort(853), protocol(TCP)
;; DEBUG: TLS, geïmporteerde 170 systeemcertificaten
;; DEBUG: TLS, ontvangen certificaathierarchie:
;; 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, overslaan certificaat PIN-controle
;; DEBUG: TLS, Het certificaat is vertrouwd.
;; TLS-sessie (TLS1.2)-(ECDHE-ECDSA-SECP256R1)-(AES-256-GCM)
;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 58548
;; Vlaggen: qr rd ra; QUERY: 1; ANTWOORD: 1; AUTHORITEIT: 0; EXTRA: 1
;; EDNS PSEUDOSECTION:
;; Versie: 0; vlaggen: ; UDP-grootte: 1536 B; ext-rcode: NOERROR
;; PADDING: 408 B
;; VRAGENSECTIE:
;; example.com. IN A
;; ANTWOORDSECTIE:
example.com. 2347 IN A 93.184.216.34
;; Ontvangen 468 B
;; Tijd 2018-03-31 15:20:57 PDT
;; Van 1.1.1.1@853(TCP) in 12.6 ms
Deze optie lijkt beter geschikt voor lokale DNS-servers die de behoeften van een lokaal netwerk of één gebruiker bedienen. De ondersteuning van de standaard is echter niet echt goed, maar laten we hopen!
Twee woorden ter toelichting, waar het over gaat.
De afkorting DNS staat voor Domein Naamdienst (dus het is een beetje overbodig om 'DNS-dienst' te zeggen, omdat het woord 'dienst' al in de afkorting zit), en het wordt gebruikt om een eenvoudige taak op te lossen - te begrijpen welk IP-adres een specifieke hostnaam heeft. Iedere keer dat iemand op een link klikt of een adres in de adresbalk van de browser invoert (bijvoorbeeld iets als 'https://habrahabr.ru/post/346430/Wanneer een computer een verzoek indient om pagina-inhoud, probeert hij te begrijpen naar welke server het verzoek moet worden gestuurd. In het geval van habrahabr.ru bevat het antwoord van DNS de aanwijzing naar het IP-adres van de webserver: 178.248.237.68, waarna de browser probeert verbinding te maken met de server op dat IP-adres.
De DNS-server, die het verzoek ontvangt met de vraag 'wat is het IP-adres van de host met de naam habrahabr.ru?', bepaalt of hij iets weet over de opgegeven host. Als dat niet zo is, doet hij een aanvraag bij andere DNS-servers over de hele wereld en probeert stap voor stap het antwoord op de gestelde vraag te achterhalen. Uiteindelijk, wanneer het definitieve antwoord is gevonden, worden de gegevens verzonden naar de wachtende client, en bovendien worden ze opgeslagen in de cache van de DNS-server, waardoor de volgende keer op dezelfde vraag veel sneller kan worden geantwoord.
Een veelvoorkomend probleem is dat, ten eerste, gegevens van DNS-aanvragen in open tekst worden verzonden (wat iedereen die toegang heeft tot de datastroom in staat stelt om DNS-aanvragen en ontvangen antwoorden te extraheren en vervolgens te analyseren voor hun eigen doeleinden; dit maakt advertentietargeting met precisie voor de DNS-client mogelijk, wat aanzienlijk is!). Ten tweede hebben sommige internetproviders (we wijzen niet met de vinger, maar het zijn niet de kleinste) de neiging om advertenties te tonen in plaats van de opgevraagde pagina (wat vrij eenvoudig wordt gerealiseerd: in plaats van het opgegeven IP-adres voor het verzoek aan de hostnaam habranabr.ru, wordt willekeurig het adres van de webserver van de provider teruggegeven, waar een pagina met advertenties wordt weergegeven). Ten derde zijn er internettoegangproviders die een mechanisme implementeren om aan de blokkeringseisen van afzonderlijke sites te voldoen door de juiste DNS-antwoorden voor de IP-adressen van geblokkeerde webresources te vervangen door het IP-adres van hun server die pagina's met placeholders bevat (waardoor de toegang tot dergelijke sites aanzienlijk wordt bemoeilijkt), of door het adres van hun proxyserver die filtering uitvoert.
Hier moet waarschijnlijk een afbeelding van de website worden geplaatst http://1.1.1.1/, die dient ter beschrijving van de verbinding met de service. De auteurs zijn, zoals je kunt zien, totaal overtuigd van de kwaliteit van hun DNS (hoewel je van Cloudflare ook niet anders zou verwachten):

Het is goed te begrijpen dat Cloudflare, de maker van de dienst, zijn brood verdient door een van de populairste CDN-netwerken ter wereld te onderhouden en uit te breiden (waarbij niet alleen contentdistributie, maar ook DNS-zonehosting behoort tot de functies), en, vanuit de wens van degenen die niet zo goed op de hoogte zijn, hen te onderwijzen,ze niet kennen, in wat,waarheen te gaan in het wereldwijde netwerk, vaak te lijden heeft van de blokkering van IP-adressen van hun servers door laten we niet zeggen wie, dus het hebben van DNS dat niet onderhevig is aan 'geschreeuw, fluitjes en aantekeningen', betekent voor het bedrijf minder schade aan hun bedrijf. De technische voordelen (het zijn kleine dingen, maar fijn: voor klanten van Cloudflare's gratis DNS zal de update van DNS-records van resources die op de DNS-servers van het bedrijf zijn geplaatst, onmiddellijk zijn) maken het gebruik van de in de post beschreven service nog interessanter. Zult u de nieuwe dienst gebruiken?
Alleen geregistreerde gebruikers kunnen deelnemen aan de enquête. Log in, alstublieft.
Ja, gewoon ingesteld in het besturingssysteem en/of op de router
- Ja, en ik zal gebruik maken van de nieuwe protocollen (DNS over HTTPS en DNS over TLS)
- Nee, ik heb genoeg aan de huidige servers (dit is een publieke provider: Google, Yandex, enz.)
- Nee, ik weet zelfs niet welke ik nu gebruik
- Ik gebruik mijn eigen recursieve DNS met een SSL-tunnel naar hen
- 693 gebruikers hebben gestemd. 191 gebruikers hebben zich onthouden.
Synthese als een van de methoden om de prestaties van PostgreSQL te verbeteren
Bron: habr.com
