Pehea e pale ai i kāu pūnaewele lehulehu me ESNI

Aloha Habr, ʻo Ilya koʻu inoa, hana wau i ka hui kahua ma Exness. Hoʻomohala a hoʻokō mākou i nā ʻāpana ʻōnaehana kumu e hoʻohana ai kā mākou hui hoʻomohala huahana.

Ma kēia ʻatikala, makemake wau e kaʻana like i koʻu ʻike no ka hoʻokō ʻana i ka ʻenehana SNI (ESNI) i hoʻopili ʻia i ka ʻenehana o nā pūnaewele lehulehu.

Pehea e pale ai i kāu pūnaewele lehulehu me ESNI

ʻO ka hoʻohana ʻana i kēia ʻenehana e hoʻonui i ke kiʻekiʻe o ka palekana i ka wā e hana ai me kahi pūnaewele lehulehu a hoʻokō i nā kūlana palekana kūloko i hāpai ʻia e ka Hui.

ʻO ka mea mua, makemake wau e kuhikuhi ʻaʻole i hoʻohālikelike ʻia ka ʻenehana a aia nō i loko o ka draft, akā ua kākoʻo ʻo CloudFlare a me Mozilla iā ia (i ka kikoo01). Na kēia i hoʻoikaika iā mākou no ia hoʻokolohua.

Keʻano o ka manaʻo

ESNI he hoʻonui i ka protocol TLS 1.3 e hiki ai ke hoʻopili ʻia ʻo SNI ma ka leka lima TLS "Client Hello". Eia ke ʻano o ka Client Hello me ke kākoʻo ESNI (ma kahi o ka SNI maʻamau a mākou e ʻike ai iā ESNI):

Pehea e pale ai i kāu pūnaewele lehulehu me ESNI

 No ka hoʻohana ʻana iā ESNI, pono ʻoe i ʻekolu ʻāpana:

  • DNS; 
  • Kākoʻo mea kūʻai aku;
  • Kākoʻo ʻaoʻao kikowaena.

pākuʻina kau

Pono ʻoe e hoʻohui i ʻelua mau moʻolelo DNS - Aa TXT (Loaʻa i ka moʻolelo TXT ke kī lehulehu e hiki ai i ka mea kūʻai ke hoʻopili i ka SNI) - e ʻike ma lalo. Eia kekahi, pono ke kākoʻo ʻO DoH (DNS ma luna o HTTPS) no ka mea, ʻaʻole hiki i nā mea kūʻai aku (nānā ma lalo) ke kākoʻo ESNI me ka ʻole o DoH. He kūpono kēia, ʻoiai ʻo ESNI e pili ana i ka hoʻopili ʻana i ka inoa o ka kumuwaiwai a mākou e komo ai, ʻo ia hoʻi, ʻaʻole kūpono ke komo i ka DNS ma luna o UDP. Eia kekahi, ka hoʻohana DNSSEC hiki iā ʻoe ke pale aku i ka hoʻouka ʻana i nā mea make i loko o kēia ʻano.

Loaʻa i kēia manawa kekahi mau mea hoʻolako DoH, ma waena o lākou:

CloudFlare 'ōlelo (E nānā i kaʻu Pūnaewele → Hoʻopili ʻia SNI → E aʻo hou) ua kākoʻo kā lākou mau kikowaena iā ESNI, ʻo ia hoʻi, no nā kikowaena CloudFlare i ka DNS loaʻa iā mākou ʻelua mau moʻolelo - A a me TXT. Ma ka laʻana ma lalo nei mākou e nīnau iā Google DNS (ma luna o HTTPS): 

А komo:

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 hoʻopaʻa moʻolelo, hana ʻia ke noi e like me ke ʻano hoʻohālike _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."
}

No laila, mai kahi hiʻohiʻona DNS, pono mākou e hoʻohana i ka DoH (ʻoi aku ka maikaʻi me DNSSEC) a hoʻohui i ʻelua mau helu. 

Kākoʻo mea kūʻai aku

Inā mākou e kamaʻilio e pili ana i nā polokalamu kele pūnaewele, a laila i kēia manawa hoʻokō ʻia ke kākoʻo ma FireFox wale nō. he mea Eia nā ʻōlelo aʻo e pili ana i ka hoʻā ʻana i ke kākoʻo ESNI a me DoH ma FireFox. Ma hope o ka hoʻonohonoho ʻana i ka polokalamu kele pūnaewele, pono mākou e ʻike i kahi mea e like me kēia:

Pehea e pale ai i kāu pūnaewele lehulehu me ESNI

loulou e nānā i ka polokalamu kele pūnaewele.

ʻOiaʻiʻo, pono e hoʻohana ʻia ʻo TLS 1.3 e kākoʻo iā ESNI, no ka mea, he hoʻonui ʻia ʻo ESNI i TLS 1.3.

No ka hoʻāʻo ʻana i ka hope me ke kākoʻo ESNI, ua hoʻokō mākou i ka mea kūʻai aku ma go, Akā, ʻoi aku ma hope.

Kākoʻo ʻaoʻao kikowaena

I kēia manawa, ʻaʻole kākoʻo ʻia ʻo ESNI e nā kikowaena pūnaewele e like me nginx/apache, a me nā mea ʻē aʻe, no ka mea, hana pū lākou me TLS ma o OpenSSL/BoringSSL, ʻaʻole i kākoʻo i ka ESNI.

No laila, ua hoʻoholo mākou e hana i kā mākou mea ponoʻī mua (ESNI reverse proxy), e kākoʻo ana i ka hoʻopau ʻana o TLS 1.3 me ka ESNI a me ka proxy HTTP(S) traffic i ka upstream, ʻaʻole ia e kākoʻo iā ESNI. ʻAe kēia i ka ʻenehana e hoʻohana ʻia i loko o kahi ʻenehana i loaʻa, me ka hoʻololi ʻole i nā mea nui - ʻo ia hoʻi, me ka hoʻohana ʻana i nā kikowaena pūnaewele o kēia manawa i kākoʻo ʻole iā ESNI. 

No ka akaka, eia kahi kiʻi:

Pehea e pale ai i kāu pūnaewele lehulehu me ESNI

Hoʻomaopopo wau ua hoʻolālā ʻia ka mea koho me ka hiki ke hoʻopau i kahi pilina TLS me ka ʻole o ESNI, e kākoʻo i nā mea kūʻai aku me ka ʻole o ESNI. Eia kekahi, ʻo ka protocol kamaʻilio me ka upstream hiki ke HTTP a i ʻole HTTPS me kahi mana TLS haʻahaʻa ma mua o 1.3 (inā ʻaʻole kākoʻo i ka upstream 1.3). Hāʻawi kēia papahana i ka hiki ke maʻalahi.

Hoʻokō i ke kākoʻo ESNI ma go aie mai makou CloudFlare. Makemake au e hoʻomaopopo koke i ka hoʻokō pono ʻole ʻana, no ka mea, pili ia i nā loli i ka waihona maʻamau. crypto/tls a no laila pono ke "patching" GOROOT mamua o ka hui ana.

No ka hana ʻana i nā kī ESNI ua hoʻohana mākou esnitool (ʻo ia hoʻi ka brainchild o CloudFlare). Hoʻohana ʻia kēia mau kī no ka SNI encryption/decryption.
Ua hoʻāʻo mākou i ke kūkulu me ka hoʻohana ʻana i ka go 1.13 ma Linux (Debian, Alpine) a me MacOS. 

He mau huaʻōlelo e pili ana i nā hiʻohiʻona hana

Hāʻawi ka ESNI reverse proxy i nā ana ma ke ʻano Prometheus, e like me rps, upstream latency a me nā code pane, hāʻule/kūpono nā lima lima TLS a me ka lōʻihi o ka lulu lima TLS. I ka nānā mua ʻana, ua lawa kēia e loiloi i ke ʻano o ka lawelawe ʻana o ka proxy i nā kaʻa. 

Ua hana pū mākou i ka hoʻāʻo ukana ma mua o ka hoʻohana ʻana. Nā hualoaʻa ma lalo nei:

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 

Ua hana mākou i ka hoʻāʻo ʻana i ka ukana qualitative e hoʻohālikelike i ka hoʻolālā me ka hoʻohana ʻana i ka proxy reverse ESNI a me ka ʻole. Ua "ninini" mākou i nā kaʻa ma ka ʻāina i mea e hoʻopau ai i ka "interference" i nā ʻāpana waena.

No laila, me ke kākoʻo ESNI a me ke koho ʻana i ka upstream mai HTTP, ua loaʻa iā mākou ma kahi o ~ 550 rps mai hoʻokahi manawa, me ka awelika CPU / RAM o ka ESNI reverse proxy:

  • 80% Hoʻohana CPU (4 vCPU, 4 GB RAM pūʻali, Linux)
  • 130 MB Mem RSS

Pehea e pale ai i kāu pūnaewele lehulehu me ESNI

No ka hoʻohālikelike ʻana, ʻo RPS no ka nginx like i luna me ka ʻole o ka TLS (HTTP protocol) hoʻopau ʻo ~ 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 

Hōʻike ka hele ʻana o nā manawa i ka nele o nā kumuwaiwai (ua hoʻohana mākou i 4 vCPUs, 4 GB RAM hosts, Linux), a ʻoiaʻiʻo, ʻoi aku ka kiʻekiʻe o ka RPS (ua loaʻa iā mākou nā helu a hiki i 2700 RPS ma nā kumuwaiwai ʻoi aku ka ikaika).

I ka hopena, ʻike wau ʻIke maikaʻi loa kēlā ʻenehana ESNI. Nui nā nīnau hāmama, no ka laʻana, nā pilikia o ka mālama ʻana i ka kī ESNI lehulehu i ka DNS a me ka hoʻololi ʻana i nā kī ESNI - ke kūkākūkā ikaika ʻia nei kēia mau pilikia, a ʻo ka mana hou loa o ka ESNI draft (i ka manawa kākau) 7.

Source: www.habr.com

Pākuʻi i ka manaʻo hoʻopuka