ืฉืืื ืืืจ, ืฉืื ืืืืื, ืื ื ืขืืื ืืฆืืืช ืืคืืืคืืจืื ืืืงืกื ืก. ืื ื ืืคืชืืื ืืืืืฉืืื ืืช ืจืืืื ืืชืฉืชืืช ืืืจืืืืื ืฉืืื ืืฉืชืืฉืื ืฆืืืชื ืคืืชืื ืืืืฆืจืื ืฉืื ื.
ืืืืืจ ืื, ืืจืฆืื ื ืืืืืง ืืช ืื ืืกืืื ืฉืื ืืืืฉืื ืืื ืืืืืืืช SNI ืืืฆืคื ืช (ESNI) ืืชืฉืชืืช ืฉื ืืชืจืื ืฆืืืืจืืื.
ืืฉืืืืฉ ืืืื ืืืืืื ืื ืืืืืจ ืืช ืจืืช ืืืืืื ืืขืืืื ืขื ืืชืจ ืฆืืืืจื ืืืขืืื ืืชืงื ื ืืืืื ืคื ืืืืื ืฉืืืืฆื ืขื ืืื ืืืืจื.
ืงืืื ืื, ืื ื ืจืืฆื ืืฆืืื ืฉืืืื ืืืืืื ืืื ื ืกืื ืืจืืืช ืืขืืืื ื ืืฆืืช ืืืืืื, ืืื CloudFlare ืืืืืืื ืืืจ ืชืืืืืช ืื (ื
ืงืฆืช ืชืืืืจืื
ESNI ืืื ืืจืืื ืืคืจืืืืงืื TLS 1.3 ืืืืคืฉืจ ืืฆืคื ืช SNI ืืืืืขืช ืืืืฆืช ืืื ืฉื TLS "Client Hello". ืื ื ืจืื Client Hello ืขื ืชืืืืช ESNI (ืืืงืื ื-SNI ืืจืืื ืื ื ืจืืืื ืืช ESNI):
ืืื ืืืฉืชืืฉ ื-ESNI, ืืชื ืฆืจืื ืฉืืืฉื ืจืืืืื:
- DNS;
- ืชืืืืช ืืงืืืืช;
- ืชืืืื ืืฆื ืืฉืจืช.
DNS
ืขืืื ืืืืกืืฃ ืฉืชื ืจืฉืืืืช DNS - Aื - TXT (ืจืฉืืืช ื-TXT ืืืืื ืืช ืืืคืชื ืืฆืืืืจื ืฉืืขืืจืชื ืืืงืื ืืืื ืืืฆืคืื SNI) - ืจืื ืืืื. ืื ืืกืฃ, ืืืืืช ืืืืืช ืชืืืื DoH (DNS ืขื HTTPS) ืืืืืื ืฉืืงืืืืช ืืืื ืื (ืจืื ืืืื) ืืื ื ืืืคืฉืจืื ืชืืืืช ESNI ืืื DoH. ืื ืืืืื ื, ืืืืืื ืฉ-ESNI ืืจืืืช ืขื ืืฆืคื ื ืฉื ืฉื ืืืฉืื ืฉืืืื ืื ืื ื ื ืืืฉืื, ืืืืืจ, ืืื ืืขื ืืืฉืช ื-DNS ืืจื UDP. ืืชืจ ืขื ืื, ืืฉืืืืฉ
ืืืื ืืจืืข
CloudFlare
ะ ืึผึฐื ึดืืกึธื:
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) ืืืืืกืืฃ ืฉื ื ืขืจืืื.
ืฉืืจืืช ืืงืืืืช
ืื ืื ืื ื ืืืืจืื ืขื ืืคืืคื ืื, ืื ืืจืืข
ืืืืื, ืืฉ ืืืฉืชืืฉ ื-TLS 1.3 ืืื ืืชืืื ื-ESNI, ืืืืืื ืฉ-ESNI ืืื ืืจืืื ื-TLS 1.3.
ืืฆืืจื ืืืืงืช ื-backend ืขื ืชืืืืช ESNI, ืืืืขื ื ืืช ืืืงืื ื- go, ืืื ืขื ืื ืืืืฉื.
ืชืืืื ืืฆื ืืฉืจืช
ื ืืื ืืขืืฉืื, ESNI ืืื ื ื ืชืื ืขื ืืื ืฉืจืชื ืืื ืืจื ื ืืื nginx/apache ืืื', ืืืืืื ืฉืื ืขืืืืื ืขื TLS ืืจื OpenSSL/BoringSSL, ืฉืืื ื ืชืืืืื ื-ESNI ืืืืคื ืจืฉืื.
ืืื, ืืืืื ื ืืืฆืืจ ืจืืื ืืืืชื ืืฉืื ื (ESNI reverse proxy), ืืฉืจ ืืชืืื ืืกืืื TLS 1.3 ืขื ืชืขืืืจืช ESNI ื-proxy HTTP(S) ื-upstream, ืฉืืื ื ืชืืื ื-ESNI. ืื ืืืคืฉืจ ืฉืืืืฉ ืืืื ืืืืืื ืืชืฉืชืืช ืฉืืืจ ืงืืืืช, ืืืื ืืฉื ืืช ืืช ืืืจืืืืื ืืขืืงืจืืื โ ืืืืืจ, ืฉืืืืฉ ืืฉืจืชื ืืื ืืจื ื ืงืืืืื ืฉืืื ื ืชืืืืื ื-ESNI.
ืืฉื ืืืืืจืืช, ืื ื ืชืจืฉืื:
ืื ื ืืฆืืื ืฉืืคืจืืงืกื ืชืืื ื ืขื ืืืืืืช ืืกืืื ืืืืืจ TLS ืืื ESNI, ืืื ืืชืืื ืืืงืืืืช ืืื ESNI. ืืื ืื, ืคืจืืืืงืื ืืชืงืฉืืจืช ืืืขืื ืืืจื ืืืื ืืืืืช HTTP ืื HTTPS ืขื ืืจืกืช TLS ื ืืืื ื-1.3 (ืื ืืืขืื ืืืจื ืืื ื ืชืืื ื-1.3). ืชืื ืืช ืื ืืขื ืืงื ืืืืฉืืช ืืจืืืช.
ืืืฉืื ืชืืืืช ESNI ืขื go ืืฉืืื ื ืืื ื
ืืื ืืืฆืืจ ืืคืชืืืช ESNI ืืฉืชืืฉื ื
ืืืงื ื ืืช ืืืื ื ืืืืฆืขืืช go 1.13 ื-Linux (Debian, Alpine) ื-MacOS.
ืืื ืืืืื ืขื ืชืืื ืืช ืชืคืขืืืืืช
ืคืจืืงืกื ืืคืื ืฉื ESNI ืืกืคืง ืืืืื ืืคืืจืื ืฉื Prometheus, ืืืื rps, ืืืืื ืืืขืื ืืืจื ืืงืืื ืชืืืื, ืืืืฆืืช ืื ืฉื TLS ื ืืฉืืืช/ืืืฆืืืืช ืืืฉื ืืืืฆืช ืื ืฉื TLS. ืืืื ืจืืฉืื, ืื ื ืจืื ืืกืคืืง ืืื ืืืขืจืื ืืืฆื ื-proxy ืืืคื ืืชืขืืืจื.
ืืืฆืขื ื ืื ืืืืงืืช ืขืืืก ืืคื ื ืืฉืืืืฉ. ืชืืฆืืืช ืืืื:
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 ื-proxy ื-upstream ื-HTTP, ืงืืืื ื ื-550 rps ืืืืคืข ืืื, ืขื ืฆืจืืืช ื-CPU/RAM ืืืืืฆืขืช ืฉื ESNI ืืคืื ืคืจืืงืกื:
- 80% ืฉืืืืฉ ืืืขืื (4 vCPU, ืืืจืืื ืฉื 4 GB RAM, ืืื ืืงืก)
- 130 MB Mem 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 vCPUs, ืืืจืืื ืฉื 4 GB RAM, ืืื ืืงืก), ืืืืขืฉื ืคืืื ืฆืืื ื-RPS ืืืื ืืืชืจ (ืงืืืื ื ื ืชืื ืื ืฉื ืขื 2700 RPS ืขื ืืฉืืืื ืืืงืื ืืืชืจ).
ืืกืืืื, ืื ื ืืฆืืื ืฉืืื ืืืืืืืช ESNI ื ืจืืืช ืื ืืืืืื. ืืฉ ืขืืืื ืืจืื ืฉืืืืช ืคืชืืืืช, ืืืฉื, ืืืขืืืช ืฉื ืืืกืื ืืคืชื ื-ESNI ืืฆืืืืจื ื-DNS ืืืคืชืืืช ESNI ืกืืืืืืื - ื ืืฉืืื ืืื ื ืืืื ืื ืืืืคื ืคืขืื, ืืืืจืกื ืืขืืื ืืช ืืืืชืจ ืฉื ืืืืืช ESNI (ืืืื ืืชืืืช ืฉืืจืืช ืืื) ืืืจ ื ืืฆืืช
ืืงืืจ: www.habr.com