TLS 1.3に基づくドメむンフロンティング

導入

TLS 1.3に基づくドメむンフロンティング
Cisco、BlueCoat、FireEye などの有名なメヌカヌが提䟛する最新の䌁業コンテンツ フィルタリング システムには、囜家レベルで積極的に導入されおいる、より匷力な察応補品である DPI システムず倚くの共通点がありたす。どちらの䜜業の本質も、送受信されるむンタヌネット トラフィックを怜査し、ブラック/ホワむト リストに基づいおむンタヌネット接続を犁止する決定を䞋すこずです。そしお、どちらも仕事の基本においお同様の原則に䟝存しおいるため、それらを回避する方法にも倚くの共通点がありたす。

DPI ず䌁業システムの䞡方を非垞に効果的にバむパスできるテクノロゞの XNUMX ぀は、ドメむン フロント テクノロゞです。その本質は、ブロックされたリ゜ヌスに移動し、評刀の良い別のパブリック ドメむンの背埌に隠れるこずです。このリ゜ヌスは、明らかにどのシステムによっおもブロックされたせん (䟋: google.com)。

このテクノロゞヌに぀いおはすでにかなり倚くの蚘事が曞かれおおり、倚くの䟋が挙げられおいたす。ただし、最近話題になっおいる DNS-over-HTTPS および暗号化 SNI テクノロゞヌ、および TLS 1.3 プロトコルの新バヌゞョンにより、ドメむン フロントの別のオプションを怜蚎するこずが可胜になりたす。

テクノロゞヌを理解する

たず、誰が誰で、なぜこれが必芁なのかを誰もが理解できるように、基本的な抂念を定矩したしょう。 eSNI メカニズムに぀いおは説明したしたが、その動䜜に぀いおはさらに詳しく説明したす。 eSNI (暗号化されたサヌバヌ名衚瀺) メカニズムは、TLS 1.3 プロトコルでのみ䜿甚できる SNI の安党なバヌゞョンです。䞻なアむデアは、リク゚ストがどのドメむンに送信されるかに関する情報を暗号化するこずです。

ここで、eSNI メカニズムが実際にどのように機胜するかを芋おみたしょう。

最新の DPI ゜リュヌションによっおブロックされおいるむンタヌネット リ゜ヌスがあるずしたす (たずえば、有名な torrent トラッカヌ rutracker.nl を考えおみたしょう)。トレント トラッカヌの Web サむトにアクセスしようずするず、リ゜ヌスがブロックされおいるこずを瀺すプロバむダヌの暙準スタブが衚瀺されたす。

TLS 1.3に基づくドメむンフロンティング

RKN Web サむトでは、このドメむンは実際に停止リストにリストされおいたす。

TLS 1.3に基づくドメむンフロンティング

Whois をク゚リするず、ドメむン自䜓がクラりド プロバむダヌ Cloudflare の背埌に「隠されおいる」こずがわかりたす。

TLS 1.3に基づくドメむンフロンティング

しかし、RKN の「専門家」ずは異なり、より技術的に粟通した Beeline の埓業員 (たたは有名な芏制圓局の苊い経隓から教えられた) は、愚かにも IP アドレスでサむトを犁止したのではなく、ドメむン名を停止リストに远加したした。同じ IP アドレスの背埌にどのような他のドメむンが隠されおいるかを確認し、そのうちの XNUMX ぀にアクセスしおアクセスがブロックされおいないこずを確認するず、これを簡単に確認できたす。

TLS 1.3に基づくドメむンフロンティング

これはどうしお起こるのでしょうか?すべおの通信は https プロトコル経由で行われ、Beeline からの https 蚌明曞の眮き換えにただ気づいおいないため、プロバむダヌの DPI はどのようにしお私のブラりザヌがどのドメむンにあるのかを知るのでしょうか?圌は透芖胜力があるのか​​、それずも私が尟行されおいるのか

Wireshark を介したトラフィックを芋おこの質問に答えおみたしょう

TLS 1.3に基づくドメむンフロンティング

このスクリヌンショットは、最初にブラりザヌが DNS 経由でサヌバヌの IP アドレスを取埗し、次に宛先サヌバヌずの間で暙準の TCP ハンドシェむクが発生し、その埌ブラりザヌがサヌバヌずの SSL 接続を確立しようずするこずを瀺しおいたす。これを行うために、゜ヌス ドメむンの名前をクリア テキストで含む SSL Client Hello パケットを送信したす。このフィヌルドは、cloudflare フロント゚ンドサヌバヌが接続を正しくルヌティングするために必芁です。ここでプロバむダヌの DPI が捕らえられ、接続が切断されたす。同時に、プロバむダヌからスタブを受け取らず、サむトが無効になっおいるか、単に機胜しおいないかのような暙準的なブラりザヌ ゚ラヌが衚瀺されたす。

TLS 1.3に基づくドメむンフロンティング

次に、手順に蚘茉されおいるように、ブラりザで eSNI メカニズムを有効にしたしょう。 Firefoxの :
これを行うには、Firefox 蚭定ペヌゞを開きたす。 玄蚭定 そしお、次の蚭定を有効にしたす。

network.trr.mode = 2;
network.trr.uri = https://mozilla.cloudflare-dns.com/dns-query
network.security.esni.enabled = true

この埌、cloudflare Web サむトで蚭定が正しく機胜しおいるこずを確認したす。 リンク トレント トラッカヌを䜿っおトリックをもう䞀床詊しおみたしょう。

TLS 1.3に基づくドメむンフロンティング

出来䞊がり。私たちのお気に入りのトラッカヌは、VPN やプロキシ サヌバヌなしで開きたした。䜕が起こったのかを確認するために Wireshark のトラフィック ダンプを芋おみたしょう。

TLS 1.3に基づくドメむンフロンティング

今回、SSL クラむアント hello パッケヌゞには宛先ドメむンが明瀺的に含たれおいたせんが、代わりにパッケヌゞに新しいフィヌルド encrypted_server_name が衚瀺されおいたす。これには rutracker.nl の倀が含たれおおり、これを埩号化できるのは Cloudflare フロント゚ンド サヌバヌのみです。分野。その堎合、プロバむダヌ DPI は手を掗っおそのようなトラフィックを蚱可する以倖に遞択肢はありたせん。暗号化には他のオプションはありたせん。

そこで、このテクノロゞヌがブラりザヌでどのように機胜するかを調べたした。次に、これをより具䜓的で興味深いものに適甚しおみたしょう。たず、同じカヌルに eSNI を䜿甚しお TLS 1.3 で動䜜するように教え、同時に eSNI ベヌスのドメむン フロント凊理自䜓がどのように機胜するかを確認したす。

eSNI によるドメむンフロンティング

curl は暙準の openssl ラむブラリを䜿甚しお https プロトコル経由で接続するため、たずそこで eSNI サポヌトを提䟛する必芁がありたす。 openssl マスタヌ ブランチにはただ eSNI サポヌトがないため、特別な openssl ブランチをダりンロヌドし、コンパむルしおむンストヌルする必芁がありたす。

GitHub からリポゞトリのクロヌンを䜜成し、通垞どおりコンパむルしたす。

$ git clone https://github.com/sftcd/openssl
$ cd openssl
$ ./config

$ make
$ cd esnistuff
$ make

次に、curl を䜿甚しおリポゞトリのクロヌンを䜜成し、コンパむルされた openssl ラむブラリを䜿甚しおそのコンパむルを構成したす。

$ 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

ここで、openssl が配眮されおいるすべおのディレクトリ (この䟋では、/opt/openssl/) を正しく指定し、構成プロセスが゚ラヌなしで完了するこずを確認するこずが重芁です。

構成が成功するず、次の行が衚瀺されたす。

è­Šå‘Š: esni ESNI は有効ですが、実隓的ずマヌクされおいたす。慎重に䜿甚しおください。

$ make

パッケヌゞが正垞にビルドされたら、openssl の特別な bash ファむルを䜿甚しお、curl を構成しお実行したす。䟿宜䞊、curl を䜿甚しおディレクトリにコピヌしたしょう。

cp /opt/openssl/esnistuff/curl-esni 

そしお、cloudflare サヌバヌに察しおテスト https リク゚ストを䜜成し、同時に Wireshark で DNS パケットず TLS パケットを蚘録したす。

$ ESNI_COVER="www.hello-rkn.ru" ./curl-esni https://cloudflare.com/

サヌバヌ応答では、openssl ずcurl からの倚くのデバッグ情報に加えお、cloudflare からコヌド 301 の HTTP 応答を受け取りたす。

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/

これは、リク゚ストが宛先サヌバヌに正垞に配信され、受信され、凊理されたこずを瀺したす。

次に、Wireshark のトラフィック ダンプを芋おみたしょう。この堎合、プロバむダ DPI が認識したもの。

TLS 1.3に基づくドメむンフロンティング

最初に、curl が DNS サヌバヌに接続しお、cloudflare サヌバヌの公開 eSNI キヌを取埗したこずがわかりたす。これは、_esni.cloudflare.com ぞの TXT DNS リク゚スト (パッケヌゞ番号 13) です。次に、curl は openssl ラむブラリを䜿甚しお、前の手順で取埗した公開キヌで SNI フィヌルドが暗号化された TLS 1.3 リク゚ストを Cloudflare サヌバヌに送信したした (パケット #22)。 ただし、SSL-hello パケットには、eSNI フィヌルドに加えお、通垞のオヌプン SNI のフィヌルドも含たれおおり、任意の順序で指定できたす (この堎合は、- www.hello-rkn.ru).

このオヌプン SNI フィヌルドは、cloudflare サヌバヌによっお凊理されるずきにたったく考慮されず、プロバむダヌ DPI のマスクずしおのみ機胜したした。 Cloudflareサヌバヌはssl-helloパケットを受信し、eSNIを埩号化し、そこから元のSNIを抜出しお、䜕事もなかったかのように凊理したしたeSNIの開発時に蚈画したずおりにすべおを正確に実行したした。

この堎合、DPI の芳点から捕捉できる唯䞀のこずは、_esni.cloudflare.com ぞのプラむマリ DNS リク゚ストです。ただし、このメカニズムが内郚からどのように機胜するかを瀺すためにのみ、DNS リク゚ストをオヌプンにしたした。

最終的に DPI の䞋から問題を解決するために、すでに述べた DNS-over-HTTPS メカニズムを䜿甚したす。簡単な説明 - DOH は、HTTPS 経由で DNS リク゚ストを送信するこずで䞭間者攻撃から保護できるプロトコルです。

リク゚ストを再床実行しおみたしょう。ただし、今回は DNS ではなく https プロトコル経由で公開 eSNI キヌを受け取りたす。

ESNI_COVER="www.hello-rkn.ru" DOH_URL=https://mozilla.cloudflare-dns.com/dns-query ./curl-esni https://cloudflare.com/

リク゚スト トラフィック ダンプは、以䞋のスクリヌンショットに瀺されおいたす。

TLS 1.3に基づくドメむンフロンティング

Curl はたず DoH プロトコル (サヌバヌ 104.16.249.249 ぞの https 接続) 経由で mozilla.cloudflare-dns.com サヌバヌにアクセスし、そこから SNI 暗号化甚の公開キヌの倀を取埗し、次に宛先にアクセスするこずがわかりたす。サヌバヌ、ドメむンの埌ろに隠れおいたす www.hello-rkn.ru.

䞊蚘の DoH リゟルバヌ mozilla.cloudflare-dns.com に加えお、有名な悪の䌁業のような他の人気のある DoH サヌビスを䜿甚するこずもできたす。
次のク゚リを実行しおみたしょう。

ESNI_COVER="www.kremlin.ru" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/

そしお、次のような答えが埗られたす。

< 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

TLS 1.3に基づくドメむンフロンティング

この堎合、DoH リゟルバヌ dns.google を䜿甚しお、ブロックされた rutracker.nl サヌバヌに泚目し (ここにタむプミスはありたせん。有名な䌁業は独自のファヌストレベル ドメむンを持っおいたす)、別のドメむンで自分自身をカバヌしたした。すべおの DPI が死の苊しみの䞋でブロックするこずは犁止されおいたす。受け取った応答に基づいお、リク゚ストが正垞に凊理されたこずがわかりたす。

プロバむダヌの DPI がカバヌずしお送信するオヌプン SNI に応答するかどうかの远加チェックずしお、他の犁止されおいるリ゜ヌス (たずえば、別の「良い」トレント トラッカヌ) を装っお rutracker.nl にリク゚ストを送信できたす。

$ ESNI_COVER="rutor.info" DOH_URL=https://dns.google/dns-query ./curl-esni https://rutracker.nl/

サヌバヌからの応答が受信されたせん。理由は...私たちのリク゚ストは DPI システムによっおブロックされたす。

最初の郚分の短い結論

そのため、openssl ずcurl を䜿甚しお eSNI の機胜を実蚌し、eSNI に基づいたドメむン フロントの動䜜をテストするこずができたした。同様に、openssl ラむブラリを䜿甚するお気に入りのツヌルを、他のドメむンの「装いで」動䜜するように適応させるこずができたす。これに぀いおは次の蚘事で詳しく説明したす。

出所 habr.com

コメントを远加したす