áááºá¹ááá¬áá« Habr áá«á·áá¬ááẠIlya áá«á Exness ááŸá¬ platform team ááŸá¬á¡áá¯ááºáá¯ááºáá«áááºá áá»áœááºá¯ááºááá¯á·á áá¯ááºáá¯ááºááœá¶á·ááŒáá¯ážááá¯ážáááºáá±ážá¡ááœá²á·áá»á¬ážá¡áá¯á¶ážááŒá¯ááá·áº á¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááá¯ááºáᬠá¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á· áá®ááœááºá¡áá±á¬ááºá¡áááºáá±á¬áºáá«áááºá
á€áá±á¬ááºážáá«ážááœááºá á¡áá»á¬ážáá°ááŸá¬ áááºááá¯ááºáá»á¬ážá á¡ááŒá±áá¶á¡áá±á¬ááºá¡áŠáá»á¬ážááœáẠáá¯ááºááŸááºáá¬ážáá±á¬ SNI (ESNI) áááºážááá¬ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá á¡ááœá±á·á¡ááŒá¯á¶ááᯠáá»áŸáá±ááá¯áá«áááºá

á€áááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯ááŒááºážááẠá¡áá»á¬ážáá°ááŸá¬ áááºááá¯ááºáá
áºáá¯ááŸáá·áº áá¯ááºáá±á¬ááºáá±á¬á¡áá«ááœáẠáá¯á¶ááŒá¯á¶áá±ážá¡ááá·áºááᯠááá¯ážááŒáá·áºá
á±ááŒá®áž áá¯áá¹ááá®á០áá»ááŸááºáá¬ážáá±á¬ ááŒááºááœááºážáá¯á¶ááŒá¯á¶áá±áž á
á¶ááŸá¯ááºážáá»á¬ážááᯠááá¯ááºáá¬áááºááŒá
áºáááºá
ááááá¯á¶ážá¡áá±áá²á· áá»áœááºáá±á¬áº áá±á¬ááºááŒáá»ááºáá¬á áááºážááá¬áᬠá á¶áá»áááºá á¶ááœáŸááºážááá®áá±ážáá² á¡ááŒááºážáá»ááºážááŒá áºáá±áá¯ááºážáá²á áá«áá±ááá·áº CloudFlare áá²á· Mozilla ááá¯á·á á¡á²áá«ááᯠáá¶á·ááá¯ážáá¬ážááŒá®ážáá¬áž ( ) á€áááºááŸá¬ á ááºážáááºááŸá¯áá áºáá¯ááŒá¯áá¯ááºááẠáá»áœááºá¯ááºááá¯á·ááᯠááŸá¯á¶á·áá±á¬áºáá±ážááá·áºá¡áá¬ááŒá áºáááºá
áá®á¡áá¯áá®ááá áºá¥á®ážááááºážáááºáž
ESNI - ááẠ"Client Hello" TLS áááºááœá²áááºáá±á·áá»áºááœáẠSNI ááᯠá á¬ááŸááºááá¯ááºá á±ááá·áº TLS 1.3 áááá¯ááá¯áá±á¬á ááá¯ážáá»á²á·ááŸá¯áá áºáá¯ááŒá áºáááºá á€áááºááŸá¬ ESNI áá¶á·ááá¯ážááŸá¯ááŒáá·áº Client Hello ááŸáá·áºáá°ááẠ(áá¯á¶ááŸáẠSNI á¡á á¬áž ESNI ááᯠáá»áœááºá¯ááºááá¯á·ááŒááºááááº)á

ESNI ááá¯á¡áá¯á¶ážááŒá¯ááẠá¡á
áááºá¡ááá¯ááºážáá¯á¶ážáᯠááá¯á¡ááºáááº-
- DNS;
- áá±á¬ááºáááºáá±á¬ááºáá¶ááŸá¯;
- áá¬áá¬áááºááŒááºážáá¶á·ááá¯ážááŸá¯á
DNS ááá¯
DNS ááŸááºáááºážááŸá áºáá¯ááᯠááá·áºááẠááá¯á¡ááºáááº- AááŸáá·áº TXT (TXT ááŸááºáááºážááœáẠáááá¯ááºážááá·áºá SNI ááᯠá á¬ááŸááºááá¯ááºááá·áº á¡áá»á¬ážáá°ááŸá¬áá±á¬á·áá«ááŸááááº) â á¡á±á¬ááºááœááºááŒáá·áºáá«á ááá¯á·á¡ááŒáẠáá¶á·ááá¯ážááŸá¯áááºáž ááŸáááá·áºáááºá DOH áááŸáááá¯ááºáá±á¬ client áá»á¬ážááẠDoH ááá«áá² ESNI áá¶á·ááá¯ážááŸá¯ááᯠ(á¡á±á¬ááºááœááºááŒáá·áºáá«) ááŒá áºáá±á¬ááŒá±á¬áá·áº (DNS ááŸáááá·áº HTTPS)á ESNI ááẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áá±áá±á¬ á¡áááºážá¡ááŒá áºá¡áááºá¡á¬áž áá¯ááºááŸááºááŒááºážááᯠáá±á¬áºááœáŸááºážáá±á¬ááŒá±á¬áá·áºá ááá¯ááá¯áááºááŸá¬ UDP á០DNS ááᯠáááºáá±á¬ááºá¡áá¯á¶ážááŒá¯ááŒááºážááẠá¡áááá¹áá¬ááºáááŸááá±á ááá¯á·á¡ááŒáẠá¡áá¯á¶ážááŒá¯ á€á¡ááŒá±á¡áá±ááœáẠááá·áºá¡á¬áž áááºááŸáºá¡ááááºááá·áºááá¯ááºááá¯ááºááŸá¯áá»á¬ážááᯠáá¬ááœááºááá¯ááºá á±áá«áááºá
áá±á¬áá±á¬ááẠáááá¯ááºáá«áááºá , áá°ááá¯á·áá²ááœááº:
CloudFlare áááºážááá¯á·ááá¬áá¬áá»á¬ážááẠDNS ááŸá CloudFlare áá¬áá¬áá»á¬ážá¡ááœáẠáá»áœááºá¯ááºááá¯á·ááœáẠá¡áááºážáá¯á¶áž ááŸááºáááºážááŸá áºáá¯ááŸáááẠ- A ááŸáá·áº TXT ááá¯á·ááᯠáááºážááá¯á·ááá¬áá¬áá»á¬ážá áá¶á·ááá¯ážáá¬ážááŒá®ážááŒá áºááŒá±á¬ááºáž (áá»áœááºá¯ááºááá±á¬ááºáᬠâ áá¯ááºááŸááºáá¬ážáá±á¬ SNI â áá±á¬ááºáááºáá±á·áá¬áááº) ááá¯á á áºáá±ážáá«)á á¡á±á¬ááºáá±á¬áºááŒáá« á¥ááá¬ááœááºá áá»áœááºá¯ááºááá¯á·ááẠ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 áá¶á·ááá¯ážááŸá¯á¡á¬áž áááºááá¯á·á¡áááºááœááºážááááºáááºáž áááºážááœáŸááºáá»ááºáá»á¬ážááᯠáá±ážáá¬ážáááºá browser ááᯠconfigure áá¯ááºááŒá®ážáá±á¬ááºá áá»áœááºá¯ááºááá¯á·ááẠá€áá²á·ááá¯á·áá±á¬ á¡áá¬áá»á¬ážááᯠááŒááºááá«áááºá

browser ááá¯á
á
áºáá±ážáááºá
ESNI ááẠTLS 1.3 ááá¯á· ááá¯ážáá»á²á·ááŸá¯áá áºáá¯ááŒá áºáá±á¬ááŒá±á¬áá·áº ESNI ááá¯áá¶á·ááá¯ážáááºá¡ááœáẠTLS 1.3 ááá¯á¡áá¯á¶ážááŒá¯ááá«áááºá
ESNI áá¶á·ááá¯ážááŸá¯ááŒáá·áº backend ááá¯á ááºážáááºáááºáááºááœááºáá»ááºá¡ááœááºá áá»áœááºá¯ááºááá¯á·ááẠclient áá áºáá¯ááᯠá áááºá¡áá±á¬ááºá¡áááºáá±á¬áºáá²á·áááºá goááá«áá±ááá·áºáá±á¬ááºááŸá
áá¬áá¬áááºááŒááºážáá¶á·ááá¯ážááŸá¯
áá±á¬áá±á¬áááºááœáẠESNI ááᯠááá¬ážáááºááá¶á·ááá¯ážááá¯ááºáá±á¬ OpenSSL/BoringSSL ááŸáá áºááá·áº TLS ááŸáá·áºá¡áá¯ááºáá¯ááºáá±á¬ááŒá±á¬áá·áº nginx/apache áá²á·ááá¯á·áá±á¬ áááºáá¬áá¬áá»á¬ážá ááá¶á·ááá¯ážááá¯ááºáá«á
ááá¯á·ááŒá±á¬áá·áº áá»áœááºá¯ááºááá¯á·ááẠTLS 1.3 ááᯠESNI ááŒáá·áºáááºá á²ááŒá®áž ESNI ááá¯ááá¶á·ááá¯ážááá¯ááºáá±á¬ HTTP(S) á¡ááœá¬ážá¡áá¬ááᯠáá¶á·ááá¯ážáá±ážááá·áº áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºááŸá±á·áá¯á¶ážá¡á áááºá¡ááá¯ááºáž (ESNI ááŒá±á¬ááºážááŒááºááá±á¬ááºá á®) ááá¯áááºáá®ážááẠáá¯á¶ážááŒááºááá¯ááºáá«áááºá áááºážááẠESNI ááá¯ááá¶á·ááá¯ážáá±á¬ áááºááŸááááºáá¬áá¬áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á¡áááá¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠáááŒá±á¬ááºážáá²áá²á ááŸáááŒá®ážáá¬ážá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶ááœáẠáááºážááá¬ááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáááºá
ááŸááºážááŸááºážáááºážáááºážáááááºá á€áááºááŸá¬ áá¯á¶ááŒááºážáá áºáá¯ááŒá áºáááºá

ESNI ááá«áá² áá±á¬ááºáááºáá»á¬ážááᯠáá¶á·ááá¯ážáá±ážáááºá¡ááœáẠESNI ááá«áá² TLS áá»áááºáááºááŸá¯ááᯠá¡áá¯á¶ážáááºááá¯ááºááá·áºá
áœááºážáááºááŒáá·áº ááá±á¬ááºá
á®ááᯠáá®ááá¯ááºážáá¯ááºáá¬ážááŒá±á¬ááºáž ááŸááºáá¬ážááá¯áá«áááºá ááá¯á·á¡ááŒááºá á¡áááºá
á®ážááŒá±á¬ááºážááŸáá·áº áááºááœááºááŒááºážá¡ááœáẠáááá¯ááá¯áá±á¬ááẠ1.3 á¡á±á¬áẠTLS áá¬ážááŸááºážááŒáá·áº HTTP ááá¯á·ááá¯áẠHTTPS ááŒá
áºááá¯ááºááẠ(á¡áááºá
á®ážááŒá±á¬ááºážááẠ1.3 ááᯠááá¶á·ááá¯ážáá«á)á á€á¡á
á®á¡á
á¥áºááẠá¡ááŒáá·áºáá¯á¶ážááŒá±á¬ááºážááœááºááŒááºááœááºáá±ážáááºá
ESNI áá¶á·ááá¯ážááŸá¯á¡áá±á«áº á¡áá±á¬ááºá¡áááºáá±á¬áºááŒááºážá go áá«ááá¯á·áá®ááá»á±ážáááºá . áááºážááẠá á¶á á¬ááŒáá·áºááá¯ááºááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáááºááœáŸááºážáá±á¬ááŒá±á¬áá·áº á¡áá±á¬ááºá¡áááºáá±á¬áºááŸá¯ááá¯ááºááá¯ááºá á¡áá±ážá¡ááœá²ááá¯ááºááŒá±á¬ááºáž áá»áœááºá¯ááºáá»ááºáá»ááºážáááááŒá¯áááá«áááºá crypto/tls ááá¯á·ááŒá±á¬áá·áº "patching" ááá¯á¡ááºááẠGOROOT á á¯áá±ážááŒááºážáááŒá¯áá®á
ESNI áá±á¬á·áá»á¬ážáá¯ááºáá¯ááºááẠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áá²á·áááºá (CloudFlare áááºáá®ážááŸá¯áááºáž)á á€áá±á¬á·áá»á¬ážááᯠSNI á
á¬ááŸááº/á
á¬ááŸááºááẠá¡áá¯á¶ážááŒá¯áá«áááºá
go 1.13 ááá¯áá¯á¶ážááŒá®áž build ááá¯á
ááºážáááºáá²á·áá«áááºá Linux (Debian, Alpine) ááŸáá·áº MacOSá
áá¯ááºáááºážáááºáááºááŸá¯á¡ááºá¹áá«áááºáá»á¬ážá¡ááŒá±á¬ááºáž á áá¬ážáá¯á¶ážá¡áááºážáááº
ESNI ááŒá±á¬ááºážááŒááºááá±á¬ááºá á®ááẠrpsá áá±á á®ážááŒá±á¬ááºážáá±á«áºáá±áá»áááºááŸáá·áº áá¯á¶á·ááŒááºááŸá¯áá¯ááºáá»á¬ážá áá¡á±á¬ááºááŒááº/á¡á±á¬ááºááŒááºáá±á¬ TLS áááºááœá²ááŒááºážáá»á¬ážááŸáá·áº TLS áááºááœá²ááŒá¬áá»áááºáá²á·ááá¯á·áá±á¬ áááºááá áºáá»á¬ážááᯠPrometheus áá±á¬áºáááºááœáẠáá¶á·ááá¯ážáá±ážáá«áááºá ááááá áºáá»ááºááœááºá á€á¡áá¬ááẠááá±á¬ááºá á®ááẠáá¬ááºá¡ááœá¬ážá¡áá¬ááᯠáááºááá¯á·ááá¯ááºááœááºáááºááᯠá¡áá²ááŒááºááẠáá¯á¶áá±á¬ááºáá¯á¶ááááºá
á¡áá¯á¶ážáááŒá¯áá®ááœááºáááºáž áá»áœááºá¯ááºááá¯á·ááẠload test áá»á¬ážááŒá¯áá¯ááºáá²á·áá«áááºá ááááºáá»á¬ážááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááº-
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 ááŒá±á¬ááºážááŒáẠproxy ááŸáá·áº ááŸáá¯ááºážááŸá¥áºááẠá¡áááºá¡ááœá±ážááŒáá·áºááá±á¬ áááºá ááºážáááºááŒááºáž áááºáááºááŒá¯áá¯ááºáá²á·áá«áááºá á¡áááºá¡áááºá¡á áááºá¡ááá¯ááºážáá»á¬ážááœáẠ"áááºáá±á¬ááºá áœááºáááºááŒááºáž" ááá¯áááºááŸá¬ážááẠáá»áœááºá¯ááºááá¯á·ááẠá¡ááœá¬ážá¡áá¬ááᯠáá±áá¡ááá¯áẠ"ááœááºážáá±á¬ááºážááŒááºáž" ááŒá áºáááºá
ááá¯á·ááŒá±á¬áá·áº ESNI áá¶á·ááá¯ážááŸá¯ááŸáá·áº HTTP ááŒáá·áº á¡áááºá á®ážááŒá±á¬ááºážááŒá¬ážáá¶áá¯ááºáá±á¬ááºááŒááºážááŒáá·áºá áá»áœááºá¯ááºááá¯á·ááẠESNI ááŒá±á¬ááºážááŒááºááá±á¬ááºá á®á áá»ááºážáá»áŸ CPU/RAM áá¯á¶ážá áœá²ááŸá¯ááŸáá·áºá¡áá°á á¥ááá¬áá áºáá¯á០~550 rps áááºážáá»ááºáááŸááááºá
- áá% CPU á¡áá¯á¶ážááŒá¯ááŸá¯ (vCPU á áá¯á RAM host á áá¯á Linux)
- 130 MB Mem RSS

ááŸáá¯ááºážááŸááºáááºá¡ááœáẠTLS áááºá
á²ááŒááºážáááŸááá² áá°áá®áá±á¬ nginx á¡áááºááá¯ááºážá¡ááœáẠRPS (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
timeout áá»á¬ážááŸááá±ááŒááºážááẠá¡áááºážá¡ááŒá áºáá»á¬áž áá»áá¯á·áá²á·áá±ááŒá±á¬ááºáž ááœáŸááºááŒááẠ(áá»áœááºá¯ááºááá¯á·ááẠvCPU á áá¯á RAM host á áá¯ááᯠá¡áá¯á¶ážááŒá¯áá²á·áááº)á Linux) ááááºáá±á¬á· á¡áá¬ážá¡áá¬ááŸááá²á· RPS á ááá¯ááŒáá·áºáá«ááẠ(ááá¯á¡á¬ážáá±á¬ááºážáá²á· á¡áááºážá¡ááŒá áºááœá±ááŸá¬ 2700 RPS á¡áá ááááºážááááºážááœá± áááŸááá²á·áá«áááº)á
áááá¯á¶ážáá»á¯ááºá¡áá±áá²á· ááŸááºáá¬ážáá»ááºáá«áááºá ESNI áááºážááá¬ááẠá¡ááœááºá¡áá¬ážá¡áá¬áá±á¬ááºážáá¯á¶ááááºá á¡ááœáá·áºáá±ážááœááºážáá»á¬ážá
áœá¬ááŸááá«áá±ážáááºá á¥ááá¬á¡á¬ážááŒáá·áºá DNS ááœáẠá¡áá»á¬ážáá°ááŸá¬ ESNI áá±á¬á·ááᯠááááºážáááºážááŒááºážááŸáá·áº ESNI áá±á¬á·áá»á¬ážááᯠááŸáá·áºááŒááºážááá¯ááºáᬠááŒá¿áá¬áá»á¬áž - á€ááŒá¿áá¬áá»á¬ážááᯠáááºááŒáœá
áœá¬ ááœá±ážááœá±ážáá¬ážááŒá®áž ESNI á áá±á¬ááºáá¯á¶ážáá¬ážááŸááºáž (á
á¬áá±ážáá±áá»áááºááœááº) áá°ááŒááºážááẠááŸáááŸáá·áºááŒá®ážááŒá
áºáááºá .
source: www.habr.com
