Π Π°Π·Π»ΠΈΡΠ½ΡΠ΅ Π°ΡΠΏΠ΅ΠΊΡΡ ΡΠΊΡΠΏΠ»ΡΠ°ΡΠ°ΡΠΈΠΈ DNS ΡΠΆΠ΅ Π½Π΅ΠΎΠ΄Π½ΠΎΠΊΡΠ°ΡΠ½ΠΎ Π·Π°ΡΡΠ°Π³ΠΈΠ²Π°Π»ΠΈΡΡ Π°Π²ΡΠΎΡΠΎΠΌ Π² ΡΡΠ΄Π΅
ΠΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π½Π΅Π³ΠΎ Π²ΡΠ΅ΠΌΠ΅Π½ΠΈ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΎΡΡΡ ΡΡΠ·Π²ΠΈΠΌΠΎΡΡΠΈ DNS ΡΡΠ°ΡΠΈΠΊΠ°, ΠΊΠΎΡΠΎΡΡΠΉ, Π΄ΠΎ ΡΠΈΡ
ΠΏΠΎΡ, ΠΏΠΎ Π±ΠΎΠ»ΡΡΠ΅ΠΉ ΡΠ°ΡΡΠΈ, ΠΏΠ΅ΡΠ΅Π΄Π°ΡΡΡΡ Π² ΠΎΡΠΊΡΡΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π΄Π»Ρ Π·Π»ΠΎΠ½Π°ΠΌΠ΅ΡΠ΅Π½Π½ΡΡ
Π΄Π΅ΠΉΡΡΠ²ΠΈΠΉ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΠΏΡΠΎΠ²Π°ΠΉΠ΄Π΅ΡΠΎΠ², ΡΡΡΠ΅ΠΌΡΡΠΈΡ
ΡΡ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΡΠ²ΠΎΠΈΡ
Π΄ΠΎΡ
ΠΎΠ΄Ρ Π·Π° ΡΡΡΡ Π²ΡΡΡΠ°ΠΈΠ²Π°Π½ΠΈΡ ΡΠ΅ΠΊΠ»Π°ΠΌΡ Π² ΠΊΠΎΠ½ΡΠ΅Π½Ρ, Π³ΠΎΡΡΠ΄Π°ΡΡΡΠ²Π΅Π½Π½ΡΡ
ΡΠΈΠ»ΠΎΠ²ΡΡ
ΠΎΡΠ³Π°Π½ΠΎΠ² ΠΈ ΡΠ΅Π½Π·ΡΡΡ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΡΠΎΡΡΠΎ ΠΏΡΠ΅ΡΡΡΠΏΠ½ΠΈΠΊΠΎΠ², ΠΏΡΠΎΡΠ΅ΡΡ
Π ΡΡΠ°ΡΡΡΡ, ΡΠΈΡΡΠ°ΡΠΈΡ ΠΌΠ΅Π½ΡΠ΅ΡΡΡ. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΠ³ΠΎ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Firefox
1. ΠΡΠΎΠ±Π»Π΅ΠΌΡ DNS-over-HTTPS
ΠΠ° ΠΏΠ΅ΡΠ²ΡΠΉ Π²Π·Π³Π»ΡΠ΄, Π½Π°ΡΠΈΠ½Π°ΡΡΠ΅Π΅ΡΡ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ DNS-over-HTTPS Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ½ΠΎΠ΅ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ°Π±ΠΎΡΠ°ΡΡΠ΅Π΅ Π² ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ Π²ΡΠ·ΡΠ²Π°Π΅Ρ ΡΠΎΠ»ΡΠΊΠΎ ΠΏΠΎΠ·ΠΈΡΠΈΠ²Π½ΡΡ ΡΠ΅Π°ΠΊΡΠΈΡ. ΠΠ΄Π½Π°ΠΊΠΎ, ΡΡΡΡ, ΠΊΠ°ΠΊ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΠΊΡΠΎΠ΅ΡΡΡ Π² Π΄Π΅ΡΠ°Π»ΡΡ .
ΠΠ΅ΡΠ²ΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΎΠ³ΡΠ°Π½ΠΈΡΠΈΠ²Π°Π΅Ρ ΡΡΠ΅ΡΡ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ ΠΏΡΠΈΠΌΠ΅Π½Π΅Π½ΠΈΡ DoH, ΡΠ²Π»ΡΠ΅ΡΡΡ Π΅Π³ΠΎ ΠΎΡΠΈΠ΅Π½ΡΠ°ΡΠΈΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ Π½Π° Π²Π΅Π±-ΡΡΠ°ΡΠΈΠΊ. ΠΠ΅ΠΉΡΡΠ²ΠΈΡΠ΅Π»ΡΠ½ΠΎ, ΠΏΡΠΎΡΠΎΠΊΠΎΠ» HTTP ΠΈ Π΅Π³ΠΎ Π°ΠΊΡΡΠ°Π»ΡΠ½Π°Ρ ΡΠ΅Π΄Π°ΠΊΡΠΈΡ HTTP/2, Π½Π° ΠΊΠΎΡΠΎΡΠΎΠΉ Π±Π°Π·ΠΈΡΡΠ΅ΡΡΡ DoH, ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΎΡΠ½ΠΎΠ²ΠΎΠΉ WWW. ΠΠΎ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΡΠΎ Π½Π΅ ΡΠΎΠ»ΡΠΊΠΎ Π²Π΅Π±. Π‘ΡΡΠ΅ΡΡΠ²ΡΠ΅Ρ ΠΌΠ°ΡΡΠ° ΠΏΠΎΠΏΡΠ»ΡΡΡΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ², ΡΠ°ΠΊΠΈΠ΅, ΠΊΠ°ΠΊ ΡΠ»Π΅ΠΊΡΡΠΎΠ½Π½Π°Ρ ΠΏΠΎΡΡΠ°, Π²ΡΠ΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΡΠ΅ ΠΌΠ΅ΡΡΠ΅Π½Π΄ΠΆΠ΅ΡΡ, ΡΠΈΡΡΠ΅ΠΌΡ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ ΡΠ°ΠΉΠ»ΠΎΠ², ΡΡΡΠΈΠΌΠΈΠ½Π³ ΠΌΡΠ»ΡΡΠΈΠΌΠ΅Π΄ΠΈΠ° ΠΈ ΠΏΡΠΎΡ., ΠΊΠΎΡΠΎΡΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡ HTTP. Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½Π΅ΡΠΌΠΎΡΡΡ Π½Π° Π²ΠΎΡΠΏΡΠΈΡΡΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΈΠΌΠΈ DoH ΠΊΠ°ΠΊ ΠΏΠ°Π½Π°ΡΠ΅ΠΈ, ΠΎΠ½ ΠΎΠΊΠ°Π·ΡΠ²Π°Π΅ΡΡΡ Π½Π΅ΠΏΡΠΈΠΌΠ΅Π½ΠΈΠΌ Π±Π΅Π· Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡΠ΅Π»ΡΠ½ΡΡ (Π΄Π° ΠΈ Π½Π΅ Π½ΡΠΆΠ½ΡΡ ) ΡΡΠΈΠ»ΠΈΠΉ, Π½ΠΈ Π΄Π»Ρ ΡΠ΅Π³ΠΎ ΠΈΠ½ΠΎΠ³ΠΎ, ΠΊΡΠΎΠΌΠ΅ Π±ΡΠ°ΡΠ·Π΅ΡΠ½ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ. Π ΡΠ»ΠΎΠ²Ρ, Π½Π° ΡΡΡ ΡΠΎΠ»Ρ ΠΊΡΠ΄Π° ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ Π΄ΠΎΡΡΠΎΠΉΠ½ΡΠΌ ΠΊΠ°Π½Π΄ΠΈΠ΄Π°ΡΠΎΠΌ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ DNS-over-TLS, ΠΊΠΎΡΠΎΡΡΠΉ ΡΠ΅Π°Π»ΠΈΠ·ΡΠ΅Ρ ΠΈΠ½ΠΊΠ°ΠΏΡΡΠ»ΡΡΠΈΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ³ΠΎ DNS ΡΡΠ°ΡΠΈΠΊΠ° Π² Π·Π°ΡΠΈΡΡΠ½Π½ΡΠΉ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ ΠΏΡΠΎΡΠΎΠΊΠΎΠ» TLS.
ΠΡΠΎΡΠΎΠΉ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ, ΠΊΠΎΡΠΎΡΠ°Ρ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎ ΠΊΡΠ΄Π° ΠΊΠ°ΠΊ Π±ΠΎΠ»Π΅Π΅ Π·Π½Π°ΡΠΈΠΌΠ°, ΡΠ΅ΠΌ ΠΏΠ΅ΡΠ²Π°Ρ, ΡΠ²Π»ΡΠ΅ΡΡΡ ΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈΠΉ ΠΎΡΠΊΠ°Π· ΠΎΡ ΠΏΡΠΈΡΡΡΠ΅ΠΉ DNS by design Π΄Π΅ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ Π² ΡΠ³ΠΎΠ΄Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΠΊΠ°Π·ΡΠ²Π°Π΅ΠΌΠΎΠ³ΠΎ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π΅Π΄ΠΈΠ½ΠΎΠ³ΠΎ DoH ΡΠ΅ΡΠ²Π΅ΡΠ°. Π ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ, Mozilla ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ΅ΡΠ²ΠΈΡ ΠΎΡ Cloudflare. ΠΠΎΠ΄ΠΎΠ±Π½ΡΠΉ ΡΠ΅ΡΠ²ΠΈΡ Π·Π°ΠΏΡΡΡΠΈΠ»ΠΈ ΡΠ°ΠΊΠΆΠ΅ ΠΈ Π΄ΡΡΠ³ΠΈΠ΅ Π·Π°ΠΌΠ΅ΡΠ½ΡΠ΅ ΡΠΈΠ³ΡΡΡ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ, Π² ΡΠ°ΡΡΠ½ΠΎΡΡΠΈ Google. ΠΠΎΠ»ΡΡΠ°Π΅ΡΡΡ, ΡΡΠΎ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ DNS-over-HTTPS Π² ΡΠΎΠΌ Π²ΠΈΠ΄Π΅, Π² ΠΊΠΎΡΠΎΡΠΎΠΌ ΡΡΠΎ ΠΏΡΠ΅Π΄Π»Π°Π³Π°Π΅ΡΡΡ ΡΠ΅ΠΉΡΠ°Ρ, Π»ΠΈΡΡ ΡΠ²Π΅Π»ΠΈΡΠΈΠ²Π°Π΅Ρ Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡΡ ΠΊΠΎΠ½Π΅ΡΠ½ΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΎΡ ΠΊΡΡΠΏΠ½Π΅ΠΉΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΡΠΎΠ². ΠΠ΅ ΡΠ΅ΠΊΡΠ΅Ρ, ΡΡΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, ΠΊΠΎΡΠΎΡΡΡ ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²ΠΈΡΡ Π°Π½Π°Π»ΠΈΠ· DNS Π·Π°ΠΏΡΠΎΡΠΎΠ² ΡΠΏΠΎΡΠΎΠ±Π΅Π½ ΡΠΎΠ±ΠΈΡΠ°ΡΡ Π΅ΡΡ Π±ΠΎΠ»ΡΡΠ΅ Π΄Π°Π½Π½ΡΡ ΠΎ Π½ΡΠΌ, Π° ΡΠ°ΠΊΠΆΠ΅ ΠΏΠΎΠ²ΡΡΠΈΡΡ ΠΈΡ ΡΠΎΡΠ½ΠΎΡΡΡ ΠΈ Π°ΠΊΡΡΠ°Π»ΡΠ½ΠΎΡΡΡ.
Π ΡΡΠΎΠΉ ΡΠ²ΡΠ·ΠΈ, Π°Π²ΡΠΎΡ Π±ΡΠ» ΠΈ ΠΎΡΡΠ°ΡΡΡΡ ΡΡΠΎΡΠΎΠ½Π½ΠΈΠΊΠΎΠΌ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠ³ΠΎ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΡ Π½Π΅ DNS-over-HTTPS, Π° DNS-over-TLS ΡΠΎΠ²ΠΌΠ΅ΡΡΠ½ΠΎ Ρ DNSSEC/DANE ΠΊΠ°ΠΊ ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»ΡΠ½ΠΎΠ³ΠΎ, Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΠΈ Π½Π΅ ΡΠΏΠΎΡΠΎΠ±ΡΡΠ²ΡΡΡΠ΅Π³ΠΎ Π΄Π°Π»ΡΠ½Π΅ΠΉΡΠ΅ΠΉ ΡΠ΅Π½ΡΡΠ°Π»ΠΈΠ·Π°ΡΠΈΠΈ ΠΠ½ΡΠ΅ΡΠ½Π΅Ρ ΡΡΠ΅Π΄ΡΡΠ²Π° Π΄Π»Ρ ΠΎΠ±Π΅ΡΠΏΠ΅ΡΠ΅Π½ΠΈΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡΠΈ DNS ΡΡΠ°ΡΠΈΠΊΠ°. Π ΡΠΎΠΆΠ°Π»Π΅Π½ΠΈΡ, ΠΎΠΆΠΈΠ΄Π°ΡΡ Π±ΡΡΡΡΠΎΠ΅ Π²Π½Π΅Π΄ΡΠ΅Π½ΠΈΠ΅ ΠΌΠ°ΡΡΠΎΠ²ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Π°Π»ΡΡΠ΅ΡΠ½Π°ΡΠΈΠ² DoH Π² ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΈΠΉ ΡΠΎΡΡ Π² ΡΠΈΠ»Ρ ΠΏΠΎΠ½ΡΡΠ½ΡΡ ΠΏΡΠΈΡΠΈΠ½, Π½Π΅ ΠΏΡΠΈΡ ΠΎΠ΄ΠΈΡΡΡ ΠΈ Π΅Ρ ΡΠ΄Π΅Π»ΠΎΠΌ ΠΏΠΎΠΊΠ° ΠΎΡΡΠ°ΡΡΡΡ ΡΠ½ΡΡΠ·ΠΈΠ°ΡΡΡ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΡΡ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΉ.
ΠΠΎ, ΠΊΠΎΠ»Ρ ΡΠΆ ΠΌΡ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ»ΡΡΠ°Π΅ΠΌ DoH, ΡΠΎ ΠΏΠΎΡΠ΅ΠΌΡ Π±Ρ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ Π΅Π³ΠΎ, ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΡΠΉΠ΄Ρ ΠΎΡ ΠΏΠΎΡΠ΅Π½ΡΠΈΠ°Π»ΡΠ½ΠΎΠΉ ΡΠ»Π΅ΠΆΠΊΠΈ ΠΏΠΎ ΡΡΠΎΡΠΎΠ½Ρ ΠΊΠΎΡΠΏΠΎΡΠ°ΡΠΈΠΉ ΠΏΠΎΡΡΠ΅Π΄ΡΡΠ²ΠΎΠΌ ΠΈΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠ² Π½Π° ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ DNS-over-HTTPS ΡΠ΅ΡΠ²Π΅Ρ?
2. ΠΡΠΎΡΠΎΠΊΠΎΠ» DNS-over-HTTPS
ΠΡΠ»ΠΈ Π²Π·Π³Π»ΡΠ½ΡΡΡ Π² ΡΡΠ°Π½Π΄Π°ΡΡ
ΠΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΡ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°Π΅ΡΡΡ ΡΠΎΠ»ΡΠΊΠΎ HTTP/2 ΠΈ Π·Π°ΡΠΈΡΡΠ½Π½ΠΎΠ΅ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ TLS.
ΠΡΠΏΡΠ°Π²ΠΊΠ° DNS-Π·Π°ΠΏΡΠΎΡΠ° ΠΌΠΎΠΆΠ΅Ρ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΡΡ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΌΠΈ ΠΌΠ΅ΡΠΎΠ΄Π°ΠΌΠΈ GET ΠΈ POST. Π ΠΏΠ΅ΡΠ²ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅ Π·Π°ΠΏΡΠΎΡ ΡΡΠ°Π½ΡΡΠΎΡΠΌΠΈΡΡΠ΅ΡΡΡ base64URL-encoded ΡΡΡΠΎΠΊΡ, Π° Π²ΠΎ-Π²ΡΠΎΡΠΎΠΌ β ΡΠ΅ΡΠ΅Π· ΡΠ΅Π»ΠΎ POST-Π·Π°ΠΏΡΠΎΡΠ° Π² Π΄Π²ΠΎΠΈΡΠ½ΠΎΠΉ ΡΠΎΡΠΌΠ΅. ΠΡΠΈ ΡΡΠΎΠΌ ΠΏΡΠΈ Π·Π°ΠΏΡΠΎΡΠ΅ ΠΈ ΠΏΡΠΈ ΠΎΡΠ²Π΅ΡΠ΅ DNS ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΡΠ½ΡΠΉ MIME-ΡΠΈΠΏ Π΄Π°Π½Π½ΡΡ application/dns-message.
root@eprove:~ # curl -H 'accept: application/dns-message' 'https://my.domaint/dns-query?dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE' -v
* Trying 2001:100:200:300::400:443...
* TCP_NODELAY set
* Connected to eprove.net (2001:100:200:300::400) port 443 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
* CAfile: /usr/local/share/certs/ca-root-nss.crt
CApath: none
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_256_GCM_SHA384
* ALPN, server accepted to use h2
* Server certificate:
* subject: CN=my.domain
* start date: Jul 22 00:07:13 2019 GMT
* expire date: Oct 20 00:07:13 2019 GMT
* subjectAltName: host "my.domain" matched cert's "my.domain"
* issuer: C=US; O=Let's Encrypt; CN=Let's Encrypt Authority X3
* SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x801441000)
> GET /dns-query?dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE HTTP/2
> Host: eprove.net
> User-Agent: curl/7.65.3
> accept: application/dns-message
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 100)!
< HTTP/2 200
< server: h2o/2.3.0-beta2
< content-type: application/dns-message
< cache-control: max-age=86274
< date: Thu, 12 Sep 2019 13:07:25 GMT
< strict-transport-security: max-age=15768000; includeSubDomains; preload
< content-length: 45
<
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
* Failed writing body (0 != 45)
* stopped the pause stream!
* Connection #0 to host eprove.net left intact
ΠΠ±ΡΠ°ΡΠΈΡΠ΅ ΡΠ°ΠΊΠΆΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ cache-control: Π² ΠΎΡΠ²Π΅ΡΠ΅ ΡΠΎ ΡΡΠΎΡΠΎΠ½Ρ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°. Π ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ΅ max-age ΡΠΎΠ΄Π΅ΡΠΆΠΈΡΡΡ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ TTL Π΄Π»Ρ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΠΌΠΎΠΉ Π·Π°ΠΏΠΈΡΠΈ DNS (ΠΈΠ»ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΅ΡΠ»ΠΈ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅ΡΡΡ ΠΈΡ Π½Π°Π±ΠΎΡ).
ΠΡΡ ΠΎΠ΄Ρ ΠΈΠ· Π²ΡΡΠ΅ΠΈΠ·Π»ΠΎΠΆΠ΅Π½Π½ΠΎΠ³ΠΎ, ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ DoH ΡΠ΅ΡΠ²Π΅ΡΠ° ΡΠΎΡΡΠΎΠΈΡ ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΈΡ ΡΡΠ°ΠΏΠΎΠ².
- ΠΠΎΠ»ΡΡΠΈΡΡ HTTP Π·Π°ΠΏΡΠΎΡ. ΠΡΠ»ΠΈ ΡΡΠΎ GET ΡΠΎ Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠ°ΠΊΠ΅Ρ ΠΈΠ· base64URL ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠΈ.
- ΠΡΠΏΡΠ°Π²ΠΈΡΡ ΡΡΠΎΡ ΠΏΠ°ΠΊΠ΅Ρ DNS ΡΠ΅ΡΠ²Π΅ΡΡ.
- ΠΠΎΠ»ΡΡΠΈΡΡ ΠΎΡΠ²Π΅Ρ ΠΎΡ DNS ΡΠ΅ΡΠ²Π΅ΡΠ°
- ΠΠ°ΠΉΡΠΈ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡΠ½ΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ TTL Π² ΠΏΠΎΠ»ΡΡΠ΅Π½Π½ΡΡ Π·Π°ΠΏΠΈΡΡΡ .
- ΠΠ΅ΡΠ½ΡΡΡ ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΎΡΠ²Π΅Ρ ΠΏΠΎ HTTP.
3. Π‘Π²ΠΎΠΉ DNS-over-HTTPS ΡΠ΅ΡΠ²Π΅Ρ
ΠΠ°ΠΈΠ±ΠΎΠ»Π΅Π΅ ΠΏΡΠΎΡΡΡΠΌ, Π±ΡΡΡΡΡΠΌ ΠΈ ΡΡΡΠ΅ΠΊΡΠΈΠ²Π½ΡΠΌ ΡΠΏΠΎΡΠΎΠ±ΠΎΠΌ Π·Π°ΠΏΡΡΡΠΈΡΡ ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠΉ DNS-over-HTTPS ΡΠ΅ΡΠ²Π΅Ρ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ΅ΡΡΡ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ HTTP/2 Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°
Π ΠΏΠΎΠ»ΡΠ·Ρ ΡΡΠΎΠ³ΠΎ Π²ΡΠ±ΠΎΡΠ° ΠΈΠ³ΡΠ°Π΅Ρ ΡΠΎΡ ΡΠ°ΠΊΡ, ΡΡΠΎ Π²Π΅ΡΡ ΠΊΠΎΠ΄ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎΠ³ΠΎ DoH ΡΠ΅ΡΠ²ΡΠ° ΠΌΠΎΠΆΠ΅Ρ Π±ΡΡΡ ΠΏΠΎΠ»Π½ΠΎΡΡΡΡ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½ ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ Π² ΡΠ°ΠΌ H2O ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠ°ΡΠΎΡΠΎΠΌ
root@beta:~ # uname -v
FreeBSD 12.0-RELEASE-p10 GENERIC
root@beta:~ # cd /usr/ports/www/h2o
root@beta:/usr/ports/www/h2o # make extract
===> License MIT BSD2CLAUSE accepted by the user
===> h2o-2.2.6 depends on file: /usr/local/sbin/pkg - found
===> Fetching all distfiles required by h2o-2.2.6 for building
===> Extracting for h2o-2.2.6.
=> SHA256 Checksum OK for h2o-h2o-v2.2.6_GH0.tar.gz.
===> h2o-2.2.6 depends on file: /usr/local/bin/ruby26 - found
root@beta:/usr/ports/www/h2o # cd work/h2o-2.2.6/deps/
root@beta:/usr/ports/www/h2o/work/h2o-2.2.6/deps # git clone https://github.com/iij/mruby-socket.git
ΠΠ»ΠΎΠ½ΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅ Π² Β«mruby-socketΒ»β¦
remote: Enumerating objects: 385, done.
remote: Total 385 (delta 0), reused 0 (delta 0), pack-reused 385
ΠΠΎΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ²: 100% (385/385), 98.02 KiB | 647.00 KiB/s, Π³ΠΎΡΠΎΠ²ΠΎ.
ΠΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ: 100% (208/208), Π³ΠΎΡΠΎΠ²ΠΎ.
root@beta:/usr/ports/www/h2o/work/h2o-2.2.6/deps # ll
total 181
drwxr-xr-x 9 root wheel 18 12 Π°Π²Π³. 16:09 brotli/
drwxr-xr-x 2 root wheel 4 12 Π°Π²Π³. 16:09 cloexec/
drwxr-xr-x 2 root wheel 5 12 Π°Π²Π³. 16:09 golombset/
drwxr-xr-x 4 root wheel 35 12 Π°Π²Π³. 16:09 klib/
drwxr-xr-x 2 root wheel 5 12 Π°Π²Π³. 16:09 libgkc/
drwxr-xr-x 4 root wheel 26 12 Π°Π²Π³. 16:09 libyrmcds/
drwxr-xr-x 13 root wheel 32 12 Π°Π²Π³. 16:09 mruby/
drwxr-xr-x 5 root wheel 11 12 Π°Π²Π³. 16:09 mruby-digest/
drwxr-xr-x 5 root wheel 10 12 Π°Π²Π³. 16:09 mruby-dir/
drwxr-xr-x 5 root wheel 10 12 Π°Π²Π³. 16:09 mruby-env/
drwxr-xr-x 4 root wheel 9 12 Π°Π²Π³. 16:09 mruby-errno/
drwxr-xr-x 5 root wheel 14 12 Π°Π²Π³. 16:09 mruby-file-stat/
drwxr-xr-x 5 root wheel 10 12 Π°Π²Π³. 16:09 mruby-iijson/
drwxr-xr-x 5 root wheel 11 12 Π°Π²Π³. 16:09 mruby-input-stream/
drwxr-xr-x 6 root wheel 11 12 Π°Π²Π³. 16:09 mruby-io/
drwxr-xr-x 5 root wheel 10 12 Π°Π²Π³. 16:09 mruby-onig-regexp/
drwxr-xr-x 4 root wheel 10 12 Π°Π²Π³. 16:09 mruby-pack/
drwxr-xr-x 5 root wheel 10 12 Π°Π²Π³. 16:09 mruby-require/
drwxr-xr-x 6 root wheel 10 12 ΡΠ΅Π½Ρ. 16:10 mruby-socket/
drwxr-xr-x 2 root wheel 9 12 Π°Π²Π³. 16:09 neverbleed/
drwxr-xr-x 2 root wheel 13 12 Π°Π²Π³. 16:09 picohttpparser/
drwxr-xr-x 2 root wheel 4 12 Π°Π²Π³. 16:09 picotest/
drwxr-xr-x 9 root wheel 16 12 Π°Π²Π³. 16:09 picotls/
drwxr-xr-x 4 root wheel 8 12 Π°Π²Π³. 16:09 ssl-conservatory/
drwxr-xr-x 8 root wheel 18 12 Π°Π²Π³. 16:09 yaml/
drwxr-xr-x 2 root wheel 8 12 Π°Π²Π³. 16:09 yoml/
root@beta:/usr/ports/www/h2o/work/h2o-2.2.6/deps # cd ../../..
root@beta:/usr/ports/www/h2o # make install clean
...
ΠΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Π²Π΅Π±-ΡΠ΅ΡΠ²Π΅ΡΠ°, Π² ΡΠ΅Π»ΠΎΠΌ, ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π°Ρ.
root@beta:/usr/ports/www/h2o # cd /usr/local/etc/h2o/
root@beta:/usr/local/etc/h2o # cat h2o.conf
# this sample config gives you a feel for how h2o can be used
# and a high-security configuration for TLS and HTTP headers
# see https://h2o.examp1e.net/ for detailed documentation
# and h2o --help for command-line options and settings
# v.20180207 (c)2018 by Max Kostikov http://kostikov.co e-mail: [email protected]
user: www
pid-file: /var/run/h2o.pid
access-log:
path: /var/log/h2o/h2o-access.log
format: "%h %v %l %u %t "%r" %s %b "%{Referer}i" "%{User-agent}i""
error-log: /var/log/h2o/h2o-error.log
expires: off
compress: on
file.dirlisting: off
file.send-compressed: on
file.index: [ 'index.html', 'index.php' ]
listen:
port: 80
listen:
port: 443
ssl:
cipher-suite: ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS
cipher-preference: server
dh-file: /etc/ssl/dhparams.pem
certificate-file: /usr/local/etc/letsencrypt/live/eprove.net/fullchain.pem
key-file: /usr/local/etc/letsencrypt/live/my.domain/privkey.pem
hosts:
"*.my.domain":
paths: &go_tls
"/":
redirect:
status: 301
url: https://my.domain/
"my.domain:80":
paths: *go_tls
"my.domain:443":
header.add: "Strict-Transport-Security: max-age=15768000; includeSubDomains; preload"
paths:
"/dns-query":
mruby.handler-file: /usr/local/etc/h2o/h2odoh.rb
ΠΡΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΡΠΎΡΡΠ°Π²Π»ΡΠ΅Ρ Π»ΠΈΡΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊ URL /dns-query Π·Π° ΠΊΠΎΡΠΎΡΡΠΉ ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ, Π½Π°Ρ DNS-over-HTTPS ΡΠ΅ΡΠ²Π΅Ρ, Π½Π°ΠΏΠΈΡΠ°Π½Π½ΡΠΉ Π½Π° mruby ΠΈ Π²ΡΠ·ΡΠ²Π°Π΅ΠΌΡΠΉ ΡΠ΅ΡΠ΅Π· ΠΎΠΏΡΠΈΡ ΠΎΠ±ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ° mruby.handler-file.
root@beta:/usr/local/etc/h2o # cat h2odoh.rb
# H2O HTTP/2 web server as DNS-over-HTTP service
# v.20190908 (c)2018-2019 Max Kostikov https://kostikov.co e-mail: [email protected]
proc {|env|
if env['HTTP_ACCEPT'] == "application/dns-message"
case env['REQUEST_METHOD']
when "GET"
req = env['QUERY_STRING'].gsub(/^dns=/,'')
# base64URL decode
req = req.tr("-_", "+/")
if !req.end_with?("=") && req.length % 4 != 0
req = req.ljust((req.length + 3) & ~3, "=")
end
req = req.unpack1("m")
when "POST"
req = env['rack.input'].read
else
req = ""
end
if req.empty?
[400, { 'content-type' => 'text/plain' }, [ "Bad Request" ]]
else
# --- ask DNS server
sock = UDPSocket.new
sock.connect("localhost", 53)
sock.send(req, 0)
str = sock.recv(4096)
sock.close
# --- find lowest TTL in response
nans = str[6, 2].unpack1('n') # number of answers
if nans > 0 # no DNS failure
shift = 12
ttl = 0
while nans > 0
# process domain name compression
if str[shift].unpack1("C") < 192
shift = str.index("x00", shift) + 5
if ttl == 0 # skip question section
next
end
end
shift += 6
curttl = str[shift, 4].unpack1('N')
shift += str[shift + 4, 2].unpack1('n') + 6 # responce data size
if ttl == 0 or ttl > curttl
ttl = curttl
end
nans -= 1
end
cc = 'max-age=' + ttl.to_s
else
cc = 'no-cache'
end
[200, { 'content-type' => 'application/dns-message', 'content-length' => str.size, 'cache-control' => cc }, [ str ] ]
end
else
[415, { 'content-type' => 'text/plain' }, [ "Unsupported Media Type" ]]
end
}
ΠΠ±ΡΠ°ΡΠΈΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, ΡΡΠΎ Π·Π° ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΡ ΠΏΠ°ΠΊΠ΅ΡΠΎΠ² DNS ΠΎΡΠ²Π΅ΡΠ°Π΅Ρ Π»ΠΎΠΊΠ°Π»ΡΠ½ΡΠΉ ΠΊΡΡΠΈΡΡΡΡΠΈΠΉ ΡΠ΅ΡΠ²Π΅Ρ, Π² Π΄Π°Π½Π½ΠΎΠΌ ΡΠ»ΡΡΠ°Π΅
root@beta:/usr/local/etc/h2o # local-unbound verison
usage: local-unbound [options]
start unbound daemon DNS resolver.
-h this help
-c file config file to read instead of /var/unbound/unbound.conf
file format is described in unbound.conf(5).
-d do not fork into the background.
-p do not create a pidfile.
-v verbose (more times to increase verbosity)
Version 1.8.1
linked libs: mini-event internal (it uses select), OpenSSL 1.1.1a-freebsd 20 Nov 2018
linked modules: dns64 respip validator iterator
BSD licensed, see LICENSE in source package for details.
Report bugs to [email protected]
root@eprove:/usr/local/etc/h2o # sockstat -46 | grep unbound
unbound local-unbo 69749 3 udp6 ::1:53 *:*
unbound local-unbo 69749 4 tcp6 ::1:53 *:*
unbound local-unbo 69749 5 udp4 127.0.0.1:53 *:*
unbound local-unbo 69749 6 tcp4 127.0.0.1:53 *:*
ΠΡΡΡΠ°ΡΡΡΡ ΠΏΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΡΡ H2O ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΡΡ ΡΡΠΎ ΠΆΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΠΏΠΎΠ»ΡΡΠΈΠ»ΠΎΡΡ.
root@beta:/usr/local/etc/h2o # service h2o restart
Stopping h2o.
Waiting for PIDS: 69871.
Starting h2o.
start_server (pid:70532) starting now...
4. Π’Π΅ΡΡΠΈΡΠΎΠ²Π°Π½ΠΈΠ΅
ΠΡΠ°ΠΊ, ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΡ ΠΎΡΠΏΡΠ°Π²ΠΈΠ² Π²Π½ΠΎΠ²Ρ ΠΏΡΠΎΠ±Π½ΡΠΉ Π·Π°ΠΏΡΠΎΡ ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅Π² ΡΠ΅ΡΠ΅Π²ΠΎΠΉ ΡΡΠ°ΡΠΈΠΊ ΠΏΡΠΈ ΠΏΠΎΠΌΠΎΡΠΈ ΡΡΠΈΠ»ΠΈΡΡ tcpdump.
root@beta/usr/local/etc/h2o # curl -H 'accept: application/dns-message' 'https://my.domain/dns-query?dns=q80BAAABAAAAAAAAB2V4YW1wbGUDY29tAAABAAE'
Warning: Binary output can mess up your terminal. Use "--output -" to tell
Warning: curl to output it to your terminal anyway, or consider "--output
Warning: <FILE>" to save to a file.
...
root@beta:~ # tcpdump -n -i lo0 udp port 53 -xx -XX -vv
tcpdump: listening on lo0, link-type NULL (BSD loopback), capture size 262144 bytes
16:32:40.420831 IP (tos 0x0, ttl 64, id 37575, offset 0, flags [none], proto UDP (17), length 57, bad cksum 0 (->e9ea)!)
127.0.0.1.21070 > 127.0.0.1.53: [bad udp cksum 0xfe38 -> 0x33e3!] 43981+ A? example.com. (29)
0x0000: 0200 0000 4500 0039 92c7 0000 4011 0000 ....E..9....@...
0x0010: 7f00 0001 7f00 0001 524e 0035 0025 fe38 ........RN.5.%.8
0x0020: abcd 0100 0001 0000 0000 0000 0765 7861 .............exa
0x0030: 6d70 6c65 0363 6f6d 0000 0100 01 mple.com.....
16:32:40.796507 IP (tos 0x0, ttl 64, id 37590, offset 0, flags [none], proto UDP (17), length 73, bad cksum 0 (->e9cb)!)
127.0.0.1.53 > 127.0.0.1.21070: [bad udp cksum 0xfe48 -> 0x43fa!] 43981 q: A? example.com. 1/0/0 example.com. A 93.184.216.34 (45)
0x0000: 0200 0000 4500 0049 92d6 0000 4011 0000 ....E..I....@...
0x0010: 7f00 0001 7f00 0001 0035 524e 0035 fe48 .........5RN.5.H
0x0020: abcd 8180 0001 0001 0000 0000 0765 7861 .............exa
0x0030: 6d70 6c65 0363 6f6d 0000 0100 01c0 0c00 mple.com........
0x0040: 0100 0100 0151 8000 045d b8d8 22 .....Q...].."
^C
2 packets captured
23 packets received by filter
0 packets dropped by kernel
Π Π²ΡΠ²ΠΎΠ΄Π΅ Π²ΠΈΠ΄Π½ΠΎ, ΠΊΠ°ΠΊ Π·Π°ΠΏΡΠΎΡ Π½Π° ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π°Π΄ΡΠ΅ΡΠ° example.com Π±ΡΠ» ΠΏΠΎΠ»ΡΡΠ΅Π½ ΠΈ ΡΡΠΏΠ΅ΡΠ½ΠΎ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ°Π½ DNS ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ.
Π’Π΅ΠΏΠ΅ΡΡ ΠΎΡΡΠ°Π»ΠΎΡΡ Π°ΠΊΡΠΈΠ²ΠΈΡΠΎΠ²Π°ΡΡ Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ Firefox. ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ Π½Π° ΡΡΡΠ°Π½ΠΈΡΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ ΡΠ»Π΅Π΄ΡΠ΅Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ Π½Π΅ΡΠΊΠΎΠ»ΡΠΊΠΎ Π½Π°ΡΡΡΠΎΠ΅ΠΊ about:config.
ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΡΠΎ Π°Π΄ΡΠ΅Ρ Π½Π°ΡΠ΅Π³ΠΎ API ΠΏΠΎ ΠΊΠΎΡΠΎΡΠΎΠΌΡ Π±ΡΠ°ΡΠ·Π΅Ρ Π±ΡΠ΄Π΅Ρ Π·Π°ΠΏΡΠ°ΡΠΈΠ²Π°ΡΡ Π² DNS ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π² network.trr.uri. Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΡΠ΅ΡΡΡ ΡΠ°ΠΊΠΆΠ΅ ΡΠΊΠ°Π·Π°ΡΡ IP Π΄ΠΎΠΌΠ΅Π½Π° ΠΈΠ· ΡΡΠΎΠ³ΠΎ URL Π΄Π»Ρ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ³ΠΎ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ Π² IP ΡΡΠ΅Π΄ΡΡΠ²Π°ΠΌΠΈ ΡΠ°ΠΌΠΎΠ³ΠΎ Π±ΡΠ°ΡΠ·Π΅ΡΠ° Π±Π΅Π· ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΡ ΠΊ DNS Π² network.trr.bootstrapAddress. Π, Π½Π°ΠΊΠΎΠ½Π΅Ρ, ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΠΎ ΡΠ°ΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡ network.trr.mode Π²ΠΊΠ»ΡΡΠ°ΡΡΠΈΠΉ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ DoH. Π£ΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π½Π°ΡΠ΅Π½ΠΈΡ Π² «3» Π·Π°ΡΡΠ°Π²ΠΈΡ Π±ΡΠ°ΡΠ·Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈΡΠΊΠ»ΡΡΠΈΡΠ΅Π»ΡΠ½ΠΎ DNS-over-HTTPS Π΄Π»Ρ ΡΠ°Π·ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΈΠΌΡΠ½, Π° Π±ΠΎΠ»Π΅Π΅ Π½Π°Π΄ΡΠΆΠ½ΠΎΠ΅ ΠΈ Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΠ΅ «2» ΠΎΡΠ΄Π°ΡΡ ΠΏΡΠΈΠΎΡΠΈΡΠ΅Ρ DoH ΠΎΡΡΡΠ°Π²ΠΈΠ² ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΠΎΠ±ΡΠ°ΡΠ΅Π½ΠΈΠ΅ ΠΊ DNS Π² ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅ ΡΠ΅Π·Π΅ΡΠ²Π½ΠΎΠ³ΠΎ Π²Π°ΡΠΈΠ°Π½ΡΠ°.
5. PROFIT!
Π‘ΡΠ°ΡΡΡ Π±ΡΠ»Π° ΠΏΠΎΠ»Π΅Π·Π½ΠΎΠΉ? Π’ΠΎΠ³Π΄Π° ΠΏΡΠΎΡΡ Π½Π΅ ΡΡΠ΅ΡΠ½ΡΡΡΡΡ ΠΈ ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΈΠ²Π°ΡΡ Π΄Π΅Π½ΡΠ³Π°ΠΌΠΈ ΡΠ΅ΡΠ΅Π· ΡΠΎΡΠΌΡ Π΄ΠΎΠ½Π°ΡΠ° (Π½ΠΈΠΆΠ΅).
ΠΡΡΠΎΡΠ½ΠΈΠΊ: habr.com