เรายกระดับเซิร์ฟเวอร์ DNS-over-HTTPS ของเรา

ผู้เขียนได้กล่าวถึงแง่มุมต่างๆ ของการดำเนินการ DNS หลายครั้งแล้วหลายครั้ง บทความ เผยแพร่เป็นส่วนหนึ่งของบล็อก ในขณะเดียวกัน จุดเน้นหลักคือการปรับปรุงความปลอดภัยของบริการอินเทอร์เน็ตที่สำคัญนี้มาโดยตลอด

เรายกระดับเซิร์ฟเวอร์ DNS-over-HTTPS ของเรา

จนกระทั่งเมื่อไม่นานมานี้ แม้จะมีช่องโหว่ที่ชัดเจนของการรับส่งข้อมูล DNS ซึ่งส่วนใหญ่ยังคงส่งผ่านอย่างชัดเจนไปยังการกระทำที่เป็นอันตรายในส่วนของผู้ให้บริการที่ต้องการเพิ่มรายได้โดยการฝังโฆษณาในเนื้อหา หน่วยงานรักษาความปลอดภัยของรัฐบาล และการเซ็นเซอร์ เช่นเดียวกับอาชญากรกระบวนการ เสริมสร้างการป้องกันแม้ว่าจะมีเทคโนโลยีต่างๆ เช่น DNSSEC/DANE, DNScrypt, DNS-over-TLS และ DNS-over-HTTPS ก็ตาม ก็ยังหยุดทำงานอยู่ และหากโซลูชันเซิร์ฟเวอร์และบางโซลูชันมีมานานแล้ว เป็นที่รู้จักและพร้อมใช้งานอย่างกว้างขวาง การสนับสนุนจากซอฟต์แวร์ไคลเอ็นต์ก็ยังคงเป็นที่ต้องการอย่างมาก

โชคดีที่สถานการณ์กำลังเปลี่ยนแปลง โดยเฉพาะผู้พัฒนาเบราว์เซอร์ Firefox ยอดนิยม ระบุไว้ เกี่ยวกับแผนการเปิดใช้งานโหมดสนับสนุนตามค่าเริ่มต้น DNS ผ่าน 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 เดียวที่ระบุในการตั้งค่าเบราว์เซอร์ โดยเฉพาะ 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

หากมองตามมาตรฐานแล้ว RFC8484 เมื่ออธิบายโปรโตคอล DNS-over-HTTPS คุณจะเห็นว่าแท้จริงแล้วคือเว็บ API ที่ให้คุณห่อหุ้มแพ็คเกจ DNS มาตรฐานในโปรโตคอล HTTP/2 สิ่งนี้ถูกนำไปใช้ผ่านส่วนหัว HTTP พิเศษ เช่นเดียวกับการแปลงรูปแบบไบนารีของข้อมูล DNS ที่ส่ง (ดู RFC1035 และเอกสารที่ตามมา) ลงในแบบฟอร์มที่ช่วยให้คุณสามารถส่งและรับเอกสารเหล่านั้น รวมถึงทำงานกับเมทาดาทาที่จำเป็น

ตามมาตรฐาน รองรับเฉพาะการเชื่อมต่อ 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-over-HTTPS ของคุณเองคือการใช้เว็บเซิร์ฟเวอร์ HTTP/2 H2Oซึ่งผู้เขียนได้เขียนไว้โดยย่อแล้ว (ดู “เว็บเซิร์ฟเวอร์ H2O ประสิทธิภาพสูง«)

ตัวเลือกนี้ได้รับการสนับสนุนโดยข้อเท็จจริงที่ว่าโค้ดทั้งหมดของเซิร์ฟเวอร์ DoH ของคุณเองสามารถนำไปใช้ได้อย่างเต็มที่โดยใช้ล่ามที่รวมอยู่ใน H2O เอง มรูบี้. นอกเหนือจากไลบรารีมาตรฐานแล้ว ในการแลกเปลี่ยนข้อมูลกับเซิร์ฟเวอร์ DNS คุณต้องมีไลบรารีซ็อกเก็ต (mrbgem) ซึ่งโชคดีที่รวมอยู่ใน 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-ไฟล์.

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 ในกรณีนี้ หลุด จากการกระจาย 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 โดเมนจาก URL นี้สำหรับการแก้ไข IP ที่ปลอดภัยโดยใช้เบราว์เซอร์เองโดยไม่ต้องเข้าถึง DNS network.trr.bootstrapที่อยู่. และสุดท้ายคือพารามิเตอร์นั่นเอง เครือข่าย trr.mode รวมถึงการใช้ DoH การตั้งค่าเป็น "3" จะบังคับให้เบราว์เซอร์ใช้ DNS-over-HTTPS โดยเฉพาะสำหรับการจำแนกชื่อ ในขณะที่ "2" ที่เชื่อถือได้และปลอดภัยกว่าจะให้ความสำคัญกับ DoH โดยปล่อยให้การค้นหา DNS มาตรฐานเป็นตัวเลือกสำรอง

5. กำไร!

บทความนี้มีประโยชน์หรือไม่? ดังนั้นโปรดอย่าอายและสนับสนุนเงินผ่านแบบฟอร์มการบริจาค (ด้านล่าง)

ที่มา: will.com

เพิ่มความคิดเห็น