DNS แแแแ แแชแแแแแก แกแฎแแแแแกแฎแแ แแกแแแฅแขแก แแแขแแ แ แฃแแแ แแ แแแ แแฎแแ แจแแแฎแ แแแแ แฏแแ
แแแแ แแ แแแแ, แแแฃแฎแแแแแแ DNS แขแ แแคแแแแก แแจแแแ แ แแแฃแชแแแแแแแกแ, แ แแแแแแช แแแแแช, แฃแแแขแแกแฌแแแแ, แแจแแแ แแ แแ แแก แแแแแชแแแฃแแ แแ แแแแแแแ แแแแก แแแแแ แฅแแแแแแแแแ, แ แแแแแแแช แชแแแแแแแ แแแแแแแแ แจแแแแกแแแแแก แแแแ แแแก แแแแขแแแขแจแ แ แแแแแแแก แฉแแกแแแ, แกแแฎแแแแฌแแคแ แฃแกแแคแ แแฎแแแแแก แกแแแแแแขแแแแ แแ แชแแแแฃแ แ, แแกแแแ แ แแแแ แช แฃแแ แแแแ แแ แแแแแแแแแ, แแ แแชแแกแ
แกแแแแแแแแ แแ, แกแแขแฃแแชแแ แแชแแแแแ. แแแ แซแแ, แแแแฃแแแ แฃแแ Firefox แแ แแฃแแแ แแก แแแแแแแแแ แแแ
1. DNS-แแ-HTTPS แแ แแแแแแแแ
แแ แแ แจแแฎแแแแแ, DNS-แแ-HTTPS-แแก แกแแฌแงแแกแ แแแกแแแ แแแ แแแแแ แแแ แแแขแแ แแแข แแ แแแ แแแฃแ แฃแแ แฃแแแแแงแแคแแจแ แแฎแแแแ แแแแแแแ แ แแแฅแชแแแก แแฌแแแแก. แแฃแแชแ, แแจแแแแ, แ แแแแ แช แแแแแแแ, แแแขแแแแแจแแ.
แแแ แแแแ แแ แแแแแแ, แ แแแแแแช แแฆแฃแแแแก DoH-แแก แคแแ แแ แแแแแงแแแแแแก แคแแ แแแแแก, แแ แแก แแแกแ แคแแแฃแกแแ แแแ แแฎแแแแ แแแ แขแ แแคแแแแ. แแแ แแแแช, HTTP แแ แแขแแแแแ แแ แแแกแ แแแแแแแแแแแ แแแ แกแแ HTTP/2, แ แแแแแแแช แแแคแฃแซแแแแฃแแแ DoH, แแ แแก WWW-แแก แกแแคแฃแซแแแแ. แแแแ แแ แแแขแแ แแแขแ แแ แแ แแก แแฎแแแแ แแแ. แแ แกแแแแแก แฃแแแ แแแ แแแแฃแแแ แฃแแ แกแแ แแแกแ, แ แแแแ แแชแแ แแแคแแกแขแ, แกแฎแแแแแกแฎแแ แแงแแกแแแ แ แแแกแแแฏแแ แแแ, แคแแแแแแแก แแแแแชแแแแก แกแแกแขแแแแแ, แแฃแแขแแแแแแฃแ แ แแแแแแ แแ แ.แจ., แ แแแแแแแช แแ แแงแแแแแแ HTTP-แก. แแแ แแแแ, แแแฃแฎแแแแแแ แแแแกแ, แ แแ DoH-แแก แแ แแแแแ แฌแแ แแแแแแแแแแแ แแแแแชแแแก แแฆแแฅแแแแก, แแฆแแแฉแแแแแ, แ แแ แแแ แแแแแฃแกแแแแแแ แแ แแแแแขแแแแแ (แแ แแ แแกแแญแแ แ) แซแแแแกแฎแแแแแก แแแ แแจแ, แแ แแฃแแแ แแก แขแแฅแแแแแแแแแแก แแแ แแ. แกแฎแแแแ แจแแ แแก, DNS-over-TLS แแแแแแงแฃแ แแแ แแแแ แแ แฃแคแ แ แฆแแ แกแแฃแแ แแแแแแแแขแ แแ แ แแแแกแแแแก, แ แแแแแแช แแฎแแ แชแแแแแแก แกแขแแแแแ แขแฃแแ DNS แขแ แแคแแแแก แแแแแแกแฃแแแชแแแก แฃแกแแคแ แแฎแ แกแขแแแแแ แขแฃแแ TLS แแ แแขแแแแแจแ.
แแแแ แ แแ แแแแแแ, แ แแแแแแช แแแขแแแชแแฃแ แแ แแแแ แแ แฃแคแ แ แแแแจแแแแแแแแแแ, แแแแ แ แแแ แแแแ, แแ แแก แแแแแแแแก แแแแ DNS-แแก แแแแแแงแแแแแ แแแชแแแขแ แแแแแแชแแแก แคแแฅแขแแแ แแแ แแแขแแแแแ แแ แแฃแแแ แแก แแแ แแแแขแ แแแจแ แแแแแแแแฃแแ แแ แแ DoH แกแแ แแแ แแก แแแแแงแแแแแแก แกแแกแแ แแแแแแ. แแแ แซแแ, Mozilla แแแแแแแแแ Cloudflare-แแก แกแแ แแแกแแก แแแแแงแแแแแแก. แแกแแแแกแ แกแแ แแแกแ แแกแแแ แแแแฅแแแแแ แกแฎแแ แแแแแฉแแแแแแ แแแขแแ แแแข แคแแแฃแ แแแแ, แแแ แซแแ Google-แแ. แแแแแแแก, แ แแ DNS-แแ-HTTPS-แแก แแแแแ แแแ แแ แคแแ แแแ, แ แแแแแจแแช แแก แแแแแแแ แแ แแก แจแแแแแแแแแแแฃแแ, แแฎแแแแ แแ แแแก แกแแแแแแ แแแแฎแแแ แแแแแแแก แแแแแแแแแแฃแแแแแก แฃแแแแแก แกแแ แแแกแแแแ. แกแแแแฃแแแ แแ แแ แแก, แ แแ DNS แแแแฎแแแแแแแก แแแแแแแแ แจแแแซแแแแ แแแแแแฌแแแแก แแแคแแ แแแชแแ, แจแแฃแซแแแ แจแแแแ แแแแก แแแแแ แฃแคแ แ แแแขแ แแแคแแ แแแชแแ แแแก แจแแกแแฎแแ, แแกแแแ แแแแแ แแแก แแแกแ แกแแแฃแกแขแ แแ แจแแกแแแแแแกแแแ.
แแ แแฎแ แแ, แแแขแแ แ แแงแ แแ แ แฉแแแ แแ แ DNS-over-HTTPS-แแก, แแ แแแแ DNS-over-TLS-แแแ แแ แแแ DNSSEC/DANE-แกแแแ แแ แแแ แแแกแแแ แแแ แแแแฎแแ แชแแแแแแแก แแแแฎแ แ, แ แแแแ แช แฃแแแแแ แกแแแฃแ แ, แฃแกแแคแ แแฎแ แแ แแ แแฎแแแกแแงแ แแแ แแแขแแ แแแขแแก แจแแแแแแแ แชแแแขแ แแแแแแชแแแกแแแแก. DNS แขแ แแคแแแแก แฃแกแแคแ แแฎแแแแแก แฃแแ แฃแแแแแกแแงแแคแแ. แกแแแฌแฃแฎแแ แแ, แแแกแแแแแ แแแแแแแแแก แแแแ, แแ แจแแแซแแแแ แแแแแแแ DoH แแแขแแ แแแขแแแแแแก แแแกแแแ แแแ แแฎแแ แแแญแแ แแก แกแฌแ แแค แจแแแแฆแแแแก แแแแแแขแแก แแ แแแ แแแฃแ แฃแแ แฃแแแแแงแแคแแจแ แแ แแก แแแแแ แฃแกแแคแ แแฎแแแแแก แขแแฅแแแแแแแแแแก แแแงแแแ แฃแแแ แกแคแแ แแ.
แแแแ แแ แ แแแแแ แแฎแแ แแแแฅแแก DoH, แ แแขแแ แแ แแแแแแแงแแแแ แแแ แแแ แแแ แแชแแแแแก แแแขแแแชแแฃแ แ แแแแแแแงแฃแ แแแแแกแแแ แแแแแก แแแฆแฌแแแแก แจแแแแแ แแแแ แกแแ แแแ แแแแก แแแจแแแแแแ แฉแแแแก แกแแแฃแแแ DNS-แแ-HTTPS แกแแ แแแ แแ?
2. DNS-over-HTTPS แแ แแขแแแแแ
แกแขแแแแแ แขแก แแฃ แแแแแฎแแแแ
แกแขแแแแแ แขแแก แแแฎแแแแแ, แแฎแแ แแแญแแ แแแแ แแฎแแแแ HTTP/2 แแ แฃแกแแคแ แแฎแ TLS แแแแจแแ แ.
DNS แแแแฎแแแแแก แแแแแแแแ แจแแแซแแแแ แแแแฎแแ แชแแแแแแก แกแขแแแแแ แขแฃแแ GET แแ POST แแแแแแแแแก แแแแแงแแแแแแ. แแแ แแแ แจแแแแฎแแแแแจแ แแแแฎแแแแ แแแ แแแแฅแแแแแ base64URL-แจแ แแแแแ แแแฃแ แกแขแ แแฅแแแแ, แฎแแแ แแแแ แแจแ POST แแแแฎแแแแแก แกแฎแแฃแแแก แแแจแแแแแแ แแแแแ แฃแแ แคแแ แแแ. แแ แจแแแแฎแแแแแจแ, แกแแแชแแแแฃแ แ MIME แแแแแชแแแแ แขแแแ แแแแแแงแแแแแ DNS แแแแฎแแแแแกแ แแ แแแกแฃแฎแแก แแ แแก แแแแแแแชแแ/dns-แแแกแแฏแ.
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-แแ-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-แคแแแแ.
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 แแ แแฃแแแ แจแ. แแแแกแแแแแก แแฅแแแ แฃแแแ แจแแชแแแแแ แ แแแแแแแแ แแแ แแแแขแ แ แแแแคแแแฃแ แแชแแแก แแแแ แแแแแ แจแแกแแฎแแ: config.
แแแ แแแ แ แแแจแ, แแก แแ แแก แฉแแแแ API-แก แแแกแแแแ แแ, แ แแแแแแแช แแ แแฃแแแ แ แแแฎแแแก DNS แแแคแแ แแแชแแแก แฅแกแแแ.trr.uri. แแกแแแ แ แแแแแแแแแ แแแฃแแแ แแ URL-แแแ แแแแแแแก IP-แแก แแแแแแแแ IP-แแก แฃแกแแคแ แแฎแ แแแ แฉแแแแแแแแกแแแแก แแแแแ แแ แแฃแแแ แแก แแแแแงแแแแแแ DNS-แจแ แฌแแแแแแก แแแ แแจแ. network.trr.bootstrapAddress. แแ แแแแแก, แแแแแ แแแ แแแแขแ แ network.trr.mode แแแ แจแแ แแก DoH-แแก แแแแแงแแแแแ. แแแแจแแแแแแแแก โ3โ-แแ แแแงแแแแแ แแแซแฃแแแแก แแ แแฃแแแ แก แแแแแแงแแแแก แแฅแกแแแฃแแแฃแ แแ DNS-over-HTTPS แกแแฎแแแแก แแแแแกแแญแ แแแแ, แฎแแแ แฃแคแ แ แกแแแแแแ แแ แฃแกแแคแ แแฎแ โ2โ แแ แแแ แแขแแขแก แแแแแแญแแแก DoH-แก แแ แแแขแแแแแก แกแขแแแแแ แขแฃแ DNS แซแแแแแก, แ แแแแ แช แแแแฎแแแ แ แแแ แแแแขแก.
5. แแแแแแ!
แแงแ แกแขแแขแแ แกแแกแแ แแแแแ? แแแจแแ แแแฎแแแ, แแฃ แแแแ แแแแแแ แแ แแฎแแ แ แแแฃแญแแ แแ แจแแแแฌแแ แฃแแแแแก แคแแ แแแก แแแจแแแแแแ (แฅแแแแแ).
แฌแงแแ แ: www.habr.com