เบžเบงเบเป€เบฎเบปเบฒเบเบปเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ DNS-over-HTTPS เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ

เบฅเบฑเบเบชเบฐเบ™เบฐเบ•เปˆเบฒเบ‡เป†เบ‚เบญเบ‡เบเบฒเบ™เบ”เปเบฒเป€เบ™เบตเบ™เบ‡เบฒเบ™ DNS เป„เบ”เป‰เบ–เบทเบเบชเปเบฒเบœเบฑเบ”เป€เบฅเบทเป‰เบญเบเป†เป‚เบ”เบเบœเบนเป‰เบ‚เบฝเบ™เปƒเบ™เบˆเปเบฒเบ™เบงเบ™ เบšเบปเบ”เบ„เบงเบฒเบก เป€เบœเบตเบเปเบœเปˆเป€เบ›เบฑเบ™เบชเปˆเบงเบ™เบซเบ™เบถเปˆเบ‡เบ‚เบญเบ‡ blog. เบžเป‰เบญเบกโ€‹เบเบฑเบ™โ€‹เบ™เบฑเป‰เบ™, โ€‹เป„เบ”เป‰โ€‹เป€เบ™เบฑเป‰เบ™โ€‹เปœเบฑเบโ€‹เป€เบ–เบดเบ‡โ€‹เบเบฒเบ™โ€‹เบ›เบฑเบšเบ›เบธเบ‡โ€‹เบ„เบงเบฒเบกโ€‹เบ›เบญเบ”โ€‹เป„เบžโ€‹เบ‚เบญเบ‡โ€‹เบšเปเบฅเบดเบเบฒเบ™โ€‹เบญเบดเบ™โ€‹เป€เบ•เบตโ€‹เป€เบ™เบฑเบ”โ€‹เบ—เบตเปˆโ€‹เบชเบณเบ„เบฑเบ™โ€‹เบ™เบตเป‰โ€‹เบชเบฐเป€เปเบต.

เบžเบงเบเป€เบฎเบปเบฒเบเบปเบเป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ DNS-over-HTTPS เบ‚เบญเบ‡เบžเบงเบเป€เบฎเบปเบฒ

เบˆเบปเบ™เบเปˆเบงเบฒเบšเปเปˆเบ”เบปเบ™เบกเบฒเบ™เบตเป‰, เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบŠเปˆเบญเบ‡เป‚เบซเบงเปˆเบขเปˆเบฒเบ‡เบŠเบฑเบ”เป€เบˆเบ™เบ‚เบญเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™ DNS, เป€เบŠเบดเปˆเบ‡เปเบกเปˆเบ™เบเบฑเบ‡, เบชเปเบฒเบฅเบฑเบšเบชเปˆเบงเบ™เปƒเบซเบเปˆ, เบ–เปˆเบฒเบเบ—เบญเบ”เบขเปˆเบฒเบ‡เบˆเบฐเปเบˆเป‰เบ‡, เบ•เปเปˆเบเบฑเบšเบเบฒเบ™เบเบฐเบ—เปเบฒเบ—เบตเปˆเป€เบ›เบฑเบ™เบญเบฑเบ™เบ•เบฐเบฅเบฒเบเปƒเบ™เบชเปˆเบงเบ™เบ‚เบญเบ‡เบœเบนเป‰เปƒเบซเป‰เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบŠเบญเบเบซเบฒเบเบฒเบ™เป€เบžเบตเปˆเบกเบฅเบฒเบเบฎเบฑเบšเบ‚เบญเบ‡เป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป‚เบ”เบเบเบฒเบ™เบเบฑเบ‡เป‚เบ„เบชเบฐเบ™เบฒเปƒเบ™เป€เบ™เบทเป‰เบญเบซเบฒ, เบญเบปเบ‡เบเบฒเบ™เบ„เบงเบฒเบกเบ›เบญเบ”เป„เบžเบ‚เบญเบ‡เบฅเบฑเบ”เบ–เบฐเบšเบฒเบ™เปเบฅเบฐ censorship, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบ„เบฐเบ”เบตเบญเบฒเบเบฒเบžเบฝเบ‡เปเบ•เปˆ, เบ‚เบฐเบšเบงเบ™เบเบฒเบ™ เป€เบชเบตเบกโ€‹เบ‚เบฐโ€‹เบซเบเบฒเบโ€‹เบเบฒเบ™โ€‹เบ›เบปเบโ€‹เบ›เบฑเบโ€‹เบฎเบฑเบโ€‹เบชเบฒโ€‹เบ‚เบญเบ‡โ€‹เบ•เบปเบ™โ€‹, เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ•เปˆเบฒเบ‡เป†เป€เบŠเบฑเปˆเบ™ DNSSEC/DANE, DNScrypt, DNS-over-TLS เปเบฅเบฐ DNS-over-HTTPS, เบ–เบทเบเบขเบธเบ”. เปเบฅเบฐเบ–เป‰เบฒเบซเบฒเบเบงเปˆเบฒเบเบฒเบ™เปเบเป‰เป„เบ‚เบ‚เบญเบ‡เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ, เปเบฅเบฐเบšเบฒเบ‡เบชเปˆเบงเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบกเบตเบขเบนเปˆเป€เบ›เบฑเบ™เป€เบงเบฅเบฒเบ”เบปเบ™เบ™เบฒเบ™, เป€เบ›เบฑเบ™เบ—เบตเปˆเบฎเบนเป‰เบˆเบฑเบเบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เปเบฅเบฐเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰, เบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เบ‚เบญเบ‡เบžเบงเบเป€เบ‚เบปเบฒเบˆเบฒเบเบŠเบญเบšเปเบงเบ‚เบญเบ‡เบฅเบนเบเบ„เป‰เบฒเป€เบฎเบฑเบ”เปƒเบซเป‰เบซเบผเบฒเบเบ—เบตเปˆเบ•เป‰เบญเบ‡เบเบฒเบ™.

เป‚เบŠเบเบ”เบต, เบชเบฐเบ–เบฒเบ™เบฐเบเบฒเบ™เบกเบตเบเบฒเบ™เบ›เปˆเบฝเบ™เปเบ›เบ‡. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, เบ™เบฑเบเบžเบฑเบ”เบ—เบฐเบ™เบฒเบ‚เบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš Firefox เบ—เบตเปˆเบ™เบดเบเบปเบก เบเปˆเบฒเบง เบเปˆเบฝเบงเบเบฑเบšเปเบœเบ™เบเบฒเบ™เบ—เบตเปˆเบˆเบฐเป€เบ›เบตเบ”เปƒเบŠเป‰เบฎเบนเบšเปเบšเบšเบเบฒเบ™เบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป‚เบ”เบเบ„เปˆเบฒเป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™ DNS-over-HTTPS (DoH) เป„เบงเป†เบ™เบตเป‰. เบญเบฑเบ™เบ™เบตเป‰เบ„เบงเบ™เบŠเปˆเบงเบเบ›เบปเบเบ›เป‰เบญเบ‡เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบŠเบปเบก DNS เบ‚เบญเบ‡เบœเบนเป‰เปƒเบŠเป‰ WWW เบˆเบฒเบเบเบฒเบ™เบ‚เบปเปˆเบกเบ‚เบนเปˆเบ‚เป‰เบฒเบ‡เป€เบ—เบดเบ‡, เปเบ•เปˆเบญเบฒเบ”เบˆเบฐเปเบ™เบฐเบ™เปเบฒเบญเบฑเบ™เปƒเบซเบกเปˆ.

1. เบšเบฑเบ™เบซเบฒ DNS-over-HTTPS

เบขเบนเปˆ glance เบ—เปเบฒเบญเบดเบ”, เบเบฒเบ™เป€เบฅเบตเปˆเบกเบ•เบปเป‰เบ™เบกเบฐเบซเบฒเบŠเบปเบ™เบ‚เบญเบ‡ DNS-over-HTTPS เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เบŠเบญเบšเปเบงเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เป€เบฎเบฑเบ”เปƒเบซเป‰เบžเบฝเบ‡เปเบ•เปˆเบ•เบดเบเบดเบฃเบดเบเบฒเปƒเบ™เบ—เบฒเบ‡เบšเบงเบ. เบขเปˆเบฒเบ‡เปƒเบ”เบเปเบ•เบฒเบก, เบกเบฒเบ™, เบเป‰เบญเบ™เบงเปˆเบฒเป€เบ‚เบปเบฒเป€เบˆเบปเป‰เบฒเป€เบงเบปเป‰เบฒเบงเปˆเบฒ, เปเบกเปˆเบ™เบขเบนเปˆเปƒเบ™เบฅเบฒเบเบฅเบฐเบญเบฝเบ”.

เบšเบฑเบ™เบซเบฒเบ—เปเบฒเบญเบดเบ”เบ—เบตเปˆเบˆเปเบฒเบเบฑเบ”เบ‚เบญเบšเป€เบ‚เบ”เบ‚เบญเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰เบขเปˆเบฒเบ‡เบเบงเป‰เบฒเบ‡เบ‚เบงเบฒเบ‡เบ‚เบญเบ‡ DoH เปเบกเปˆเบ™เบˆเบธเบ”เบชเบธเบกเบ‚เบญเบ‡เบกเบฑเบ™เบžเบฝเบ‡เปเบ•เปˆเบขเบนเปˆเปƒเบ™เบเบฒเบ™เป€เบ‚เบปเป‰เบฒเบŠเบปเบกเป€เบงเบฑเบšเป„เบŠเบ•เปŒ. เปเบ—เป‰เบˆเบดเบ‡เปเบฅเป‰เบง, เป‚เบ›เป‚เบ•เบ„เบญเบ™ HTTP เปเบฅเบฐ HTTP / 2 เบฎเบธเปˆเบ™เบ›เบฐเบˆเบธเบšเบฑเบ™เบ‚เบญเบ‡เบกเบฑเบ™, เบ—เบตเปˆ DoH เปเบกเปˆเบ™เบญเบตเบ‡เปƒเบชเปˆ, เปเบกเปˆเบ™เบžเบทเป‰เบ™เบ–เบฒเบ™เบ‚เบญเบ‡ WWW. เปเบ•เปˆเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบšเปเปˆเบžเบฝเบ‡เปเบ•เปˆเป€เบ›เบฑเบ™เป€เบงเบฑเบšเป€เบ—เบปเปˆเบฒเบ™เบฑเป‰เบ™. เบกเบตเบซเบผเบฒเบเบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ™เบดเบเบปเบก, เป€เบŠเบฑเปˆเบ™เบญเบตเป€เบกเบฅเปŒ, เบ‚เปเป‰เบ„เบงเบฒเบกเบ—เบฑเบ™เบ—เบตเบ•เปˆเบฒเบ‡เป†, เบฅเบฐเบšเบปเบšเบเบฒเบ™เป‚เบญเบ™เป„เบŸเบฅเปŒ, เบเบฒเบ™เบ–เปˆเบฒเบเบ—เบญเบ”เบกเบฑเบ™เบ•เบดเบกเบตเป€เบ”เบ, เปเบฅเบฐเบญเบทเปˆเบ™เป†, เบ—เบตเปˆเบšเปเปˆเปƒเบŠเป‰ HTTP. เบ”เบฑเปˆเบ‡เบ™เบฑเป‰เบ™, เป€เบ–เบดเบ‡เบงเปˆเบฒเบˆเบฐเบกเบตเบ„เบงเบฒเบกเบฎเบฑเบšเบฎเบนเป‰เป‚เบ”เบเบซเบผเบฒเบเป†เบ„เบปเบ™เบ‚เบญเบ‡ DoH เป€เบ›เบฑเบ™ panacea, เบกเบฑเบ™เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเบšเปเปˆเบชเบฒเบกเบฒเบ”เปƒเบŠเป‰เป„เบ”เป‰เป‚เบ”เบเบšเปเปˆเบกเบตเบ„เบงเบฒเบกเบžเบฐเบเบฒเบเบฒเบกเป€เบžเบตเปˆเบกเป€เบ•เบตเบก (เปเบฅเบฐเบšเปเปˆเบˆเปเบฒเป€เบ›เบฑเบ™) เบชเปเบฒเบฅเบฑเบšเบชเบดเปˆเบ‡เบญเบทเปˆเบ™เบ™เบญเบเป€เบซเบ™เบทเบญเบˆเบฒเบเป€เบ•เบฑเบเป‚เบ™เป‚เบฅเบขเบตเบ‚เบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. เป‚เบ”เบเบงเบดเบ—เบตเบ—เบฒเบ‡เบเบฒเบ™, DNS-over-TLS เป€เบšเบดเปˆเบ‡เบ„เบทเบงเปˆเบฒเป€เบ›เบฑเบ™เบœเบนเป‰เบชเบฐเบซเบกเบฑเบเบ—เบตเปˆเบกเบตเบ„เปˆเบฒเบซเบผเบฒเบเบชเปเบฒเบฅเบฑเบšเบšเบปเบ”เบšเบฒเบ”เบ™เบตเป‰, เป€เบŠเบดเปˆเบ‡เบ›เบฐเบ•เบดเบšเบฑเบ”เบเบฒเบ™เบซเบธเป‰เบกเบซเปเปˆเบ‚เบญเบ‡เบเบฒเบ™เบˆเบฐเบฅเบฒเบˆเบญเบ™ DNS เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เปƒเบ™เป‚เบ›เป‚เบ•เบ„เบญเบ™ TLS เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เบ—เบตเปˆเบ›เบญเบ”เป„เบž.

เบšเบฑเบ™เบซเบฒเบ—เบตเบชเบญเบ‡, เบ—เบตเปˆเบกเบตเบ—เปˆเบฒเปเบฎเบ‡เบซเบผเบฒเบเบเปˆเบงเบฒเบ—เปเบฒเบญเบดเบ”, เปเบกเปˆเบ™เบเบฒเบ™เบ›เบฐเบ–เบดเป‰เบกเบ•เบปเบงเบˆเบดเบ‡เบ‚เบญเบ‡เบเบฒเบ™เปเบšเปˆเบ‡เบ‚เบฑเป‰เบ™เบ„เบธเป‰เบกเบ„เบญเบ‡เบ‚เบญเบ‡ DNS เป‚เบ”เบเบเบฒเบ™เบญเบญเบเปเบšเบšเป€เบžเบทเปˆเบญเบ™เปเบฒเปƒเบŠเป‰เป€เบ„เบทเปˆเบญเบ‡เปเบกเปˆเบ‚เปˆเบฒเบ DoH เบ”เบฝเบงเบ—เบตเปˆเบฅเบฐเบšเบธเป„เบงเป‰เปƒเบ™เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ‚เบญเบ‡เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบš. เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ, Mozilla เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เปƒเบŠเป‰เบšเปเบฅเบดเบเบฒเบ™เบˆเบฒเบ Cloudflare. เบเบฒเบ™เบšเปเบฅเบดเบเบฒเบ™เบ—เบตเปˆเบ„เป‰เบฒเบเบ„เบทเบเบฑเบ™เบเบฑเบ‡เป„เบ”เป‰เป€เบ›เบตเบ”เบ•เบปเบงเป‚เบ”เบเบ•เบปเบงเป€เบฅเบเบญเบดเบ™เป€เบ•เบตเป€เบ™เบฑเบ”เบ—เบตเปˆเป‚เบ”เบ”เป€เบ”เบฑเปˆเบ™เบญเบทเปˆเบ™เป†, เป‚เบ”เบเบชเบฐเป€เบžเบฒเบฐ Google. เบกเบฑเบ™ turns เปƒเบซเป‰เป€เบซเบฑเบ™เบงเปˆเบฒเบเบฒเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เบ‚เบญเบ‡ 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 protocol. เบ™เบตเป‰เปเบกเปˆเบ™เบ›เบฐเบ•เบดเบšเบฑเบ”เป‚เบ”เบเบœเปˆเบฒเบ™เบชเปˆเบงเบ™เบซเบปเบง HTTP เบžเบดเป€เบชเบ”, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เบ›เปˆเบฝเบ™เบฎเบนเบšเปเบšเบšเบ–เบฒเบ™เบชเบญเบ‡เบ‚เบญเบ‡เบ‚เปเป‰เบกเบนเบ™ DNS เบ—เบตเปˆเบชเบปเปˆเบ‡เบœเปˆเบฒเบ™ (เป€เบšเบดเปˆเบ‡. RFC1035 เปเบฅเบฐเป€เบญเบเบฐเบชเบฒเบ™เบ•เปเปˆเบกเบฒ) เป€เบ‚เบปเป‰เบฒเป„เบ›เปƒเบ™เปเบšเบšเบŸเบญเบกเบ—เบตเปˆเบŠเปˆเบงเบเปƒเบซเป‰เบ—เปˆเบฒเบ™เบชเบฒเบกเบฒเบ”เบชเบปเปˆเบ‡เปเบฅเบฐเบฎเบฑเบšเบžเบงเบเบกเบฑเบ™เป„เบ”เป‰, เป€เบŠเบฑเปˆเบ™เบ”เบฝเบงเบเบฑเบ™เบเบฑเบšเบเบฒเบ™เป€เบฎเบฑเบ”เบงเบฝเบเบเบฑเบš metadata เบ—เบตเปˆเบˆเปเบฒเป€เบ›เบฑเบ™.

เบญเบตเบ‡เบ•เบฒเบกเบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™, เบฎเบญเบ‡เบฎเบฑเบšเบžเบฝเบ‡เปเบ•เปˆ 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 เปเบฅเบฐเป€เบญเบตเป‰เบ™เบงเปˆเบฒเบ—เบฒเบ‡เป€เบฅเบทเบญเบ handler, เบ•เบปเบงเบˆเบดเบ‡เปเบฅเป‰เบงเปเบกเปˆเบ™เบฎเบฑเบšเบœเบดเบ”เบŠเบญเบš. 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โ€‹, เปƒเบ™โ€‹เบเปโ€‹เบฅเบฐโ€‹เบ™เบตโ€‹เบ™เบตเป‰โ€‹ เบšเปเปˆเบกเบตเบ‚เปเป‰เบœเบนเบเบกเบฑเบ” เบˆเบฒเบเบเบฒเบ™เปเบˆเบเบขเบฒเบ 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          *:*

เบ—เบฑเบ‡เบซเบกเบปเบ”เบ—เบตเปˆเบเบฑเบ‡เป€เบซเบผเบทเบญเปเบกเปˆเบ™เป€เบžเบทเปˆเบญ restart 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.tr.uri. เบกเบฑเบ™เบเบฑเบ‡เปเบ™เบฐเบ™เปเบฒเปƒเบซเป‰เบฅเบฐเบšเบธ IP เป‚เบ”เป€เบกเบ™เบˆเบฒเบ URL เบ™เบตเป‰เบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚ IP เบ—เบตเปˆเบ›เบญเบ”เป„เบžเป‚เบ”เบเปƒเบŠเป‰เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡เป‚เบ”เบเบšเปเปˆเบกเบตเบเบฒเบ™เป€เบ‚เบปเป‰เบฒเป€เบ–เบดเบ‡ DNS เปƒเบ™ network.trr.bootstrap เบ—เบตเปˆเบขเบนเปˆ. เปเบฅเบฐเบชเบธเบ”เบ—เป‰เบฒเบ, เบ•เบปเบงเบเปเบฒเบ™เบปเบ”เบเบฒเบ™เบ‚เบญเบ‡เบกเบฑเบ™เป€เบญเบ‡ network.trr.mode เบฅเบงเบกเบ—เบฑเบ‡เบเบฒเบ™เบ™เปเบฒเปƒเบŠเป‰ DoH. เบเบฒเบ™เบ•เบฑเป‰เบ‡เบ„เปˆเบฒเบ„เปˆเบฒเป€เบ›เบฑเบ™ "3" เบˆเบฐเบšเบฑเบ‡เบ„เบฑเบšเปƒเบซเป‰เบ•เบปเบงเบ—เปˆเบญเบ‡เป€เบงเบฑเบšเปƒเบŠเป‰ DNS-over-HTTPS เบชเบฐเป€เบžเบฒเบฐเบชเปเบฒเบฅเบฑเบšเบเบฒเบ™เปเบเป‰เป„เบ‚เบŠเบทเปˆ, เปƒเบ™เบ‚เบฐเบ™เบฐเบ—เบตเปˆ "2" เบ—เบตเปˆเป€เบŠเบทเปˆเบญเบ–เบทเป„เบ”เป‰เปเบฅเบฐเบ›เบญเบ”เป„เบžเบเบงเปˆเบฒเบˆเบฐเปƒเบซเป‰เบ„เบงเบฒเบกเบชเปเบฒเบ„เบฑเบ™เบเบฑเบš DoH, เป€เบŠเบดเปˆเบ‡เป€เบฎเบฑเบ”เปƒเบซเป‰เบเบฒเบ™เบŠเบญเบเบซเบฒ DNS เบกเบฒเบ”เบ•เบฐเบ–เบฒเบ™เป€เบ›เบฑเบ™เบ—เบฒเบ‡เป€เบฅเบทเบญเบเบ—เบตเปˆเบซเบผเบธเบ”เบฅเบปเบ‡.

5. เบเปเบฒเป„เบฅ!

เบšเบปเบ”เบ„เบงเบฒเบกเป€เบ›เบฑเบ™เบ›เบฐเป‚เบซเบเบ”เบšเป? เบซเบผเบฑเบ‡เบˆเบฒเบเบ™เบฑเป‰เบ™, เบเบฐเบฅเบธเบ™เบฒเบขเปˆเบฒเบญเบฒเบเปเบฅเบฐเบชเบฐเบซเบ™เบฑเบšเบชเบฐเบซเบ™เบนเบ™เป€เบ‡เบดเบ™เป‚เบ”เบเบœเปˆเบฒเบ™เปเบšเบšเบŸเบญเบกเบเบฒเบ™เบšเปเบฅเบดเบˆเบฒเบ (เบ‚เป‰เบฒเบ‡เบฅเบธเปˆเบกเบ™เบตเป‰).

เปเบซเบผเปˆเบ‡เบ‚เปเป‰เบกเบนเบ™: www.habr.com

เป€เบžเบตเปˆเบกเบ„เบงเบฒเบกเบ„เบดเบ”เป€เบซเบฑเบ™