Салом Ҳабр, номи ман Иля, ман дар гурӯҳи платформа дар Exness кор мекунам. Мо ҷузъҳои асосии инфрасохториро, ки гурӯҳҳои таҳияи маҳсулоти мо истифода мебаранд, таҳия ва татбиқ мекунем.
Дар ин мақола ман мехоҳам таҷрибаи худро оид ба татбиқи технологияи рамзгузоришудаи SNI (ESNI) дар инфрасохтори вебсайтҳои ҷамъиятӣ мубодила кунам.

Истифодаи ин технология сатҳи амниятро ҳангоми кор бо вебсайти ҷамъиятӣ афзоиш медиҳад ва ба стандартҳои амнияти дохилии аз ҷониби ширкат қабулшуда мувофиқат мекунад.
Пеш аз ҳама, ман мехоҳам қайд намоям, ки технология стандартизатсия нашудааст ва ҳоло ҳам дар лоиҳа аст, аммо CloudFlare ва Mozilla аллакай онро дастгирӣ мекунанд (дар ). Ин моро ба чунин озмоиш водор кард.
Якчанд назария
ЭСНИ тамдиди протоколи TLS 1.3 мебошад, ки имкон медиҳад рамзгузории SNI дар паёми дастфишори TLS "Client Hello". Ин аст Client Hello бо дастгирии ESNI чӣ гуна ба назар мерасад (ба ҷои SNI муқаррарии мо ESNI-ро мебинем):

Барои истифодаи ESNI ба шумо се ҷузъ лозим аст:
- DNS;
- Дастгирии муштарӣ;
- Дастгирии тарафи сервер.
DNS
Шумо бояд ду сабти DNS илова кунед - Aва TXT (Сабти TXT дорои калиди оммавӣ мебошад, ки муштарӣ метавонад SNI-ро рамзгузорӣ кунад) - ба поён нигаред. Илова бар ин, бояд дастгирӣ бошад DoH (DNS тавассути HTTPS) зеро муштариёни дастрас (нигаред ба поён) бе DoH дастгирии ESNI-ро фаъол намекунанд. Ин мантиқист, зеро ESNI рамзгузории номи манбае, ки мо дастрас мекунем, дар назар дорад, яъне дастрасӣ ба DNS тавассути UDP маъно надорад. Илова бар ин, истифодаи ба шумо имкон медиҳад, ки дар ин сенария аз ҳамлаҳои заҳролудшавии кэш муҳофизат кунед.
Дар айни замон дастрас , дар байни онҳо:
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) ва ду вуруд илова кунем.
Дастгирии муштариён
Агар мо дар бораи браузерҳо сухан ронем, пас дар айни замон . Дар ин ҷо дастурҳо оид ба фаъол кардани дастгирии ESNI ва DoH дар FireFox мавҷуданд. Пас аз танзим кардани браузер, мо бояд чунин чизеро бубинем:

барои тафтиш кардани браузер.
Албатта, 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-ро дастгирӣ намекунанд, истифода шавад.
Барои равшанӣ, ин диаграмма аст:

Ман қайд мекунам, ки прокси бо қобилияти қатъ кардани пайвасти TLS бе ESNI, барои дастгирии мизоҷон бидуни ESNI тарҳрезӣ шудааст. Инчунин, протоколи иртибот бо болооб метавонад HTTP ё HTTPS бо версияи TLS камтар аз 1.3 бошад (агар болооб 1.3-ро дастгирӣ накунад). Ин схема чандирии максималиро медиҳад.
Амалисозии дастгирии ESNI дар go аз карз гирифтем . Ман мехоҳам фавран қайд намоям, ки худи татбиқ хеле ночиз аст, зеро он тағиротро дар китобхонаи стандартӣ дар бар мегирад крипто/тлс ва аз ин рӯ, "ҷасбкунӣ" -ро талаб мекунад Горот пеш аз чамъомад.
Барои тавлиди калидҳои ESNI мо истифода бурдем (инчунин ташаббуси CloudFlare). Ин калидҳо барои рамзгузории SNI/рамзкушой истифода мешаванд.
Мо сохторро бо истифода аз go 1.13 дар он санҷидаем. Linux (Debian, Алп) ва 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 rpps ба даст овардем, ки истеъмоли миёнаи CPU/RAM-и прокси баръакси ESNI:
- 80% истифодаи CPU (4 vCPU, 4 ГБ RAM хостҳо, Linux)
- 130 МБ хотираи RSS

Барои муқоиса, 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 ГБ RAM истифода кардем, Linux), ва дар асл RPS-и эҳтимолӣ баландтар аст (мо рақамҳоро то 2700 RPS дар захираҳои пуриқтидортар гирифтем).
Дар хотима кайд мекунам ки технологияи ESNI хеле умедбахш менамояд. Ҳанӯз бисёр саволҳои кушода мавҷуданд, масалан, масъалаҳои нигоҳдории калиди ҷамъиятии ESNI дар DNS ва гардиши калидҳои ESNI - ин масъалаҳо фаъолона муҳокима карда мешаванд ва версияи охирини лоиҳаи ESNI (дар вақти навиштан) аллакай .
Манбаъ: will.com
