Как Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ публичния си уСбсайт с ESNI

Π—Π΄Ρ€Π°Π²Π΅ΠΉΡ‚Π΅ Habr, ΠΊΠ°Π·Π²Π°ΠΌ сС Иля, работя Π² Π΅ΠΊΠΈΠΏΠ° Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π² Exness. НиС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π²Π°ΠΌΠ΅ ΠΈ внСдрявамС основнитС инфраструктурни ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π°ΡˆΠΈΡ‚Π΅ Π΅ΠΊΠΈΠΏΠΈ Π·Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚ΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚.

Π’ Ρ‚Π°Π·ΠΈ статия Π±ΠΈΡ… искал Π΄Π° сподСля ΠΎΠΏΠΈΡ‚Π° си ΠΎΡ‚ внСдряванСто Π½Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π° SNI (ESNI) тСхнология Π² инфраструктурата Π½Π° ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΈ уСбсайтовС.

Как Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ публичния си уСбсайт с ESNI

Π˜Π·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅Ρ‚ΠΎ Π½Π° Ρ‚Π°Π·ΠΈ тСхнология Ρ‰Π΅ повиши Π½ΠΈΠ²ΠΎΡ‚ΠΎ Π½Π° сигурност ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π° с ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ уСбсайт ΠΈ Ρ‰Π΅ спазва Π²ΡŠΡ‚Ρ€Π΅ΡˆΠ½ΠΈΡ‚Π΅ стандарти Π·Π° сигурност, ΠΏΡ€ΠΈΠ΅Ρ‚ΠΈ ΠΎΡ‚ ΠšΠΎΠΌΠΏΠ°Π½ΠΈΡΡ‚Π°.

ΠŸΡŠΡ€Π²ΠΎ, Π±ΠΈΡ… искал Π΄Π° ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠ°, Ρ‡Π΅ тСхнологията Π½Π΅ Π΅ стандартизирана ΠΈ всС ΠΎΡ‰Π΅ Π΅ Π² процСс Π½Π° Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ°, Π½ΠΎ CloudFlare ΠΈ Mozilla Π²Π΅Ρ‡Π΅ я ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ (Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚01). Π’ΠΎΠ²Π° Π½ΠΈ ΠΌΠΎΡ‚ΠΈΠ²ΠΈΡ€Π° Π·Π° Ρ‚Π°ΠΊΡŠΠ² СкспСримСнт.

Малко тСория

Π•Π‘ΠΠ˜ Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π° TLS 1.3, ΠΊΠΎΠ΅Ρ‚ΠΎ позволява SNI ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π² TLS ΡΡŠΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅Ρ‚ΠΎ Π·Π° Ρ€ΡŠΠΊΠΎΡΡ‚ΠΈΡΠΊΠ°Π½Π΅ β€žClient Helloβ€œ. Π•Ρ‚ΠΎ ΠΊΠ°ΠΊ ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Client Hello с ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ESNI (вмСсто обичайния SNI Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ESNI):

Как Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ публичния си уСбсайт с ESNI

 Π—Π° Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚Π΅ ESNI, ΠΈΠΌΠ°Ρ‚Π΅ Π½ΡƒΠΆΠ΄Π° ΠΎΡ‚ Ρ‚Ρ€ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°:

  • DNS; 
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ;
  • ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°.

DNS

Врябва Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡ‚Π΅ Π΄Π²Π° DNS записа – AИ TXT (TXT Π·Π°ΠΏΠΈΡΡŠΡ‚ ΡΡŠΠ΄ΡŠΡ€ΠΆΠ° публичния ΠΊΠ»ΡŽΡ‡, с ΠΊΠΎΠΉΡ‚ΠΎ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΡŠΡ‚ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡˆΠΈΡ„Ρ€ΠΎΠ²Π° SNI) - Π²ΠΈΠΆΡ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ. ОсвСн Ρ‚ΠΎΠ²Π° трябва Π΄Π° ΠΈΠΌΠ° ΠΏΠΎΠ΄ΠΊΡ€Π΅ΠΏΠ° DoH (DNS ΠΏΡ€Π΅Π· HTTPS), Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π½Π°Π»ΠΈΡ‡Π½ΠΈΡ‚Π΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ (Π²ΠΈΠΆΡ‚Π΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ) Π½Π΅ позволяват ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ESNI Π±Π΅Π· DoH. Π’ΠΎΠ²Π° Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ESNI ΠΏΡ€Π΅Π΄ΠΏΠΎΠ»Π°Π³Π° ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅ Π½Π° ΠΈΠΌΠ΅Ρ‚ΠΎ Π½Π° рСсурса, Π΄ΠΎ ΠΊΠΎΠΉΡ‚ΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡ‚ΡŠΠΏ, тоСст няма смисъл Π΄Π° ΠΎΡΡŠΡ‰Π΅ΡΡ‚Π²ΡΠ²Π°ΠΌΠ΅ Π΄ΠΎΡΡ‚ΡŠΠΏ Π΄ΠΎ DNS ΠΏΡ€Π΅Π· UDP. ОсвСн Ρ‚ΠΎΠ²Π° ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°Ρ‚Π° DNSSEC Π²ΠΈ позволява Π΄Π° сС ΠΏΡ€Π΅Π΄ΠΏΠ°Π·ΠΈΡ‚Π΅ ΠΎΡ‚ Π°Ρ‚Π°ΠΊΠΈ с отравянС Π½Π° кСша Π² Ρ‚ΠΎΠ·ΠΈ сцСнарий.

Π”ΠΎΡΡ‚ΡŠΠΏΠ΅Π½ Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° няколко доставчици Π½Π° DoH, ΠΌΠ΅ΠΆΠ΄Ρƒ тях:

CloudFlare ΡΡŠΡΡ‚ΠΎΡΠ½ΠΈΡ (ΠŸΡ€ΠΎΠ²Π΅Ρ€Π΅Ρ‚Π΅ My Browser β†’ Encrypted SNI β†’ Learn More), Ρ‡Π΅ Ρ‚Π΅Ρ…Π½ΠΈΡ‚Π΅ ΡΡŠΡ€Π²ΡŠΡ€ΠΈ Π²Π΅Ρ‡Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ ESNI, тоСст Π·Π° ΡΡŠΡ€Π²ΡŠΡ€ΠΈΡ‚Π΅ Π½Π° CloudFlare Π² DNS ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠΎΠ½Π΅ Π΄Π²Π° записа - A ΠΈ TXT. Π’ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ ΠΏΡ€Π°Π²ΠΈΠΌ Π·Π°ΠΏΠΈΡ‚Π²Π°Π½Π΅ към Google DNS (ΠΏΡ€Π΅Π· HTTPS): 

А запис:

curl 'https://dns.google.com/resolve?name=www.cloudflare.com&type=A' 
-s -H 'accept: application/dns+json'
{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": true,
  "CD": false,
  "Question": [
    {
      "name": "www.cloudflare.com.",
      "type": 1
    }
  ],
  "Answer": [
    {
      "name": "www.cloudflare.com.",
      "type": 1,
      "TTL": 257,
      "data": "104.17.210.9"
    },
    {
      "name": "www.cloudflare.com.",
      "type": 1,
      "TTL": 257,
      "data": "104.17.209.9"
    }
  ]
}

TXT запис, заявката сС Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π° ΠΏΠΎ ΠΎΠ±Ρ€Π°Π·Π΅Ρ† _esni.FQDN:

curl 'https://dns.google.com/resolve?name=_esni.www.cloudflare.com&type=TXT' 
-s -H 'accept: application/dns+json'
{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": true,
  "CD": false,
  "Question": [
    {
    "name": "_esni.www.cloudflare.com.",
    "type": 16
    }
  ],
  "Answer": [
    {
    "name": "_esni.www.cloudflare.com.",
    "type": 16,
    "TTL": 1799,
    "data": ""/wEUgUKlACQAHQAg9SiAYQ9aUseUZr47HYHvF5jkt3aZ5802eAMJPhRz1QgAAhMBAQQAAAAAXtUmAAAAAABe3Q8AAAA=""
    }
  ],
  "Comment": "Response from 2400:cb00:2049:1::a29f:209."
}

Π’Π°ΠΊΠ° Ρ‡Π΅, ΠΎΡ‚ Π³Π»Π΅Π΄Π½Π° Ρ‚ΠΎΡ‡ΠΊΠ° Π½Π° DNS, трябва Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ DoH (Π·Π° ΠΏΡ€Π΅Π΄ΠΏΠΎΡ‡ΠΈΡ‚Π°Π½Π΅ с DNSSEC) ΠΈ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π΄Π²Π° записа. 

ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ

Ако Π³ΠΎΠ²ΠΎΡ€ΠΈΠΌ Π·Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΠΈ, Ρ‚ΠΎΠ³Π°Π²Π° Π² ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π΅ Ρ€Π΅Π°Π»ΠΈΠ·ΠΈΡ€Π°Π½Π° само във FireFox. Π’ΡƒΠΊ Π•Ρ‚ΠΎ инструкции ΠΊΠ°ΠΊ Π΄Π° Π°ΠΊΡ‚ΠΈΠ²ΠΈΡ€Π°Ρ‚Π΅ ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ°Ρ‚Π° Π½Π° ESNI ΠΈ DoH във FireFox. Π‘Π»Π΅Π΄ ΠΊΠ°Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·ΡŠΡ€ΡŠΡ‚ Π΅ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€ΠΈΡ€Π°Π½, трябва Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π΅Ρ‰ΠΎ ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎ:

Как Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ публичния си уСбсайт с ESNI

Π’Ρ€ΡŠΠ·ΠΊΠ° Π·Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° Π±Ρ€Π°ΡƒΠ·ΡŠΡ€Π°.

Π Π°Π·Π±ΠΈΡ€Π° сС, TLS 1.3 трябва Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ESNI, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ ESNI Π΅ Ρ€Π°Π·ΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ Π½Π° TLS 1.3.

Π—Π° Ρ†Π΅Π»ΠΈΡ‚Π΅ Π½Π° тСстванСто Π½Π° Π±Π΅ΠΊΠ΅Π½Π΄Π° с ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ESNI Π²Π½Π΅Π΄Ρ€ΠΈΡ…ΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π° Π½Π° go, Но ΠΏΠΎΠ²Π΅Ρ‡Π΅ Π·Π° Ρ‚ΠΎΠ²Π° ΠΏΠΎ-късно.

ΠŸΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° ΠΎΡ‚ страна Π½Π° ΡΡŠΡ€Π²ΡŠΡ€Π°

Π’ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° ESNI Π½Π΅ сС ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ΠΎΡ‚ ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€ΠΈ ΠΊΠ°Ρ‚ΠΎ nginx/apache ΠΈ Π΄Ρ€., Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Ρ‚Π΅ работят с TLS Ρ‡Ρ€Π΅Π· OpenSSL/BoringSSL, ΠΊΠΎΠΈΡ‚ΠΎ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»Π½ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ ESNI.

Π—Π°Ρ‚ΠΎΠ²Π° Ρ€Π΅ΡˆΠΈΡ…ΠΌΠ΅ Π΄Π° създадСм наш собствСн ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΎΡ‚ прСдния ΠΊΡ€Π°ΠΉ (ESNI ΠΎΠ±Ρ€Π°Ρ‚Π΅Π½ прокси), ΠΊΠΎΠΉΡ‚ΠΎ Π΄Π° ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° TLS 1.3 Ρ‚Π΅Ρ€ΠΌΠΈΠ½ΠΈΡ€Π°Π½Π΅ с ESNI ΠΈ прокси HTTP(S) Ρ‚Ρ€Π°Ρ„ΠΈΠΊ към Π²ΡŠΠ·Ρ…ΠΎΠ΄ΡΡ‰ΠΈΡ ΠΏΠΎΡ‚ΠΎΠΊ, ΠΊΠΎΠΉΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° ESNI. Π’ΠΎΠ²Π° позволява тСхнологията Π΄Π° бъдС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π° във Π²Π΅Ρ‡Π΅ ΡΡŠΡ‰Π΅ΡΡ‚Π²ΡƒΠ²Π°Ρ‰Π° инфраструктура, Π±Π΅Π· Π΄Π° сС промСнят основнитС ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ - тоСст Π΄Π° сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ настоящи ΡƒΠ΅Π± ΡΡŠΡ€Π²ΡŠΡ€ΠΈ, ΠΊΠΎΠΈΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ°Ρ‚ ESNI. 

Π—Π° ΠΏΠΎ-голяма яснота Π΅Ρ‚ΠΎ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠ°:

Как Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ публичния си уСбсайт с ESNI

ΠžΡ‚Π±Π΅Π»ΡΠ·Π²Π°ΠΌ, Ρ‡Π΅ проксито Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€Π°Π½ΠΎ с Π²ΡŠΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ Π·Π° ΠΏΡ€Π΅ΠΊΡŠΡΠ²Π°Π½Π΅ Π½Π° TLS Π²Ρ€ΡŠΠ·ΠΊΠ° Π±Π΅Π· ESNI, Π·Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚ΠΈ Π±Π΅Π· ESNI. ОсвСн Ρ‚ΠΎΠ²Π° комуникационният ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ» с upstream ΠΌΠΎΠΆΠ΅ Π΄Π° бъдС HTTP ΠΈΠ»ΠΈ HTTPS с TLS вСрсия ΠΏΠΎ-ниска ΠΎΡ‚ 1.3 (Π°ΠΊΠΎ upstream Π½Π΅ ΠΏΠΎΠ΄Π΄ΡŠΡ€ΠΆΠ° 1.3). Π’Π°Π·ΠΈ схСма Π΄Π°Π²Π° максимална Π³ΡŠΠ²ΠΊΠ°Π²ΠΎΡΡ‚.

ВнСдряванС Π½Π° ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ESNI Π½Π° go Π²Π·Π΅Ρ…ΠΌΠ΅ Π½Π°Π·Π°Π΅ΠΌ ΠΎΡ‚ CloudFlare. Π‘ΠΈΡ… искал Π²Π΅Π΄Π½Π°Π³Π° Π΄Π° ΠΎΡ‚Π±Π΅Π»Π΅ΠΆΠ°, Ρ‡Π΅ самата рСализация Π΅ доста Π½Π΅Ρ‚Ρ€ΠΈΠ²ΠΈΠ°Π»Π½Π°, Ρ‚ΡŠΠΉ ΠΊΠ°Ρ‚ΠΎ Π²ΠΊΠ»ΡŽΡ‡Π²Π° ΠΏΡ€ΠΎΠΌΠ΅Π½ΠΈ Π² стандартната Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΊΡ€ΠΈΠΏΡ‚ΠΎ/tls ΠΈ слСдоватСлно изисква β€žΠΊΡ€ΡŠΠΏΠΊΠ°β€œ GOROOT ΠΏΡ€Π΅Π΄ΠΈ ΠΌΠΎΠ½Ρ‚Π°ΠΆΠ°.

Π—Π° Π³Π΅Π½Π΅Ρ€ΠΈΡ€Π°Π½Π΅ Π½Π° ESNI ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ esnitool (ΡΡŠΡ‰ΠΎ Ρ€ΠΎΠΆΠ±Π° Π½Π° CloudFlare). Π’Π΅Π·ΠΈ ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ сС ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‚ Π·Π° SNI ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅/Π΄Π΅ΠΊΡ€ΠΈΠΏΡ‚ΠΈΡ€Π°Π½Π΅.
ВСствахмС компилацията с go 1.13 Π½Π° Linux (Debian, Alpine) ΠΈ MacOS. 

Няколко Π΄ΡƒΠΌΠΈ Π·Π° ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΈΡ‚Π΅ характСристики

ΠžΠ±Ρ€Π°Ρ‚Π½ΠΈΡΡ‚ прокси ESNI прСдоставя ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ във Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ Prometheus, ΠΊΠ°Ρ‚ΠΎ rps, латСнтност Π½Π°Π³ΠΎΡ€Π΅ ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° ΠΎΡ‚Π³ΠΎΠ²ΠΎΡ€, Π½Π΅ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ/ΡƒΡΠΏΠ΅ΡˆΠ½ΠΈ TLS Ρ€ΡŠΠΊΠΎΡΡ‚ΠΈΡΠΊΠ°Π½ΠΈΡ ΠΈ ΠΏΡ€ΠΎΠ΄ΡŠΠ»ΠΆΠΈΡ‚Π΅Π»Π½ΠΎΡΡ‚ Π½Π° TLS Ρ€ΡŠΠΊΠΎΡΡ‚ΠΈΡΠΊΠ°Π½Π΅. На ΠΏΡ€ΡŠΠ² ΠΏΠΎΠ³Π»Π΅Π΄ Ρ‚ΠΎΠ²Π° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π΄ΠΎΡΡ‚Π°Ρ‚ΡŠΡ‡Π½ΠΎ, Π·Π° Π΄Π° сС ΠΎΡ†Π΅Π½ΠΈ ΠΊΠ°ΠΊ проксито ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Π²Π° Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ°. 

Π˜Π·Π²ΡŠΡ€ΡˆΠΈΡ…ΠΌΠ΅ ΠΈ тСстовС Π·Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅ ΠΏΡ€Π΅Π΄ΠΈ ΡƒΠΏΠΎΡ‚Ρ€Π΅Π±Π°. Π Π΅Π·ΡƒΠ»Ρ‚Π°Ρ‚ΠΈ ΠΏΠΎ-Π΄ΠΎΠ»Ρƒ:

wrk -t50 -c1000 -d360s 'https://esni-rev-proxy.npw:443' --timeout 15s
Running 6m test @ https://esni-rev-proxy.npw:443
  50 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.77s     1.21s    7.20s    65.43%
    Req/Sec    13.78      8.84   140.00     83.70%
  206357 requests in 6.00m, 6.08GB read
Requests/sec:    573.07
Transfer/sec:     17.28MB 

Π˜Π·Π²ΡŠΡ€ΡˆΠΈΡ…ΠΌΠ΅ чисто качСствСно тСстванС Π½Π° Π½Π°Ρ‚ΠΎΠ²Π°Ρ€Π²Π°Π½Π΅Ρ‚ΠΎ, Π·Π° Π΄Π° сравним схСмата, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ‰Π° ESNI ΠΎΠ±Ρ€Π°Ρ‚Π΅Π½ прокси ΠΈ Π±Π΅Π·. НиС "изляхмС" Ρ‚Ρ€Π°Ρ„ΠΈΠΊΠ° Π»ΠΎΠΊΠ°Π»Π½ΠΎ, Π·Π° Π΄Π° Π΅Π»ΠΈΠΌΠΈΠ½ΠΈΡ€Π°ΠΌΠ΅ "намСсата" Π² ΠΌΠ΅ΠΆΠ΄ΠΈΠ½Π½ΠΈΡ‚Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΈ.

И Ρ‚Π°ΠΊΠ°, с ΠΏΠΎΠ΄Π΄Ρ€ΡŠΠΆΠΊΠ° Π½Π° ESNI ΠΈ прокси Π½Π°Π³ΠΎΡ€Π΅ с HTTP, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ ΠΎΠΊΠΎΠ»ΠΎ ~550 rps ΠΎΡ‚ Π΅Π΄ΠΈΠ½ СкзСмпляр, със срСдната консумация Π½Π° CPU/RAM Π½Π° ESNI ΠΎΠ±Ρ€Π°Ρ‚Π΅Π½ прокси:

  • 80% ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° процСсора (4 vCPU, 4 GB RAM хостовС, Linux)
  • 130 MB Mem RSS

Как Π΄Π° Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚Π΅ публичния си уСбсайт с ESNI

Π—Π° сравнСниС, RPS Π·Π° ΡΡŠΡ‰ΠΈΡ nginx Π½Π°Π³ΠΎΡ€Π΅ ΠΏΠΎ Π²Π΅Ρ€ΠΈΠ³Π°Ρ‚Π° Π±Π΅Π· TLS (HTTP ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ») прСкратяванС Π΅ ~ 1100:

wrk -t50 -c1000 -d360s 'http://lb.npw:80' –-timeout 15s
Running 6m test @ http://lb.npw:80
  50 threads and 1000 connections
  Thread Stats   Avg      Stdev     Max   +/- Stdev
    Latency     1.11s     2.30s   15.00s    90.94%
    Req/Sec    23.25     13.55   282.00     79.25%
  393093 requests in 6.00m, 11.35GB read
  Socket errors: connect 0, read 0, write 0, timeout 9555
  Non-2xx or 3xx responses: 8111
Requests/sec:   1091.62
Transfer/sec:     32.27MB 

НаличиСто Π½Π° ΠΈΠ·Ρ‡Π°ΠΊΠ²Π°Π½Π΅ ΠΏΠΎΠΊΠ°Π·Π²Π°, Ρ‡Π΅ ΠΈΠΌΠ° липса Π½Π° рСсурси (ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ…ΠΌΠ΅ 4 vCPU, 4 GB RAM хостовС, Linux), Π° Π²ΡΡŠΡ‰Π½ΠΎΡΡ‚ потСнциалният RPS Π΅ ΠΏΠΎ-висок (ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ…ΠΌΠ΅ Ρ†ΠΈΡ„Ρ€ΠΈ Π΄ΠΎ 2700 RPS Π½Π° ΠΏΠΎ-ΠΌΠΎΡ‰Π½ΠΈ рСсурси).

Π’ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ отбСлязвам Ρ‡Π΅ тСхнологията ESNI ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° доста ΠΎΠ±Π΅Ρ‰Π°Π²Π°Ρ‰Π°. ВсС ΠΎΡ‰Π΅ ΠΈΠΌΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‚Π²ΠΎΡ€Π΅Π½ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΈΡ‚Π΅ със ΡΡŠΡ…Ρ€Π°Π½ΡΠ²Π°Π½Π΅Ρ‚ΠΎ Π½Π° ΠΏΡƒΠ±Π»ΠΈΡ‡Π΅Π½ ESNI ΠΊΠ»ΡŽΡ‡ Π² DNS ΠΈ Ρ€ΠΎΡ‚Π°Ρ†ΠΈΠΎΠ½Π½ΠΈΡ‚Π΅ ESNI ΠΊΠ»ΡŽΡ‡ΠΎΠ²Π΅ - Ρ‚Π΅Π·ΠΈ Π²ΡŠΠΏΡ€ΠΎΡΠΈ сС ΠΎΠ±ΡΡŠΠΆΠ΄Π°Ρ‚ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈ послСдната вСрсия Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π½Π° ESNI (към ΠΌΠΎΠΌΠ΅Π½Ρ‚Π° Π½Π° писанС) Π²Π΅Ρ‡Π΅ Π΅ 7.

Π˜Π·Ρ‚ΠΎΡ‡Π½ΠΈΠΊ: www.habr.com

ДобавянС Π½Π° Π½ΠΎΠ² ΠΊΠΎΠΌΠ΅Π½Ρ‚Π°Ρ€