ื”ืจื ืืช ืฉืจืช ื”-DNS-over-HTTPS ืฉืœืš

ื”ื™ื‘ื˜ื™ื ืฉื•ื ื™ื ืฉืœ ืคืขื•ืœืช DNS ื›ื‘ืจ ื ื’ืขื• ืฉื•ื‘ ื•ืฉื•ื‘ ืขืœ ื™ื“ื™ ื”ืžื—ื‘ืจ ื‘ืžืกืคืจ ืžืืžืจื™ื ืคื•ืจืกื ื‘ืžืกื’ืจืช ื”ื‘ืœื•ื’. ื™ื—ื“ ืขื ื–ืืช, ื”ื“ื’ืฉ ื”ืขื™ืงืจื™ ืชืžื™ื“ ื”ื™ื” ืขืœ ืฉื™ืคื•ืจ ื”ืื‘ื˜ื—ื” ืฉืœ ืฉื™ืจื•ืช ืื™ื ื˜ืจื ื˜ ืžืคืชื— ื–ื”.

ื”ืจื ืืช ืฉืจืช ื”-DNS-over-HTTPS ืฉืœืš

ืขื“ ืœืื—ืจื•ื ื”, ืœืžืจื•ืช ื”ืคื’ื™ืขื•ืช ื”ื‘ืจื•ืจื” ืฉืœ ืชืขื‘ื•ืจืช DNS, ืฉืขื“ื™ื™ืŸ, ื‘ืจื•ื‘ื”, ืžื•ืขื‘ืจืช ื‘ื‘ื”ื™ืจื•ืช, ืœืคืขื•ืœื•ืช ื–ื“ื•ื ื™ื•ืช ืžืฆื“ ืกืคืงื™ื ื”ืžื‘ืงืฉื™ื ืœื”ื’ื“ื™ืœ ืืช ื”ื›ื ืกืชื ืขืœ ื™ื“ื™ ื”ื˜ืžืขืช ืคืจืกื•ื ื‘ืชื•ื›ืŸ, ืกื•ื›ื ื•ื™ื•ืช ืื‘ื˜ื—ื” ืžืžืฉืœืชื™ื•ืช ื•ืฆื ื–ื•ืจื”, ื›ืžื• ื’ื ืคืฉื•ื˜ ืคื•ืฉืขื™ื, ื”ืชื”ืœื™ืš ื—ื™ื–ื•ืง ื”ื”ื’ื ื” ืฉืœื•, ืœืžืจื•ืช ื ื•ื›ื—ื•ืชืŸ ืฉืœ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ืฉื•ื ื•ืช ื›ื’ื•ืŸ DNSSEC/DANE, DNScrypt, DNS-over-TLS ื•-DNS-over-HTTPS, ื ืชืงืขื”. ื•ืื ืคืชืจื•ื ื•ืช ืฉืจืช, ื•ื—ืœืงื ืงื™ื™ืžื™ื ื›ื‘ืจ ื“ื™ ื”ืจื‘ื” ื–ืžืŸ, ื™ื“ื•ืขื™ื ื•ื–ืžื™ื ื™ื, ื”ืชืžื™ื›ื” ืฉืœื”ื ืžืชื•ื›ื ืช ืœืงื•ื— ืžืฉืื™ืจื” ื”ืจื‘ื” ืžืงื•ื ืœืจืฆื•ืŸ.

ืœืžืจื‘ื” ื”ืžื–ืœ, ื”ืžืฆื‘ ืžืฉืชื ื”. ื‘ืคืจื˜, ืžืคืชื—ื™ ื”ื“ืคื“ืคืŸ ื”ืคื•ืคื•ืœืจื™ ืคื™ื™ืจืคื•ืงืก ื ึธืงื•ึผื‘ ืขืœ ืชื•ื›ื ื™ื•ืช ืœื”ืคืขืœืช ืžืฆื‘ ืชืžื™ื›ื” ื›ื‘ืจื™ืจืช ืžื—ื“ืœ DNS-over-HTTPS (DoH) ื‘ืงืจื•ื‘. ื–ื” ืืžื•ืจ ืœืขื–ื•ืจ ืœื”ื’ืŸ ืขืœ ืชืขื‘ื•ืจืช ื”-DNS ืฉืœ ืžืฉืชืžืฉ ื”-WWW ืžื”ืื™ื•ืžื™ื ืฉืœืขื™ืœ, ืืš ืขืœื•ืœ ืœื”ืฆื™ื’ ืื™ื•ืžื™ื ื—ื“ืฉื™ื.

1. ื‘ืขื™ื•ืช DNS-over-HTTPS

ื‘ืžื‘ื˜ ืจืืฉื•ืŸ, ื”ื”ื—ื“ืจื” ื”ื”ืžื•ื ื™ืช ื”ืžืชื—ื™ืœื” ืฉืœ DNS-over-HTTPS ืœืชื•ื›ื ืช ื”ืื™ื ื˜ืจื ื˜ ื’ื•ืจืžืช ืจืง ืœืชื’ื•ื‘ื” ื—ื™ื•ื‘ื™ืช. ืขื ื–ืืช, ื”ืฉื˜ืŸ, ื›ืžื• ืฉืื•ืžืจื™ื, ื ืžืฆื ื‘ืคืจื˜ื™ื.

ื”ื‘ืขื™ื” ื”ืจืืฉื•ื ื” ืฉืžื’ื‘ื™ืœื” ืืช ื”ื™ืงืฃ ื”ืฉื™ืžื•ืฉ ื”ื ืจื—ื‘ ืฉืœ DoH ื”ื™ื ื”ื”ืชืžืงื“ื•ืช ืฉืœื• ืืš ื•ืจืง ื‘ืชืขื‘ื•ืจืช ืื™ื ื˜ืจื ื˜. ื•ืื›ืŸ, ืคืจื•ื˜ื•ืงื•ืœ ื”-HTTP ื•ื”ื’ืจืกื” ื”ื ื•ื›ื—ื™ืช ืฉืœื• HTTP/2, ืฉืขืœื™ื” ืžื‘ื•ืกืก DoH, ื”ื ื”ื‘ืกื™ืก ืœ-WWW. ืื‘ืœ ื”ืื™ื ื˜ืจื ื˜ ื”ื•ื ืœื ืจืง ื”ืื™ื ื˜ืจื ื˜. ื™ืฉื ื ื”ืจื‘ื” ืฉื™ืจื•ืชื™ื ืคื•ืคื•ืœืจื™ื™ื, ื›ืžื• ื“ื•ืืจ ืืœืงื˜ืจื•ื ื™, ืžืกืจื™ื ืžื™ื“ื™ื™ื ืฉื•ื ื™ื, ืžืขืจื›ื•ืช ื”ืขื‘ืจืช ืงื‘ืฆื™ื, ื”ื–ืจืžืช ืžื•ืœื˜ื™ืžื“ื™ื” ื•ื›ื•', ืฉืื™ื ื ืžืฉืชืžืฉื™ื ื‘-HTTP. ืœืคื™ื›ืš, ืœืžืจื•ืช ื”ืชืคื™ืกื” ืขืœ ื™ื“ื™ ืจื‘ื™ื ืฉืœ DoH ื›ืชืจื•ืคื” ืคืœืื™ื”, ืžืชื‘ืจืจ ืฉื–ื” ืœื ื™ืฉื™ื ืœืœื ืžืืžืฅ ื ื•ืกืฃ (ื•ืžื™ื•ืชืจ) ืขื‘ื•ืจ ื›ืœ ื“ื‘ืจ ืื—ืจ ืžืœื‘ื“ ื˜ื›ื ื•ืœื•ื’ื™ื•ืช ื“ืคื“ืคืŸ. ืื’ื‘, DNS-over-TLS ื ืจืื” ื›ืžื• ืžื•ืขืžื“ ื”ืจื‘ื” ื™ื•ืชืจ ืจืื•ื™ ืœืชืคืงื™ื“ ื”ื–ื”, ืฉืžื™ื™ืฉื ืืช ื”ืงื™ื‘ื•ืœ ืฉืœ ืชืขื‘ื•ืจืช DNS ืกื˜ื ื“ืจื˜ื™ืช ื‘ืคืจื•ื˜ื•ืงื•ืœ TLS ื”ืกื˜ื ื“ืจื˜ื™ ื”ืžืื•ื‘ื˜ื—.

ื”ื‘ืขื™ื” ื”ืฉื ื™ื™ื”, ืฉืขืฉื•ื™ื” ืœื”ื™ื•ืช ื”ืจื‘ื” ื™ื•ืชืจ ืžืฉืžืขื•ืชื™ืช ืžื”ืจืืฉื•ื ื”, ื”ื™ื ื”ื ื˜ื™ืฉื” ื‘ืคื•ืขืœ ืฉืœ ื”ื‘ื™ื–ื•ืจ ื”ืžื•ื‘ื ื” ืฉืœ DNS ืขืœ ื™ื“ื™ ืขื™ืฆื•ื‘ ืœื˜ื•ื‘ืช ืฉื™ืžื•ืฉ ื‘ืฉืจืช DoH ื™ื—ื™ื“ ื”ืžืฆื•ื™ืŸ ื‘ื”ื’ื“ืจื•ืช ื”ื“ืคื“ืคืŸ. ื‘ืžื™ื•ื—ื“, ืžื•ื–ื™ืœื” ืžืฆื™ืขื” ืœื”ืฉืชืžืฉ ื‘ืฉื™ืจื•ืช ืฉืœ Cloudflare. ืฉื™ืจื•ืช ื“ื•ืžื” ื”ื•ืฉืง ื’ื ืขืœ ื™ื“ื™ ื’ื•ืจืžื™ื ื‘ื•ืœื˜ื™ื ืื—ืจื™ื ื‘ืื™ื ื˜ืจื ื˜, ื‘ืคืจื˜ ื’ื•ื’ืœ. ืžืกืชื‘ืจ ืฉื”ื˜ืžืขืช DNS-over-HTTPS ื‘ืฆื•ืจื” ื‘ื” ื”ื™ื ืžื•ืฆืขืช ื›ื™ื•ื ืจืง ืžื’ื‘ื™ืจื” ืืช ื”ืชืœื•ืช ืฉืœ ืžืฉืชืžืฉื™ ื”ืงืฆื” ื‘ืฉื™ืจื•ืชื™ื ื”ื’ื“ื•ืœื™ื ื‘ื™ื•ืชืจ. ื–ื” ืœื ืกื•ื“ ืฉื”ืžื™ื“ืข ืฉื ื™ืชื•ื— ืฉืื™ืœืชื•ืช DNS ื™ื›ื•ืœ ืœืกืคืง ื™ื›ื•ืœ ืœืืกื•ืฃ ืขื•ื“ ื™ื•ืชืจ ื ืชื•ื ื™ื ืœื’ื‘ื™ื•, ื›ืžื• ื’ื ืœื”ื’ื‘ื™ืจ ืืช ื”ื“ื™ื•ืง ื•ื”ืจืœื•ื•ื ื˜ื™ื•ืช ืฉืœื•.

ื‘ื”ืงืฉืจ ื–ื”, ื”ืžื—ื‘ืจ ื”ื™ื” ื•ื ืฉืืจ ืชื•ืžืš ื‘ื™ื™ืฉื•ื ื”ื”ืžื•ื ื™ ืœื ืฉืœ DNS-over-HTTPS, ืืœื ืฉืœ DNS-over-TLS ื™ื—ื“ ืขื DNSSEC/DANE ื›ืืžืฆืขื™ ืื•ื ื™ื‘ืจืกืœื™, ืžืื•ื‘ื˜ื— ื•ืื™ื ื• ืชื•ืจื ืœืจื™ื›ื•ื–ื™ื•ืช ื ื•ืกืคืช ืฉืœ ืืžืฆืขื™ ื”ืื™ื ื˜ืจื ื˜. ืœื”ื‘ื˜ื—ืช ืื‘ื˜ื—ืช ืชืขื‘ื•ืจืช DNS. ืœืจื•ืข ื”ืžื–ืœ, ืžืกื™ื‘ื•ืช ื‘ืจื•ืจื•ืช, ืื™ ืืคืฉืจ ืœืฆืคื•ืช ืœื”ื—ื“ืจื” ืžื”ื™ืจื” ืฉืœ ืชืžื™ื›ื” ื”ืžื•ื ื™ืช ื‘ื—ืœื•ืคื•ืช DoH ืœืชื•ื›ื ืช ื”ืœืงื•ื—, ื•ื–ื” ืขื“ื™ื™ืŸ ื ื—ืœืชื ืฉืœ ื—ื•ื‘ื‘ื™ ื˜ื›ื ื•ืœื•ื’ื™ื™ืช ืื‘ื˜ื—ื”.

ืื‘ืœ ืžื›ื™ื•ื•ืŸ ืฉื™ืฉ ืœื ื• ื›ืขืช DoH, ืžื“ื•ืข ืฉืœื ื ืฉืชืžืฉ ื‘ื• ืœืื—ืจ ืฉื ืžืœื˜ ืžืžืขืงื‘ ืคื•ื˜ื ืฆื™ืืœื™ ืฉืœ ืชืื’ื™ื“ื™ื ื“ืจืš ื”ืฉืจืชื™ื ืฉืœื”ื ืœืฉืจืช ื”-DNS-over-HTTPS ืฉืœื ื•?

2. ืคืจื•ื˜ื•ืงื•ืœ DNS-over-HTTPS

ืื ืžืกืชื›ืœื™ื ืขืœ ื”ืกื˜ื ื“ืจื˜ RFC8484 ื›ืฉืžืชืืจื™ื ืืช ืคืจื•ื˜ื•ืงื•ืœ ื”-DNS-over-HTTPS, ืืชื” ื™ื›ื•ืœ ืœืจืื•ืช ืฉื–ื”ื•, ืœืžืขืฉื”, API ืื™ื ื˜ืจื ื˜ ื”ืžืืคืฉืจ ืœืš ืœื›ืœื•ืœ ื—ื‘ื™ืœืช DNS ืกื˜ื ื“ืจื˜ื™ืช ื‘ืคืจื•ื˜ื•ืงื•ืœ HTTP/2. ื–ื” ืžื™ื•ืฉื ื‘ืืžืฆืขื•ืช ื›ื•ืชืจื•ืช HTTP ืžื™ื•ื—ื“ื•ืช, ื›ืžื• ื’ื ื”ืžืจื” ืฉืœ ื”ืคื•ืจืžื˜ ื”ื‘ื™ื ืืจื™ ืฉืœ ื ืชื•ื ื™ DNS ืžืฉื•ื“ืจื™ื (ืจืื”. RFC1035 ื•ืžืกืžื›ื™ื ื”ื‘ืื™ื) ืœื˜ื•ืคืก ื”ืžืืคืฉืจ ืœืš ืœืฉื“ืจ ื•ืœืงื‘ืœ ืื•ืชื, ื›ืžื• ื’ื ืœืขื‘ื•ื“ ืขื ื”ืžื˜ื-ื ืชื•ื ื™ื ื”ื“ืจื•ืฉื™ื.

ืœืคื™ ื”ืชืงืŸ, ืจืง HTTP/2 ื•ื—ื™ื‘ื•ืจ TLS ืžืื•ื‘ื˜ื— ื ืชืžื›ื™ื.

ืฉืœื™ื—ืช ื‘ืงืฉืช DNS ื™ื›ื•ืœื” ืœื”ืชื‘ืฆืข ื‘ืืžืฆืขื•ืช ืฉื™ื˜ื•ืช GET ื•-POST ื”ืกื˜ื ื“ืจื˜ื™ื•ืช. ื‘ืžืงืจื” ื”ืจืืฉื•ืŸ, ื”ื‘ืงืฉื” ืขื•ื‘ืจืช ื˜ืจื ืกืคื•ืจืžืฆื™ื” ืœืžื—ืจื•ื–ืช ืžืงื•ื“ื“ืช base64URL, ื•ื‘ืžืงืจื” ื”ืฉื ื™, ื“ืจืš ื’ื•ืฃ ื‘ืงืฉืช ื”-POST ื‘ืฆื•ืจื” ื‘ื™ื ืืจื™ืช. ื‘ืžืงืจื” ื–ื”, ื ืขืฉื” ืฉื™ืžื•ืฉ ื‘ืกื•ื’ ื ืชื•ื ื™ MIME ืžื™ื•ื—ื“ ื‘ืžื”ืœืš ื‘ืงืฉืช ื”-DNS ื•ื”ืชื’ื•ื‘ื” 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

ืฉื™ืžื• ืœื‘ ื’ื ืœื›ื•ืชืจืช ื‘ืงืจืช ืžื˜ืžื•ืŸ: ื‘ืชื’ื•ื‘ื” ืžืฉืจืช ื”ืื™ื ื˜ืจื ื˜. ื‘ืคืจืžื˜ืจ ื’ื™ืœ ืžืงืกื™ืžืœื™ ืžื›ื™ืœ ืืช ืขืจืš TTL ืขื‘ื•ืจ ืจืฉื•ืžืช ื”-DNS ื”ืžื•ื—ื–ืจืช (ืื• ืืช ื”ืขืจืš ื”ืžื™ื ื™ืžืœื™ ืื ืงื‘ื•ืฆื” ืžื”ื ืžื•ื—ื–ืจืช).

ื‘ื”ืชื‘ืกืก ืขืœ ื”ืืžื•ืจ ืœืขื™ืœ, ื”ืชืคืงื•ื“ ืฉืœ ืฉืจืช DoH ืžื•ืจื›ื‘ ืžืžืกืคืจ ืฉืœื‘ื™ื.

  • ืงื‘ืœ ื‘ืงืฉืช HTTP. ืื ื–ื” GET ืื– ืคืขื ื— ืืช ื”ื—ื‘ื™ืœื” ืžืงื™ื“ื•ื“ base64URL.
  • ืฉืœื— ื—ื‘ื™ืœื” ื–ื• ืœืฉืจืช ื”-DNS.
  • ืงื‘ืœ ืชื’ื•ื‘ื” ืžืฉืจืช ื”-DNS
  • ืžืฆื ืืช ืขืจืš ื”-TTL ื”ืžื™ื ื™ืžืœื™ ื‘ืจืฉื•ืžื•ืช ืฉื”ืชืงื‘ืœื•.
  • ื”ื—ื–ืจ ืชื’ื•ื‘ื” ืœืœืงื•ื— ื‘ืืžืฆืขื•ืช HTTP.

3. ืฉืจืช DNS-over-HTTPS ืžืฉืœืš

ื”ื“ืจืš ื”ืคืฉื•ื˜ื”, ื”ืžื”ื™ืจื” ื•ื”ื™ืขื™ืœื” ื‘ื™ื•ืชืจ ืœื”ืคืขื™ืœ ืฉืจืช DNS-over-HTTPS ืžืฉืœืš ื”ื™ื ืœื”ืฉืชืžืฉ ื‘ืฉืจืช ืื™ื ื˜ืจื ื˜ HTTP/2 H2O, ืฉืขืœื™ื• ื›ื‘ืจ ื›ืชื‘ ื”ืžื—ื‘ืจ ื‘ืงืฆืจื” (ืจืื” "ืฉืจืช ืื™ื ื˜ืจื ื˜ H2O ื‘ืขืœ ื‘ื™ืฆื•ืขื™ื ื’ื‘ื•ื”ื™ื").

ื‘ื—ื™ืจื” ื–ื• ื ืชืžื›ืช ืขืœ ื™ื“ื™ ื”ืขื•ื‘ื“ื” ืฉื ื™ืชืŸ ืœื™ื™ืฉื ืืช ื›ืœ ื”ืงื•ื“ ืฉืœ ืฉืจืช DoH ืžืฉืœืš ื‘ืืžืฆืขื•ืช ื”ืžืชื•ืจื’ืžืŸ ื”ืžืฉื•ืœื‘ ื‘-H2O ืขืฆืžื• ืžืจื•ื‘ื™. ื‘ื ื•ืกืฃ ืœืกืคืจื™ื•ืช ื”ืกื˜ื ื“ืจื˜ื™ื•ืช, ื›ื“ื™ ืœื”ื—ืœื™ืฃ ื ืชื•ื ื™ื ืขื ืฉืจืช ื”-DNS, ืืชื” ืฆืจื™ืš ืืช ืกืคืจื™ื™ืช (mrbgem) Socket, ืืฉืจ, ืœืžืจื‘ื” ื”ืžื–ืœ, ื›ื‘ืจ ื›ืœื•ืœื” ื‘ื’ืจืกืช ื”ืคื™ืชื•ื— ื”ื ื•ื›ื—ื™ืช ืฉืœ H2O 2.3.0-beta2 ืžืชื ื” ื‘ื™ืฆื™ืื•ืช FreeBSD. ืขื ื–ืืช, ืœื ืงืฉื” ืœื”ื•ืกื™ืฃ ืื•ืชื• ืœื›ืœ ื’ืจืกื” ืงื•ื“ืžืช ืขืœ ื™ื“ื™ ืฉื™ื‘ื•ื˜ ื”ืžืื’ืจ ืกืคืจื™ื•ืช ืฉืงืขื™ื ืœืงื˜ืœื•ื’ /deps ืœืคื ื™ ื”ื™ื“ื•ืจ.

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, ื‘ืžืงืจื” ื–ื” unbound ืžื”ืคืฆืช FreeBSD ื”ืกื˜ื ื“ืจื˜ื™ืช. ืžื‘ื—ื™ื ื” ื‘ื™ื˜ื—ื•ื ื™ืช ื–ื”ื• ื”ืคืชืจื•ืŸ ื”ืื•ืคื˜ื™ืžืœื™. ืขื ื–ืืช, ืฉื•ื ื“ื‘ืจ ืœื ืžื•ื ืข ืžืžืš ืœื”ื—ืœื™ืฃ localhost ืœื›ืชื•ื‘ืช 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.

ื”ืจื ืืช ืฉืจืช ื”-DNS-over-HTTPS ืฉืœืš

ืจืืฉื™ืช, ื–ื• ื”ื›ืชื•ื‘ืช ืฉืœ ื”-API ืฉืœื ื• ืฉื‘ื” ื”ื“ืคื“ืคืŸ ื™ื‘ืงืฉ ืžื™ื“ืข DNS network.trr.uri. ื›ืžื• ื›ืŸ, ืžื•ืžืœืฅ ืœืฆื™ื™ืŸ ืืช ื›ืชื•ื‘ืช ื”-IP ืฉืœ ื”ื“ื•ืžื™ื™ืŸ ืžื›ืชื•ื‘ืช ืืชืจ ื–ื• ืขื‘ื•ืจ ืจื–ื•ืœื•ืฆื™ื™ืช IP ืžืื•ื‘ื˜ื—ืช ื‘ืืžืฆืขื•ืช ื”ื“ืคื“ืคืŸ ืขืฆืžื• ืžื‘ืœื™ ืœื’ืฉืช ืœ-DNS ื‘ network.trr.bootstrapAddress. ื•ืœื‘ืกื•ืฃ, ื”ืคืจืžื˜ืจ ืขืฆืžื• network.trr.mode ื›ื•ืœืœ ื”ืฉื™ืžื•ืฉ ื‘-DoH. ื”ื’ื“ืจืช ื”ืขืจืš ืœ-"3" ืชืืœืฅ ืืช ื”ื“ืคื“ืคืŸ ืœื”ืฉืชืžืฉ ืืš ื•ืจืง ื‘-DNS-over-HTTPS ืœืคืชืจื•ืŸ ืฉืžื•ืช, ื‘ืขื•ื“ ืฉื”-"2" ื”ืืžื™ืŸ ื•ื”ืžืื•ื‘ื˜ื— ื™ื•ืชืจ ื™ื™ืชืŸ ืขื“ื™ืคื•ืช ืœ-DoH, ื•ื™ืฉืื™ืจ ืืช ื‘ื“ื™ืงืช ื”-DNS ื”ืจื’ื™ืœื” ื›ืืคืฉืจื•ืช ื—ื–ืจื”.

5. ืจื•ื•ื—!

ื”ืื ื”ืžืืžืจ ื”ื™ื” ืžื•ืขื™ืœ? ืื– ื ื ืœื ืœื”ืชื‘ื™ื™ืฉ ื•ืœืชืžื•ืš ื‘ื›ืกืฃ ื‘ืืžืฆืขื•ืช ื˜ื•ืคืก ื”ืชืจื•ืžื” (ืœืžื˜ื”).

ืžืงื•ืจ: www.habr.com

ื”ื•ืกืคืช ืชื’ื•ื‘ื”