Sissejuhatus

Kaasaegsed ettevĂ”tte sisu filtreerimise sĂŒsteemid tuntud tootjatelt nagu Cisco, BlueCoat, FireEye sarnanevad oma vĂ”imsamate kolleegidega - DPI sĂŒsteemidega, mida kohalikul tasandil laialdaselt juurutatakse. Nende ja teiste tööpĂ”himĂ”te seisneb siseneva ja vĂ€ljuva internetiliikluse kontrollimises ning mustade/valgete nimekirjade pĂ”hjal internetiĂŒhenduste keelamise otsuste tegemises. Kuna nii need kui ka teised tuginevad oma toimimisel sarnastele pĂ”himĂ”tetele, on kĂ€igud nende ĂŒletamiseks samuti sarnased.
Ăks tehnoloogiaid, mis vĂ”imaldab tĂ”husalt nii DPI-d kui ka ettevĂ”tte sĂŒsteeme ĂŒletada, on domeeni fronting tehnoloogia. Selle pĂ”hiolemus seisneb selles, et me pÀÀseme blokeeritud ressursile, kasutades teist, avalikku domeeni, millel on hea maine ja mida ei blokeeri mingisugune sĂŒsteem, nĂ€iteks google.com.
Selle tehnoloogia kohta on kirjutatud piisavalt palju artikleid ja toodud palju nĂ€iteid. Siiski pakuvad hiljuti populaarsust kogunud tehnoloogiad DNS-over-HTTPS ja encrypted-SNI, samuti uus TLS 1.3 protokolli versioon vĂ”imaluse kĂ€sitleda veel ĂŒht domeeni fronting varianti.
Selgitame vÀlja tehnoloogia
Alustame olulisemate terminite selgitamisest, et igaĂŒhel oleks arusaam, kes on kes ja miks on see vajalik. Mainisime mehhanismi eSNI, mille toimimist kĂ€sitletakse allpool. eSNI (encrypted Server Name Indication) mehhanism on SNI kaitstud versioon, mis on saadaval ainult TLS 1.3 protokollile. PĂ”hiolemus on krĂŒpteerida muu hulgas teave, millise domeeni poole pĂ€ring saadetakse.
NĂŒĂŒd vaatame eSNI mehhanismi toimimist praktikas.
Oletame, et meil on internetiresurss, mida blokeerib kaasaegne DPI lahendus (vÔtame nÀiteks tuntud torrent-tracker'i - rutracker.nl). Kui proovime pÀÀseda torrent-tracker'i saidile - nÀeme teenusepakkuja standardset teavitust, et ressurss on blokeeritud:

RKNi saidil on see domeen tÔepoolest stopp-nimekirjades:

Whois pÀringu pÔhjal on nÀha, et domeen on 'peidetud' pilvprovideri Cloudflare'i taha.

Kuid erinevalt RKNi "spetsialistidest" ei hakanud Beeline'i rohkem tehniliselt haritud töötajad (vĂ”i siis meie tuntud regulaatori kibeda kogemuse tĂ”ttu) lihtsalt IP-aadressi jĂ€rgi veebisaiti blokeerima, vaid lisasid bloki nimekirja just domeeninime. Sellele on lihtne veenduda, kui vaadata, millised veel domeenid peituvad selle sama IP-aadress, kĂŒlastada ĂŒhte neist ja nĂ€ha, et ligipÀÀs ei ole blokeeritud:

Kuidas see siis nii juhtub? Kuidas pakkuja DPI teab, millisele domeenile minu brauser suundub, kui kÔik suhtlused toimuvad https-protokolli kaudu, ja Beeline'i https-sertifikaatide asendamist me seni ei ole tÀheldanud? Kas ta on selgeltnÀgija vÔi jÀlgib keegi mind?
Proovime sellele kĂŒsimusele vastata, vaadates liiklust lĂ€bi Wiresharki

Kuvamisel on nĂ€ha, et kĂ”igepealt saab brauser serveri IP-aadressi DNS-i kaudu, seejĂ€rel toimub standardne TCP-kĂ€epigistus sihtserveriga ja siis pĂŒĂŒab brauser luua ssl-ĂŒhendust serveriga. Selleks edastab ta paketi SSL Client Hello, milles on originaaldomeeni nimi avatud kujul. See vĂ€li on vajalik Cloudflare'i frontend-serverile, et Ă”igesti marsruutida ĂŒhendus. Just siin pĂŒĂŒab meid kinni pakkuja DPI, katkestades meie ĂŒhenduse. Me ei saa pakkuja poolt mingeid blokeeringuteavet ja nĂ€eme tavalist brauseri viga, nagu oleks sait vĂ€lja lĂŒlitatud vĂ”i ei töötaks lihtsalt:

NĂŒĂŒd aktiveerime brauseris eSNI mehhanismi, nagu on kirjas juhendis Firefox :
Selleks avame Firefoxi konfigureerimise lehe about:config ja aktiveerime jÀrgmised seaded:
network.trr.mode = 2;
network.trr.uri = https://mozilla.cloudflare-dns.com/dns-query
network.security.esni.enabled = true
PÀrast seda kontrollime seadete Ôigsust Cloudflare'i saidil lingil ja proovime veel kord meie torrent-trackeriga sama trikki.

Voila. Meie lemmik-tracker avanes, ilma igasuguste VPN-ide ja proksiserveriteta. Vaadakem nĂŒĂŒd Wiresharki liiklusdampi, mis juhtus.

Seekord ei sisalda ssl client hello pakett sihtdomeeni selgelt, vaid paketi sees on uus vĂ€li â encrypted_server_name â just seal on vÀÀrtus rutracker.nl ja seda vĂ€lja saab dekrĂŒpteerida ainult Cloudflare'i frontend-server. Kui nii on, siis ei jÀÀ pakkuja DPI-le muud ĂŒle, kui kĂ€si pesta ja sellist liiklust lubada. Ja teisi ĆĄifreerimisvĂ”imalusi ei olegi.
Nii et, kuidas tehnoloogia brauseris töötab â me vaatasime. NĂŒĂŒd proovime seda rakendada konkreetsematesse ja huvitavatesse asjadesse. Alguseks Ă”petame, kuidas kasutada seda sama curl eSNI abil TLS 1.3-tal, ja vaatame, kuidas toimib domeenifronting eSNI pĂ”hjal.
Domeenifronting eSNI-ga
Kuna curl kasutab https-protokolliga ĂŒhendamiseks standardset openssl teeki, peame kĂ”igepealt tagama eSNI toe just seal. OpenSSL-i master-harudes pole eSNI toe jaoks veel olemas, seega peame alla laadima spetsiaalse avatud haru openssl-ist, selle kompileerima ja installima.
Kloonime repot gitHubist ja kompileerime nagu tavaliselt:
$ git clone https://github.com/sftcd/openssl
$ cd openssl
$ ./config
$ make
$ cd esnistuff
$ make
SeejÀrel kloonime curl'i repot ja konfigureerime selle kompileerimise, kasutades meie koostatud openssl teeki:
$ cd $HOME/code
$ git clone https://github.com/niallor/curl.git curl-esni
$ cd curl-esni
$ export LD_LIBRARY_PATH=/opt/openssl
$ ./buildconf
$ LDFLAGS="-L/opt/openssl" ./configure --with-ssl=/opt/openssl --enable-esni --enable-debug
Siin on oluline Ă”igesti mÀÀrata kĂ”ik kataloogid, kus openssl asub (meie puhul â see on /opt/openssl/) ja veenduda, et konfiguratsiooniprotsess ei sisaldaks vigu.
Juhul kui konfiguratsioon Ă”nnestub â nĂ€eme rida:
WARNING: esni ESNI enabled but marked EXPERIMENTAL. Use with caution!
$ makePÀrast paketi edukat koostamist kasutame openssl-ist saadud spetsiaalset bash-faili curl'i seadistamiseks ja kÀivitamiseks. Kopeerime selle curl'i katalooge mugavuse huvides:
cp /opt/openssl/esnistuff/curl-esni ja sooritame testimise https-pÀringu cloudflare serverisse, salvestades samal ajal DNS ja TLS paketid Wireshark'i.
$ ESNI_COVER="www.hello-rkn.ru" ./curl-esni https://cloudflare.com/Serveri vastuses koos hulga silumisinfoga openssl'ist ja curl'ist saame HTTP vastuse koodiga 301 cloudflare'ilt.
HTTP/1.1 301 Moved Permanently
<Date: Sun, 03 Nov 2019 13:12:55 GMT
<Transfer-Encoding: chunked
<Connection: keep-alive
<Cache-Control: max-age=3600
<Expires: Sun, 03 Nov 2019 14:12:55 GMT
<Location: https://www.cloudflare.com/
mis tÔendab, et meie pÀring on edukalt toimetatud sihtserverisse, kuulatud ja töödeldud.
NĂŒĂŒd vaatame liikluse dumpi wireshark'is, st mida nĂ€gi antud juhul teenuseliini DPI.

On nĂ€ha, et esmalt pöördus curl DNS-serveri poole, et saada Cloudflare'i serveri avalikke eSNI vĂ”tmeid â TXT DNS pĂ€ring _esni.cloudflare.com (pakett nr 13). SeejĂ€rel saatis curl openssl-raamatukogu abil TLS 1.3 pĂ€ringu Cloudflare'i serverisse, kus SNI vĂ€li oli krĂŒpteeritud eelnevalt saadud avaliku vĂ”tmega (pakett nr 22). Kuid peale eSNI vĂ€lja sisaldas SSL-hello pakett ka tavalist avatud SNI vĂ€lja, mille vĂ”ime mÀÀrata suvalises jĂ€rjekorras (antud juhul â www.hello-rkn.ru).
Seda avatud SNI vĂ€lja ei arvestatud Cloudflare'i serverite poolt ja see oli vaid varjamine teenusepakkuja DPI jaoks. Cloudflare'i server aktsepteeris meie ssl-hello paketti, dekrĂŒpteeris eSNI, eraldas sealt originaalse SNI ja kĂ€sitles seda nagu mitte midagi (tehtud oli tĂ€pselt nii, nagu eSNI loomisel plaanitud).
Ainus, mille kĂŒlge siin DPI vaatenurgast kinni hakata, on esmase DNS pĂ€ringu tegemine _esni.cloudflare.com. Kuid me tegime DNS pĂ€ringu avatud ainult selleks, et nĂ€idata, kuidas see mehhanism seestpoolt töötab.
Kuna DPI alt lĂ”plikult pĂ”randat jalge alt vĂ€lja tĂ”mmata, kasutame juba mainitud DNS-over-HTTPS mehhanismi. VĂ€ike selgitus - DOH - protokoll, mis vĂ”imaldab kaitsta 'mees keset' rĂŒnnaku eest, edastades DNS-pĂ€ringu HTTPS protokolli kaudu.
Teeme pÀringu uuesti, kuid seekord saame avalikud eSNI vÔtmed HTTPS protokolli kaudu, mitte DNS-i kaudu:
ESNI_COVER="www.hello-rkn.ru" DOH_URL=https://mozilla.cloudflare-dns.com/dns-query ./curl-esni https://cloudflare.com/PĂ€ringu liikluse dump on esitatud alloleval ekraanipildil:

On nĂ€ha, et esmalt pöördub curl mozilla.cloudflare-dns.com serveri poole DoH protokolli kaudu (HTTPS ĂŒhendus serveriga 104.16.249.249), et saada SNI krĂŒpteerimiseks vajalikke avalikke vĂ”tmeid, ja seejĂ€rel pĂ€ring suunatakse sihtserverisse, varjates end samal ajal domeeniga. www.hello-rkn.ru.
Peale eespool nimetatud DoH resolveri mozilla.cloudflare-dns.com saame kasutada ka teisi populaarseid DoH teenuseid, nÀiteks kurikuulsa kurjuse korporatsiooni teenuseid.
Teeme sellise pÀringu:
ESNI_COVER="www.kremlin.ru" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/Ja saame vastuse:
< HTTP/1.1 301 Moved Permanently
< Date: Sun, 03 Nov 2019 14:10:22 GMT
< Content-Type: text/html
< Transfer-Encoding: chunked
< Connection: keep-alive
< Set-Cookie: __cfduid=da0144d982437e77b0b37af7d00438b1a1572790222; expires=Mon, 02-Nov-20 14:10:22 GMT; path=/; domain=.rutracker.nl; HttpOnly; Secure
< Location: https://rutracker.nl/forum/index.php
< CF-Cache-Status: DYNAMIC
< Expect-CT: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
< Server: cloudflare
< CF-RAY: 52feee696f42d891-CPH

Antud juhul pöördusime blokeeritud serveri rutracker.nl poole, kasutades DoH-resolvert dns.google (siin pole trĂŒkiviga, nĂŒĂŒd on kuulsa korporatsiooni oma tippdomeen) ja varjasime end teise domeeni taha, mille blokeerimine on rangelt keelatud kĂ”igile DPI-dele surmaohuga. Vastusest vĂ”ib aru saada, et meie pĂ€ring töötati edukalt ĂŒles.
Lisakontrollina, et veenduda, et teenusepakkuja DPI reageerib avatud SNI-le, mida me varjatuna edastame â saame saata pĂ€ringu rutracker.nl, varjades end mingi muu keelatud ressursi, nĂ€iteks teise "head" torrent-kerija taha:
$ ESNI_COVER="rutor.info" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/Me ei saa serverilt vastust, kuna meie pĂ€ring blokeeritakse DPI-sĂŒsteemi poolt.
VÀike jÀreldus esimesele osale
Nii et oleme suutnud demonstreerida eSNI toimivust openssl'i ja curl'i abil ning kontrollida eSNI-pĂ”histe domeenifrontide tööd. Sarnasel viisil saame kohandada oma lemmikinstrumente, mis kasutavad openssl'i teeki, et töötada "varjatuna" teiste domeenide taga. Rohkem sellest â meie jĂ€rgnevates artiklites.
Allikas: habr.com
