เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ”เป‰เบงเบ ESNI

เบชเบฐเบšเบฒเบเบ”เบต Habr, เบ‚เป‰เบญเบเบŠเบทเปˆ Ilya, เบ‚เป‰เบญเบเป€เบฎเบฑเบ”เบงเบฝเบเบขเบนเปˆเปƒเบ™เบ—เบตเบกเบ‡เบฒเบ™เป€เบงเบ—เบตเบ—เบตเปˆ Exness. เบžเบงเบเป€เบฎเบปเบฒเบžเบฑเบ”เบ—เบฐเบ™เบฒเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบญเบปเบ‡เบ›เบฐเบเบญเบšเบžเบทเป‰เบ™เบ–เบฒเบ™เป‚เบ„เบ‡เบฅเปˆเบฒเบ‡เบซเบผเบฑเบเบ—เบตเปˆเบ—เบตเบกเบ‡เบฒเบ™เบžเบฑเบ”เบ—เบฐเบ™เบฒเบœเบฐเบฅเบดเบ”เบ•เบฐเบžเบฑเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰.

เปƒเบ™เบšเบปเบ”เบ„เบงเบฒเบกเบ™เบตเป‰, เบ‚เป‰เบญเบเบขเบฒเบเปเบšเปˆเบ‡เบ›เบฑเบ™เบ›เบฐเบชเบปเบšเบเบฒเบ™เบ‚เบญเบ‡เบ‚เป‰เบญเบเปƒเบ™เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบต SNI (ESNI) เบ—เบตเปˆเบ–เบทเบเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐ.

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ”เป‰เบงเบ ESNI

เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ™เบตเป‰เบˆเบฐเป€เบžเบตเปˆเบกเบฅเบฐเบ”เบฑเบšเบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเปƒเบ™เป€เบงเบฅเบฒเบ—เบตเปˆเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเปเบฅเบฐเบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบฒเบกเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบžเบฒเบเปƒเบ™เบ—เบตเปˆเบšเปเบฅเบดเบชเบฑเบ”เป„เบ”เป‰เบฎเบฑเบšเบฎเบญเบ‡เป€เบญเบปเบฒ.

เบเปˆเบญเบ™เบญเบทเปˆเบ™ เปเบปเบ”, เบ‚เป‰เบญเบเบขเบฒเบเบŠเบตเป‰เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบšเปเปˆเป„เบ”เป‰เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปเบฅเบฐเบเบฑเบ‡เบขเบนเปˆเปƒเบ™เบฎเปˆเบฒเบ‡, เปเบ•เปˆ CloudFlare เปเบฅเบฐ Mozilla เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบกเบฑเบ™เปเบฅเป‰เบง (เปƒเบ™ เบฎเปˆเบฒเบ‡01). เบ™เบตเป‰เบเบฐเบ•เบธเป‰เบ™เบžเบงเบเป€เบฎเบปเบฒเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ—เบปเบ”เบฅเบญเบ‡เบ”เบฑเปˆเบ‡เบเปˆเบฒเบง.

เบšเบดเบ”เบ‚เบญเบ‡เบ—เบดเบ”เบชเบฐเบ”เบต

ESNI เป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบ‚เบฐเบซเบเบฒเบเบ‚เบญเบ‡เป‚เบ›เป‚เบ•เบ„เบญเบ™ TLS 1.3 เบ—เบตเปˆเบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” SNI เปƒเบ™เบ‚เปเป‰เบ„เบงเบฒเบก "เบชเบฐเบšเบฒเบเบ”เบตเบฅเบนเบเบ„เป‰เบฒ" TLS handshake. เบ™เบตเป‰เปเบกเปˆเบ™เบชเบดเปˆเบ‡เบ—เบตเปˆ Client Hello เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI (เปเบ—เบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบฑเบ™ SNI เบ›เบปเบเบเบฐเบ•เบดเบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเป€เบซเบฑเบ™ ESNI):

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ”เป‰เบงเบ ESNI

 เป€เบžเบทเปˆเบญเปƒเบŠเป‰ ESNI, เบ—เปˆเบฒเบ™เบ•เป‰เบญเบ‡เบเบฒเบ™เบชเบฒเบกเบญเบปเบ‡เบ›เบฐเบเบญเบš:

  • DNS; 
  • เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบนเบเบ„เป‰เบฒ;
  • เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ”เป‰เบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ.

DNS

เบ—เปˆเบฒเบ™เบˆเปเบฒเป€เบ›เบฑเบ™เบ•เป‰เบญเบ‡เป€เบžเบตเปˆเบกเบชเบญเบ‡เบšเบฑเบ™เบ—เบถเบ DNS - Aเปเบฅเบฐ TXT (เบšเบฑเบ™เบ—เบถเบ TXT เบกเบตเบฅเบฐเบซเบฑเบ”เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ—เบตเปˆเบฅเบนเบเบ„เป‰เบฒเบชเบฒเบกเบฒเบ”เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” SNI) - เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰. เบ™เบญเบเบˆเบฒเบเบ™เบฑเป‰เบ™, เบ•เป‰เบญเบ‡เบกเบตเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ DoH (DNS เบœเปˆเบฒเบ™ HTTPS) เป€เบžเบฒเบฐเบงเปˆเบฒเบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบกเบตเบขเบนเปˆ (เป€เบšเบดเปˆเบ‡เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰) เบšเปเปˆเป€เบ›เบตเบ”เปƒเบŠเป‰เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI เป‚เบ”เบเบšเปเปˆเบกเบต DoH. เบ™เบตเป‰เปเบกเปˆเบ™เป€เบซเบ”เบœเบปเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒ ESNI เบซเบกเบฒเบเป€เบ–เบดเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”เบŠเบทเปˆเบ‚เบญเบ‡เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบžเบงเบเป€เบฎเบปเบฒเบเปเบฒเบฅเบฑเบ‡เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡, เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบกเบฑเบ™เบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบซเบกเบฒเบเบ—เบตเปˆเบˆเบฐเป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ DNS เบœเปˆเบฒเบ™ UDP. เบเบดเปˆเบ‡เป„เบ›เบเบงเปˆเบฒเบ™เบฑเป‰เบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ DNSSEC เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ—เปˆเบฒเบ™เป€เบžเบทเปˆเบญเบ›เป‰เบญเบ‡เบเบฑเบ™เบเบฒเบ™เป‚เบˆเบกเบ•เบต cache เป€เบ›เบฑเบ™เบžเบดเบ”เปƒเบ™เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบ™เบตเป‰.

เบ›เบฐเบˆเบธเบšเบฑเบ™เบกเบตเบขเบนเปˆ เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™ DoH เบซเบผเบฒเบเป†เบ„เบปเบ™, เปƒเบ™เบšเบฑเบ™เบ”เบฒเบžเบงเบเป€เบ‚เบปเบฒ:

CloudFlare เบ›เบฐเบเบฒเบ” (เบเบงเบ”เป€เบšเบดเปˆเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ‚เบญเบ‡เบ‚เป‰เบญเบ โ†’ SNI เบ—เบตเปˆเป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ” โ†’ เบฎเบฝเบ™เบฎเบนเป‰เป€เบžเบตเปˆเบกเป€เบ•เบตเบก) เบงเปˆเบฒเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ 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.

เบชเปเบฒเบฅเบฑเบšเบˆเบธเบ”เบ›เบฐเบชเบปเบ‡เบ‚เบญเบ‡เบเบฒเบ™เบ—เบปเบ”เบชเบญเบš backend เบเบฑเบšเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบฅเบนเบเบ„เป‰เบฒเบเปˆเบฝเบงเบเบฑเบš go, เปเบ•เปˆเป€เบžเบตเปˆเบกเป€เบ•เบตเบกเบเปˆเบฝเบงเบเบฑเบšเบงเปˆเบฒเบ•เปเปˆเบกเบฒ.

เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ”เป‰เบฒเบ™เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ

เปƒเบ™เบ›เบฑเบ”เบˆเบธเบšเบฑเบ™, ESNI เบšเปเปˆเป„เบ”เป‰เบฎเบฑเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเป„เบŠเบ•เปŒเป€เบŠเบฑเปˆเบ™ nginx / apache, เปเบฅเบฐเบญเบทเปˆเบ™เป†, เป€เบ™เบทเปˆเบญเบ‡เบˆเบฒเบเบงเปˆเบฒเบžเบงเบเป€เบ‚เบปเบฒเป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš TLS เบœเปˆเบฒเบ™ OpenSSL / BoringSSL, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI เบขเปˆเบฒเบ‡เป€เบ›เบฑเบ™เบ—เบฒเบ‡เบเบฒเบ™.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบžเบงเบเป€เบฎเบปเบฒเบ•เบฑเบ”เบชเบดเบ™เปƒเบˆเบชเป‰เบฒเบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ—เบฒเบ‡เบซเบ™เป‰เบฒเบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒเป€เบญเบ‡ (ESNI reverse proxy), เป€เบŠเบดเปˆเบ‡เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ TLS 1.3 termination เบเบฑเบš ESNI เปเบฅเบฐ proxy HTTP(S) traffic เป„เบ›เบซเบฒ upstream, เป€เบŠเบดเปˆเบ‡เบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI. เบ™เบตเป‰เบญเบฐเบ™เบธเบเบฒเบ”เปƒเบซเป‰เบ™เปเบฒเปƒเบŠเป‰เป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเปƒเบ™เป‚เบ„เบ‡เบชเป‰เบฒเบ‡เบžเบทเป‰เบ™เบ–เบฒเบ™เบ—เบตเปˆเบกเบตเบขเบนเปˆเปเบฅเป‰เบง, เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เบญเบปเบ‡เบ›เบฐเบเบญเบšเบ•เบปเป‰เบ™เบ•เป - เบ™เบฑเป‰เบ™เปเบกเปˆเบ™, เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบเป€เบงเบฑเบšเปƒเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ—เบตเปˆเบšเปเปˆเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI. 

เป€เบžเบทเปˆเบญเบ„เบงเบฒเบกเบŠเบฑเบ”เป€เบˆเบ™, เบ™เบตเป‰เปเบกเปˆเบ™เปเบœเบ™เบงเบฒเบ”:

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ”เป‰เบงเบ ESNI

เบ‚เป‰เบญเบเบชเบฑเบ‡เป€เบเบ”เบงเปˆเบฒเบ•เบปเบงเปเบ—เบ™เป„เบ”เป‰เบ–เบทเบเบญเบญเบเปเบšเบšเบ”เป‰เบงเบเบ„เบงเบฒเบกเบชเบฒเบกเบฒเบ”เปƒเบ™เบเบฒเบ™เบขเบธเบ”เบเบฒเบ™เป€เบŠเบทเปˆเบญเบกเบ•เปเปˆ TLS เป‚เบ”เบเบšเปเปˆเบกเบต ESNI, เป€เบžเบทเปˆเบญเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบฅเบนเบเบ„เป‰เบฒเบ—เบตเปˆเบšเปเปˆเบกเบต ESNI. เบ™เบญเบเบˆเบฒเบเบ™เบตเป‰, เป‚เบ›เบฃเป‚เบ•เบ„เปเบเบฒเบ™เบชเบทเปˆเบชเบฒเบ™เบเบฑเบšเบเบฐเปเบชเบชเบฒเบกเบฒเบ”เป€เบ›เบฑเบ™ HTTP เบซเบผเบท HTTPS เบ—เบตเปˆเบกเบตเบฅเบธเป‰เบ™ TLS เบ•เปˆเบณเบเบงเปˆเบฒ 1.3 (เบ–เป‰เบฒ upstream เบšเปเปˆเบฎเบญเบ‡เบฎเบฑเบš 1.3). เป‚เบ„เบ‡เบเบฒเบ™เบ™เบตเป‰เปƒเบซเป‰เบ„เบงเบฒเบกเบเบทเบ”เบซเบเบธเปˆเบ™เบชเบนเบ‡เบชเบธเบ”.

เบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI เบเปˆเบฝเบงเบเบฑเบš go เบžเบงเบเป€เบฎเบปเบฒเบขเบทเบกเบˆเบฒเบ CloudFlare. เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบขเบฒเบเบˆเบฐเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™เบ—เบฑเบ™เบ—เบตเบงเปˆเบฒเบเบฒเบ™เบˆเบฑเบ”เบ•เบฑเป‰เบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบ•เบปเบงเบกเบฑเบ™เป€เบญเบ‡เปเบกเปˆเบ™เบ‚เป‰เบญเบ™เบ‚เป‰เบฒเบ‡เบšเปเปˆเบชเปเบฒเบ„เบฑเบ™, เป€เบžเบฒเบฐเบงเปˆเบฒเบกเบฑเบ™เบเปˆเบฝเบงเบ‚เป‰เบญเบ‡เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡เปƒเบ™เบซเป‰เบญเบ‡เบชเบฐเบซเบกเบธเบ”เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™. crypto/tls เปเบฅเบฐโ€‹เบ”เบฑเปˆเบ‡โ€‹เบ™เบฑเป‰เบ™โ€‹เบˆเบถเปˆเบ‡โ€‹เบฎเบฝเบโ€‹เบฎเป‰เบญเบ‡โ€‹เปƒเบซเป‰ "patchingโ€‹" GOROOT เบเปˆเบญเบ™โ€‹เบเบฒเบ™โ€‹เป‚เบฎเบกโ€‹เบŠเบธเบกเบ™เบธเบก.

เป€เบžเบทเปˆเบญเบชเป‰เบฒเบ‡เบเบฐเปเบˆ ESNI เบžเบงเบเป€เบฎเบปเบฒเปƒเบŠเป‰ esnitool (เบเบฑเบ‡เป€เบ›เบฑเบ™เบ„เบงเบฒเบกเบ„เบดเบ”เบ‚เบญเบ‡ CloudFlare). เบเบฐเปเบˆเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เบ–เบทเบเปƒเบŠเป‰เบชเบณเบฅเบฑเบšเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบฅเบฐเบซเบฑเบ”/เบ–เบญเบ”เบฅเบฐเบซเบฑเบ” SNI.
เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เบชเป‰เบฒเบ‡เป‚เบ”เบเปƒเบŠเป‰ go 1.13 เปƒเบ™ Linux (Debian, Alpine) เปเบฅเบฐ MacOS. 

เบชเบญเบ‡เบชเบฒเบกเบ„เปเบฒเบเปˆเบฝเบงเบเบฑเบšเบฅเบฑเบเบชเบฐเบ™เบฐเบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™

ESNI reverse proxy เปƒเบซเป‰ metrics เปƒเบ™เบฎเบนเบšเปเบšเบš Prometheus, เป€เบŠเบฑเปˆเบ™: rps, upstream latency & response codes, failed/successful handshakes & TLS handshake. เบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบ™เบตเป‰เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบžเบฝเบ‡เบžเปเบ—เบตเปˆเบˆเบฐเบ›เบฐเป€เบกเบตเบ™เบงเบดเบ—เบตเบเบฒเบ™เบ•เบปเบงเปเบ—เบ™เบˆเบฑเบ”เบเบฒเบ™เบเบฑเบšเบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™. 

เบžเบงเบเป€เบฎเบปเบฒเบเบฑเบ‡เป„เบ”เป‰เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบ—เบปเบ”เบชเบญเบšเบเบฒเบ™เป‚เบซเบผเบ”เบเปˆเบญเบ™เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰. เบœเบปเบ™เป„เบ”เป‰เบฎเบฑเบšเบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰:

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 reverse proxy เปเบฅเบฐเบšเปเปˆเบกเบต. เบžเบงเบเป€เบฎเบปเบฒ "เบ–เบญเบ" เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™เปƒเบ™เบ—เป‰เบญเบ‡เบ–เบดเปˆเบ™เป€เบžเบทเปˆเบญเบเปเบฒเบˆเบฑเบ” "เบเบฒเบ™เปเบŠเบเปเบŠเบ‡" เปƒเบ™เบญเบปเบ‡เบ›เบฐเบเบญเบšเบฅเบฐเบ”เบฑเบšเบเบฒเบ‡.

เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เบ”เป‰เบงเบเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™ ESNI เปเบฅเบฐ proxying เบเบฑเบš upstream เบˆเบฒเบ HTTP, เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ›เบฐเบกเบฒเบ™ ~ 550 rps เบˆเบฒเบเบ•เบปเบงเบขเปˆเบฒเบ‡เบซเบ™เบถเปˆเบ‡, เบ”เป‰เบงเบเบเบฒเบ™เบšเปเบฅเบดเป‚เบžเบ CPU / RAM เบชเบฐเป€เบฅเปˆเบเบ‚เบญเบ‡ ESNI reverse proxy:

  • เบเบฒเบ™เปƒเบŠเป‰ CPU 80% (4 vCPU, เป‚เบฎเบช RAM 4 GB, Linux)
  • 130 MB Mem RSS

เบงเบดเบ—เบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡เป€เบงเบฑเบšเป„เบŠเบ—เปŒเบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเบ‚เบญเบ‡เบ—เปˆเบฒเบ™เบ”เป‰เบงเบ ESNI

เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เบ›เบฝเบšเบ—เบฝเบš, RPS เบชเปเบฒเบฅเบฑเบš nginx upstream เบ”เบฝเบงเบเบฑเบ™เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เบชเบดเป‰เบ™เบชเบธเบ” TLS (HTTP protocol) เปเบกเปˆเบ™ ~ 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 

เบเบฒเบ™เบกเบตเป€เบงเบฅเบฒเปเบปเบ”เป€เบงเบฅเบฒเบŠเบตเป‰เบšเบญเบเบงเปˆเบฒเบกเบตเบเบฒเบ™เบ‚เบฒเบ”เปเบ„เบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™ (เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เปƒเบŠเป‰ vCPU 4 เป‚เบ•, RAM 4 GB hosts, Linux), เปเบฅเบฐเปƒเบ™เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบˆเบดเบ‡เปเบฅเป‰เบง RPS เบ—เบตเปˆเบกเบตเบ—เปˆเบฒเปเบฎเบ‡เปเบกเปˆเบ™เบชเบนเบ‡เบเบงเปˆเบฒ (เบžเบงเบเป€เบฎเบปเบฒเป„เบ”เป‰เบฎเบฑเบšเบ•เบปเบงเป€เบฅเบเบชเบนเบ‡เป€เบ–เบดเบ‡ 2700 RPS เปƒเบ™เบŠเบฑเบšเบžเบฐเบเบฒเบเบญเบ™เบ—เบตเปˆเบกเบตเบ›เบฐเบชเบดเบ”เบ—เบดเบžเบฒเบšเบซเบผเบฒเบเบเบงเปˆเบฒ).

เบชเบฐเบซเบฅเบธเบšเบฅเบงเบกเปเบฅเป‰เบง, เบ‚เป‰เบฒเบžเบฐเป€เบˆเบปเป‰เบฒเบชเบฑเบ‡เป€เบเบ”เป€เบซเบฑเบ™ เบงเปˆเบฒเป€เบ—เบเป‚เบ™เป‚เบฅเบเบต ESNI เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบ”เบตเบซเบผเบฒเบ. เบเบฑเบ‡เบกเบตเบซเบผเบฒเบเบ„เปเบฒเบ–เบฒเบกเป€เบ›เบตเบ”, เบ•เบปเบงเบขเปˆเบฒเบ‡, เบšเบฑเบ™เบซเบฒเบ‚เบญเบ‡เบเบฒเบ™เป€เบเบฑเบšเบฎเบฑเบเบชเบฒเบเบฐเปเบˆ ESNI เบชเบฒเบ—เบฒเบฅเบฐเบ™เบฐเปƒเบ™ DNS เปเบฅเบฐ rotating เบเบฐเปเบˆ ESNI - เบšเบฑเบ™เบซเบฒเป€เบซเบผเบปเปˆเบฒเบ™เบตเป‰เป„เบ”เป‰เบ–เบทเบเบ›เบถเบเบชเบฒเบซเบฒเบฅเบทเบขเปˆเบฒเบ‡เบˆเบดเบ‡เบˆเบฑเบ‡, เปเบฅเบฐเบชเบฐเบšเบฑเบšเบซเบฅเป‰เบฒเบชเบธเบ”เบ‚เบญเบ‡เบฎเปˆเบฒเบ‡ ESNI (เปƒเบ™เป€เบงเบฅเบฒเบ‚เบฝเบ™) เปเบกเปˆเบ™เปเบฅเป‰เบง. 7.

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เบŠเบทเป‰เป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบชเปเบฒเบฅเบฑเบšเป€เบงเบฑเบšเป„เบŠเบ—เปŒเบ—เบตเปˆเบกเบตเบเบฒเบ™เบ›เบปเบเบ›เป‰เบญเบ‡ DDoS, เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ VPS VDS ๐Ÿ”ฅ เบŠเบทเป‰เป€เบงเบฑเบšเป„เบŠเบ—เปŒเป‚เบฎเบ”เบ•เบดเป‰เบ‡เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เบ”เป‰เบงเบเบเบฒเบ™เบ›เป‰เบญเบ‡เบเบฑเบ™ DDoS, เป€เบŠเบตเบšเป€เบงเบต VPS VDS | ProHoster