เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ DNS-เช“เชตเชฐ-HTTPS เชธเชฐเซเชตเชฐเชจเซ‡ เชตเชงเชพเชฐเซ€เช เช›เซ€เช

DNS เช‘เชชเชฐเซ‡เชถเชจเชจเชพ เชตเชฟเชตเชฟเชง เชชเชพเชธเชพเช“เชจเซ‡ เชฒเซ‡เช–เช• เชฆเซเชตเชพเชฐเชพ เชธเช‚เช–เซเชฏเชพเชฌเช‚เชงเชฎเชพเช‚ เชตเชพเชฐเช‚เชตเชพเชฐ เชธเซเชชเชฐเซเชถ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซเชฏเชพ เช›เซ‡ เชฒเซ‡เช–เซ‹ เชฌเซเชฒเซ‹เช—เชจเชพ เชญเชพเช— เชฐเซ‚เชชเซ‡ เชชเซเชฐเช•เชพเชถเชฟเชค. เชคเซ‡ เชœ เชธเชฎเชฏเซ‡, เชฎเซเช–เซเชฏ เชญเชพเชฐ เชนเช‚เชฎเซ‡เชถเชพ เช† เช•เซ€ เชˆเชจเซเชŸเชฐเชจเซ‡เชŸ เชธเซ‡เชตเชพเชจเซ€ เชธเซเชฐเช•เซเชทเชพเชจเซ‡ เชธเซเชงเชพเชฐเชตเชพ เชชเชฐ เชฐเชนเซเชฏเซ‹ เช›เซ‡.

เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ DNS-เช“เชตเชฐ-HTTPS เชธเชฐเซเชตเชฐเชจเซ‡ เชตเชงเชพเชฐเซ€เช เช›เซ€เช

เชคเชพเชœเซ‡เชคเชฐเชฎเชพเช‚ เชธเซเชงเซ€, DNS เชŸเซเชฐเชพเชซเชฟเช•เชจเซ€ เชธเซเชชเชทเซเชŸ เชจเชฌเชณเชพเชˆ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชœเซ‡ เชนเชœเซ€ เชชเชฃ, เชฎเซ‹เชŸเชพเชญเชพเช—เซ‡, เชธเชพเชฎเช—เซเชฐเซ€, เชธเชฐเช•เชพเชฐเซ€ เชธเซเชฐเช•เซเชทเชพ เชเชœเชจเซเชธเซ€เช“ เช…เชจเซ‡ เชธเซ‡เชจเซเชธเชฐเชถเซ€เชชเชฎเชพเช‚ เชœเชพเชนเซ‡เชฐเชพเชคเซ‹เชจเซ‡ เชเชฎเซเชฌเซ‡เชก เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชฎเชจเซ€ เช†เชตเช• เชตเชงเชพเชฐเชตเชพ เชฎเชพเช‚เช—เชคเชพ เชชเซเชฐเชฆเชพเชคเชพเช“เชจเซ€ เชฆเซ‚เชทเชฟเชค เช•เซเชฐเชฟเชฏเชพเช“ เชฎเชพเชŸเซ‡ เชธเซเชชเชทเซเชŸ เชฐเซ€เชคเซ‡ เชชเซเชฐเชธเชพเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡, เชคเซ‡เชฎเชœ เชฎเชพเชคเซเชฐ เช—เซเชจเซ‡เช—เชพเชฐเซ‹, เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชคเซ‡เชจเชพ เชฐเช•เซเชทเชฃเชจเซ‡ เชฎเชœเชฌเซ‚เชค เชฌเชจเชพเชตเชตเซเช‚, DNSSEC/DANE, DNScrypt, DNS-over-TLS เช…เชจเซ‡ DNS-over-HTTPS เชœเซ‡เชตเซ€ เชตเชฟเชตเชฟเชง เชคเช•เชจเซ€เช•เซ‹เชจเซ€ เชนเชพเชœเชฐเซ€ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เช…เชŸเช•เซ€ เช—เชˆ. เช…เชจเซ‡ เชœเซ‹ เชธเชฐเซเชตเชฐ เชธเซ‹เชฒเซเชฏเซเชถเชจเซเชธ, เช…เชจเซ‡ เชคเซ‡เชฎเชพเช‚เชจเชพ เช•เซ‡เชŸเชฒเชพเช• เช˜เชฃเชพ เชฒเชพเช‚เชฌเชพ เชธเชฎเชฏเชฅเซ€ เช…เชธเซเชคเชฟเชคเซเชตเชฎเชพเช‚ เช›เซ‡, เชตเซเชฏเชพเชชเช•เชชเชฃเซ‡ เชœเชพเชฃเซ€เชคเชพ เช…เชจเซ‡ เช‰เชชเชฒเชฌเซเชง เช›เซ‡, เชคเซ‹ เช•เซเชฒเชพเชฏเช‚เชŸ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐ เชคเชฐเชซเชฅเซ€ เชคเซ‡เชฎเชจเซ‹ เชธเชชเซ‹เชฐเซเชŸ เช‡เชšเซเช›เชฟเชค เชฅเชตเชพ เชฎเชพเชŸเซ‡ เช˜เชฃเซเช‚ เช›เซ‹เชกเซ€ เชฆเซ‡ เช›เซ‡.

เชธเชฆเชจเชธเซ€เชฌเซ‡, เชชเชฐเชฟเชธเซเชฅเชฟเชคเชฟ เชฌเชฆเชฒเชพเชˆ เชฐเชนเซ€ เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชซเชพเชฏเชฐเชซเซ‹เช•เซเชธ เชฌเซเชฐเชพเช‰เชเชฐเชจเชพ เชตเชฟเช•เชพเชธเช•เชฐเซเชคเชพเช“ เชœเชฃเชพเชตเซเชฏเซเช‚ เชกเชฟเชซเซ‰เชฒเซเชŸ เชฐเซ‚เชชเซ‡ เชธเชชเซ‹เชฐเซเชŸ เชฎเซ‹เชกเชจเซ‡ เชธเช•เซเชทเชฎ เช•เชฐเชตเชพเชจเซ€ เชฏเซ‹เชœเชจเชพเช“ เชตเชฟเชถเซ‡ DNS-เช“เชตเชฐ-HTTPS (DoH) เชŸเซ‚เช‚เช• เชธเชฎเชฏเชฎเชพเช‚. เช†เชจเชพเชฅเซ€ WWW เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเชจเชพ DNS เชŸเซเชฐเชพเชซเชฟเช•เชจเซ‡ เช‰เชชเชฐเซ‹เช•เซเชค เชœเซ‹เช–เชฎเซ‹เชฅเซ€ เชธเซเชฐเช•เซเชทเชฟเชค เช•เชฐเชตเชพเชฎเชพเช‚ เชฎเชฆเชฆ เช•เชฐเชตเซ€ เชœเซ‹เชˆเช, เชชเชฐเช‚เชคเซ เชธเช‚เชญเชตเชฟเชคเชชเชฃเซ‡ เชจเชตเชพ เชฐเชœเซ‚ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

1. DNS-เช“เชตเชฐ-HTTPS เชธเชฎเชธเซเชฏเชพเช“

เชชเซเชฐเชฅเชฎ เชจเชœเชฐเชฎเชพเช‚, เชˆเชจเซเชŸเชฐเชจเซ‡เชŸ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชฎเชพเช‚ DNS-เช“เชตเชฐ-HTTPS เชจเซ‹ เชชเซเชฐเชพเชฐเช‚เชญเชฟเช• เชธเชฎเซ‚เชน เชฎเชพเชคเซเชฐ เชนเช•เชพเชฐเชพเชคเซเชฎเช• เชชเซเชฐเชคเชฟเช•เซเชฐเชฟเชฏเชพเชจเซเช‚ เช•เชพเชฐเชฃ เชฌเชจเซ‡ เช›เซ‡. เชœเซ‹ เช•เซ‡, เชถเซ‡เชคเชพเชจ, เชœเซ‡เชฎ เชคเซ‡เช“ เช•เชนเซ‡ เช›เซ‡, เชตเชฟเช—เชคเซ‹เชฎเชพเช‚ เช›เซ‡.

เชชเซเชฐเชฅเชฎ เชธเชฎเชธเซเชฏเชพ เชœเซ‡ DoH เชจเชพ เชตเซเชฏเชพเชชเช• เช‰เชชเชฏเซ‹เช—เชจเชพ เช…เชตเช•เชพเชถเชจเซ‡ เชฎเชฐเซเชฏเชพเชฆเชฟเชค เช•เชฐเซ‡ เช›เซ‡ เชคเซ‡ เชคเซ‡เชจเซเช‚ เชงเซเชฏเชพเชจ เชซเช•เซเชค เชตเซ‡เชฌ เชŸเซเชฐเชพเชซเชฟเช• เชชเชฐ เช›เซ‡. เช–เชฐเซ‡เช–เชฐ, HTTP เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ เช…เชจเซ‡ เชคเซ‡เชจเซเช‚ เชตเชฐเซเชคเชฎเชพเชจ เชธเช‚เชธเซเช•เชฐเชฃ HTTP/2, เชœเซ‡เชจเชพ เชชเชฐ DoH เช†เชงเชพเชฐเชฟเชค เช›เซ‡, เชคเซ‡ WWW เชจเซ‹ เช†เชงเชพเชฐ เช›เซ‡. เชชเชฐเช‚เชคเซ เชˆเชจเซเชŸเชฐเชจเซ‡เชŸ เชฎเชพเชคเซเชฐ เชตเซ‡เชฌ เชจเชฅเซ€. เช˜เชฃเซ€ เชฌเชงเซ€ เชฒเซ‹เช•เชชเซเชฐเชฟเชฏ เชธเซ‡เชตเชพเช“ เช›เซ‡, เชœเซ‡เชฎ เช•เซ‡ เช‡เชฎเซ‡เช‡เชฒ, เชตเชฟเชตเชฟเชง เช‡เชจเซเชธเซเชŸเชจเซเชŸ เชฎเซ‡เชธเซ‡เชจเซเชœเชฐเซเชธ, เชซเชพเช‡เชฒ เชŸเซเชฐเชพเชจเซเชธเชซเชฐ เชธเชฟเชธเซเชŸเชฎเซเชธ, เชฎเชฒเซเชŸเซ€เชฎเซ€เชกเชฟเชฏเชพ เชธเซเชŸเซเชฐเซ€เชฎเชฟเช‚เช— เชตเช—เซ‡เชฐเซ‡, เชœเซ‡ HTTP เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชคเซ€ เชจเชฅเซ€. เช†เชฎ, เช˜เชฃเชพ เชฌเชงเชพ DoH เชฆเซเชตเชพเชฐเชพ เชฐเชพเชฎเชฌเชพเชฃ เชคเชฐเซ€เช•เซ‡เชจเซ€ เชงเชพเชฐเชฃเชพ เชนเซ‹เชตเชพ เช›เชคเชพเช‚, เชคเซ‡ เชฌเซเชฐเชพเช‰เชเชฐ เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€ เชธเชฟเชตเชพเชฏเชจเซ€ เช•เซ‹เชˆเชชเชฃ เชตเชธเซเชคเซ เชฎเชพเชŸเซ‡ เชตเชงเชพเชฐเชพเชจเชพ (เช…เชจเซ‡ เชฌเชฟเชจเชœเชฐเซ‚เชฐเซ€) เชชเซเชฐเชฏเชคเซเชจเซ‹ เชตเชฟเชจเชพ เช…เชฏเซ‹เช—เซเชฏ เชนเซ‹เชตเชพเชจเซเช‚ เชฌเชนเชพเชฐ เช†เชตเซเชฏเซเช‚ เช›เซ‡. เชฎเชพเชฐเซเช— เชฆเซเชตเชพเชฐเชพ, DNS-เช“เชตเชฐ-TLS เช† เชญเซ‚เชฎเชฟเช•เชพ เชฎเชพเชŸเซ‡ เชตเชงเซ เชฒเชพเชฏเช• เช‰เชฎเซ‡เชฆเชตเชพเชฐ เชœเซ‡เชตเซ‹ เชฆเซ‡เช–เชพเชฏ เช›เซ‡, เชœเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค เชฎเชพเชจเช• TLS เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชฎเชพเช‚ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค DNS เชŸเซเชฐเชพเชซเชฟเช•เชจเชพ เชเชจเซเช•เซ‡เชชเซเชธเซเชฏเซเชฒเซ‡เชถเชจเชจเซ‡ เชฒเชพเช—เซ เช•เชฐเซ‡ เช›เซ‡.

เชฌเซ€เชœเซ€ เชธเชฎเชธเซเชฏเชพ, เชœเซ‡ เชธเช‚เชญเชตเชฟเชค เชฐเซ€เชคเซ‡ เชชเซเชฐเชฅเชฎ เช•เชฐเชคเชพเช‚ เช˜เชฃเซ€ เชตเชงเซ เชจเซ‹เช‚เชงเชชเชพเชคเซเชฐ เช›เซ‡, เชฌเซเชฐเชพเช‰เชเชฐ เชธเซ‡เชŸเชฟเช‚เช—เซเชธเชฎเชพเช‚ เช‰เชฒเซเชฒเซ‡เช–เชฟเชค เชเช• เชœ DoH เชธเชฐเซเชตเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซ€ เชคเชฐเชซเซ‡เชฃเชฎเชพเช‚ เชกเชฟเชเชพเช‡เชจ เชฆเซเชตเชพเชฐเชพ DNS เชจเชพ เช†เช‚เชคเชฐเชฟเช• เชตเชฟเช•เซ‡เชจเซเชฆเซเชฐเซ€เช•เชฐเชฃเชจเซ‹ เชตเชพเชธเซเชคเชตเชฟเช• เชคเซเชฏเชพเช— เช›เซ‡. เช–เชพเชธ เช•เชฐเซ€เชจเซ‡, เชฎเซ‹เชเชฟเชฒเชพ Cloudflare เชจเซ€ เชธเซ‡เชตเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชจเซเช‚ เชธเซ‚เชšเชจ เช•เชฐเซ‡ เช›เซ‡. เช†เชตเซ€ เชœ เชธเซ‡เชตเชพ เช…เชจเซเชฏ เช…เช—เซเชฐเชฃเซ€ เชˆเชจเซเชŸเชฐเชจเซ‡เชŸ เชนเชธเซเชคเซ€เช“, เช–เชพเชธ เช•เชฐเซ€เชจเซ‡ เช—เซ‚เช—เชฒ เชฆเซเชตเชพเชฐเชพ เชชเชฃ เชถเชฐเซ‚ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€. เชคเซ‡ เชคเชพเชฐเชฃ เช†เชชเซ‡ เช›เซ‡ เช•เซ‡ DNS-เช“เชตเชฐ-HTTPS เชจเชพ เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เช…เชฎเชฒเซ€เช•เชฐเชฃ เช•เซ‡ เชœเซ‡เชฎเชพเช‚ เชคเซ‡ เชนเชพเชฒเชฎเชพเช‚ เชชเซเชฐเชธเซเชคเชพเชตเชฟเชค เช›เซ‡ เชคเซ‡ เชฎเชพเชคเซเชฐ เชธเซŒเชฅเซ€ เชฎเซ‹เชŸเซ€ เชธเซ‡เชตเชพเช“ เชชเชฐ เช…เช‚เชคเชฟเชฎ เชตเชชเชฐเชพเชถเช•เชฐเซเชคเชพเช“เชจเซ€ เชจเชฟเชฐเซเชญเชฐเชคเชพเชฎเชพเช‚ เชตเชงเชพเชฐเซ‹ เช•เชฐเซ‡ เช›เซ‡. เชคเซ‡ เช•เซ‹เชˆ เชฐเชนเชธเซเชฏ เชจเชฅเซ€ เช•เซ‡ DNS เชชเซเชฐเชถเซเชจเซ‹เชจเซเช‚ เชตเชฟเชถเซเชฒเซ‡เชทเชฃ เชœเซ‡ เชฎเชพเชนเชฟเชคเซ€ เชชเซเชฐเชฆเชพเชจ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡ เชคเซ‡ เชคเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชตเชงเซ เชกเซ‡เชŸเชพ เชเช•เชคเซเชฐเชฟเชค เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡, เชคเซ‡เชฎเชœ เชคเซ‡เชจเซ€ เชธเชšเซ‹เชŸเชคเชพ เช…เชจเซ‡ เชธเซเชธเช‚เช—เชคเชคเชพเชฎเชพเช‚ เชตเชงเชพเชฐเซ‹ เช•เชฐเซ€ เชถเช•เซ‡ เช›เซ‡.

เช† เชธเช‚เชฆเชฐเซเชญเชฎเชพเช‚, เชฒเซ‡เช–เช• DNS-เช“เชตเชฐ-HTTPS เชจเชพ เชธเชพเชฎเซ‚เชนเชฟเช• เช…เชฎเชฒเซ€เช•เชฐเชฃเชจเชพ เชธเชฎเชฐเซเชฅเช• เชนเชคเชพ เช…เชจเซ‡ เชฐเชนเซเชฏเชพ เช›เซ‡, เชชเชฐเช‚เชคเซ DNS-over-TLS เชจเชพ DNSSEC/DANE เชธเชพเชฅเซ‡ เชฎเชณเซ€เชจเซ‡ เชธเชพเชฐเซเชตเชคเซเชฐเชฟเช•, เชธเซเชฐเช•เซเชทเชฟเชค เช…เชจเซ‡ เช‡เชจเซเชŸเชฐเชจเซ‡เชŸ เชฎเชพเชงเซเชฏเชฎเชจเชพ เชตเชงเซ เช•เซ‡เชจเซเชฆเซเชฐเชฟเชฏเช•เชฐเชฃ เชฎเชพเชŸเซ‡ เช…เชจเซเช•เซ‚เชณ เชจเชฅเซ€. DNS เชŸเซเชฐเชพเชซเชฟเช•เชจเซ€ เชธเซเชฐเช•เซเชทเชพ เชธเซเชจเชฟเชถเซเชšเชฟเชค เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡. เช•เชฎเชจเชธเซ€เชฌเซ‡, เชธเซเชชเชทเซเชŸ เช•เชพเชฐเชฃเซ‹เชธเชฐ, เช•เซเชฒเชพเชฏเช‚เชŸ เชธเซ‹เชซเซเชŸเชตเซ‡เชฐเชฎเชพเช‚ DoH เชตเชฟเช•เชฒเซเชชเซ‹ เชฎเชพเชŸเซ‡ เชธเชพเชฎเซ‚เชนเชฟเช• เชธเชฎเชฐเซเชฅเชจเชจเซ€ เชเชกเชชเซ€ เชฐเชœเซ‚เช†เชคเชจเซ€ เช…เชชเซ‡เช•เซเชทเชพ เชฐเชพเช–เซ€ เชถเช•เชพเชคเซ€ เชจเชฅเซ€, เช…เชจเซ‡ เชคเซ‡ เชนเชœเซ เชชเชฃ เชธเซเชฐเช•เซเชทเชพ เชŸเซ‡เช•เซเชจเซ‹เชฒเซ‹เชœเซ€ เช‰เชคเซเชธเชพเชนเซ€เช“เชจเซเช‚ เชกเซ‹เชฎเซ‡เชจ เช›เซ‡.

เชชเชฐเช‚เชคเซ เช…เชฎเชพเชฐเซ€ เชชเชพเชธเซ‡ เชนเชตเซ‡ DoH เชนเซ‹เชตเชพเชฅเซ€, เช•เซ‹เชฐเซเชชเซ‹เชฐเซ‡เชถเชจเซ‹ เชฆเซเชตเชพเชฐเชพ เชคเซ‡เชฎเชจเชพ เชธเชฐเซเชตเชฐ เชฆเซเชตเชพเชฐเชพ เช…เชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ DNS-เช“เชตเชฐ-HTTPS เชธเชฐเซเชตเชฐ เชชเชฐ เชธเช‚เชญเชตเชฟเชค เชฆเซ‡เช–เชฐเซ‡เช–เชฎเชพเช‚เชฅเซ€ เชฌเชนเชพเชฐ เชจเซ€เช•เชณเซเชฏเชพ เชชเช›เซ€ เชถเชพ เชฎเชพเชŸเซ‡ เชคเซ‡เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชถเซ‹ เชจเชนเซ€เช‚?

2. DNS-เช“เชตเชฐ-HTTPS เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒ

เชœเซ‹ เชคเชฎเซ‡ เชงเซ‹เชฐเชฃ เชœเซเช“ เช†เชฐเชเชซเชธเซ€ 8484 DNS-เช“เชตเชฐ-HTTPS เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชจเซเช‚ เชตเชฐเซเชฃเชจ เช•เชฐเชคเชพเช‚, เชคเชฎเซ‡ เชœเซ‹เชˆ เชถเช•เซ‹ เช›เซ‹ เช•เซ‡ เชคเซ‡, เชนเช•เซ€เช•เชคเชฎเชพเช‚, เชเช• เชตเซ‡เชฌ API เช›เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ HTTP/2 เชชเซเชฐเซ‹เชŸเซ‹เช•เซ‹เชฒเชฎเชพเช‚ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค DNS เชชเซ‡เช•เซ‡เชœเชจเซ‡ เชธเชฎเชพเชตเชฟเชทเซเชŸ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡. เช† เช–เชพเชธ HTTP เชนเซ‡เชกเชฐเซ‹ เชฆเซเชตเชพเชฐเชพ เชฒเชพเช—เซ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡, เชคเซ‡เชฎเชœ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸเซ‡เชก DNS เชกเซ‡เชŸเชพเชจเชพ เชฌเชพเชˆเชจเชฐเซ€ เชซเซ‹เชฐเซเชฎเซ‡เชŸเชจเชพ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฃ (เชœเซเช“. เช†เชฐเชเชซเชธเซ€ 1035 เช…เชจเซ‡ เช…เชจเซเช—เชพเชฎเซ€ เชฆเชธเซเชคเชพเชตเซ‡เชœเซ‹) เชเช• เชซเซ‹เชฐเซเชฎเชฎเชพเช‚ เช•เซ‡ เชœเซ‡ เชคเชฎเชจเซ‡ เชคเซ‡เชฎเชจเซ‡ เชŸเซเชฐเชพเชจเซเชธเชฎเชฟเชŸ เช•เชฐเชตเชพ เช…เชจเซ‡ เชชเซเชฐเชพเชชเซเชค เช•เชฐเชตเชพ เชคเซ‡เชฎเชœ เชœเชฐเซ‚เชฐเซ€ เชฎเซ‡เชŸเชพเชกเซ‡เชŸเชพ เชธเชพเชฅเซ‡ เช•เชพเชฎ เช•เชฐเชตเชพเชจเซ€ เชฎเช‚เชœเซ‚เชฐเซ€ เช†เชชเซ‡ เช›เซ‡.

เชฎเชพเชจเช• เช…เชจเซเชธเชพเชฐ, เชฎเชพเชคเซเชฐ HTTP/2 เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค TLS เช•เชจเซ‡เช•เซเชถเชจ เชœ เชธเชฎเชฐเซเชฅเชฟเชค เช›เซ‡.

DNS เชตเชฟเชจเช‚เชคเซ€ เชฎเซ‹เช•เชฒเชตเชพเชจเซเช‚ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค GET เช…เชจเซ‡ POST เชชเชฆเซเชงเชคเชฟเช“เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เช•เชฐเซ€ เชถเช•เชพเชฏ เช›เซ‡. เชชเซเชฐเชฅเชฎ เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, เชตเชฟเชจเช‚เชคเซ€ เชฌเซ‡เช 64URL-เชเชจเช•เซ‹เชกเซ‡เชก เชธเซเชŸเซเชฐเชฟเช‚เช—เชฎเชพเช‚ เชฐเซ‚เชชเชพเช‚เชคเชฐเชฟเชค เชฅเชพเชฏ เช›เซ‡, เช…เชจเซ‡ เชฌเซ€เชœเชพเชฎเชพเช‚, เชฌเชพเชˆเชจเชฐเซ€ เชธเซเชตเชฐเซ‚เชชเชฎเชพเช‚ POST เชตเชฟเชจเช‚เชคเซ€เชจเชพ เชฎเซเช–เซเชฏ เชญเชพเช— เชฆเซเชตเชพเชฐเชพ. เช† เช•เชฟเชธเซเชธเชพเชฎเชพเช‚, DNS เชตเชฟเชจเช‚เชคเซ€ เช…เชจเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฆเชฐเชฎเชฟเชฏเชพเชจ เชตเชฟเชถเชฟเชทเซเชŸ MIME เชกเซ‡เชŸเชพ เชชเซเชฐเช•เชพเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡ เชเชชเซเชฒเชฟเช•เซ‡เชถเชจ/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

เชถเซ€เชฐเซเชทเช• เชชเชฐ เชชเชฃ เชงเซเชฏเชพเชจ เช†เชชเซ‹ เช•เซ‡เชถ เชจเชฟเชฏเช‚เชคเซเชฐเชฃ: เชตเซ‡เชฌ เชธเชฐเซเชตเชฐ เชคเชฐเชซเชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆเชฎเชพเช‚. เชชเชฐเชฟเชฎเชพเชฃเชฎเชพเช‚ เชฎเชนเชคเซเชคเชฎ เชตเชฏ เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเชคเชพ DNS เชฐเซ‡เช•เซ‹เชฐเซเชก เชฎเชพเชŸเซ‡ TTL เชฎเซ‚เชฒเซเชฏ เชงเชฐเชพเชตเซ‡ เช›เซ‡ (เช…เชฅเชตเชพ เชœเซ‹ เชคเซ‡เชจเซ‹ เชธเชฎเซ‚เชน เชชเชฐเชค เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เชคเซ‹ เชฒเช˜เซเชคเซเชคเชฎ เชฎเซ‚เชฒเซเชฏ).

เช‰เชชเชฐเชจเชพ เช†เชงเชพเชฐเซ‡, DoH เชธเชฐเซเชตเชฐเชจเซ€ เช•เชพเชฎเช—เซ€เชฐเซ€เชฎเชพเช‚ เช˜เชฃเชพ เชคเชฌเช•เซเช•เชพเช“ เชนเซ‹เชฏ เช›เซ‡.

  • HTTP เชตเชฟเชจเช‚เชคเซ€ เชชเซเชฐเชพเชชเซเชค เช•เชฐเซ‹. เชœเซ‹ เช† GET เช›เซ‡ เชคเซ‹ base64URL เชเชจเซเช•เซ‹เชกเชฟเช‚เช—เชฎเชพเช‚เชฅเซ€ เชชเซ‡เช•เซ‡เชŸเชจเซ‡ เชกเซ€เช•เซ‹เชก เช•เชฐเซ‹.
  • เช† เชชเซ‡เช•เซ‡เชŸเชจเซ‡ DNS เชธเชฐเซเชตเชฐ เชชเชฐ เชฎเซ‹เช•เชฒเซ‹.
  • DNS เชธเชฐเซเชตเชฐ เชคเชฐเชซเชฅเซ€ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชฎเซ‡เชณเชตเซ‹
  • เชชเซเชฐเชพเชชเซเชค เชฐเซ‡เช•เซ‹เชฐเซเชกเซเชธเชฎเชพเช‚ เชจเซเชฏเซ‚เชจเชคเชฎ TTL เชฎเซ‚เชฒเซเชฏ เชถเซ‹เชงเซ‹.
  • HTTP เชฆเซเชตเชพเชฐเชพ เช•เซเชฒเชพเชฏเช‚เชŸเชจเซ‡ เชชเซเชฐเชคเชฟเชธเชพเชฆ เชชเชฐเชค เช•เชฐเซ‹.

3. เชคเชฎเชพเชฐเซเช‚ เชชเซ‹เชคเชพเชจเซเช‚ DNS-เช“เชตเชฐ-HTTPS เชธเชฐเซเชตเชฐ

เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ DNS-เช“เชตเชฐ-HTTPS เชธเชฐเซเชตเชฐเชจเซ‡ เชšเชฒเชพเชตเชตเชพเชจเซ€ เชธเซŒเชฅเซ€ เชธเชฐเชณ, เชเชกเชชเซ€ เช…เชจเซ‡ เชธเซŒเชฅเซ€ เช…เชธเชฐเช•เชพเชฐเช• เชฐเซ€เชค เช เช›เซ‡ เช•เซ‡ HTTP/2 เชตเซ‡เชฌ เชธเชฐเซเชตเชฐเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเซ‹ H2O, เชœเซ‡เชจเชพ เชตเชฟเชถเซ‡ เชฒเซ‡เช–เช•เซ‡ เชชเชนเซ‡เชฒเชพเชฅเซ€ เชœ เชธเช‚เช•เซเชทเชฟเชชเซเชคเชฎเชพเช‚ เชฒเช–เซเชฏเซเช‚ เช›เซ‡ (เชœเซเช“ โ€œเช‰เชšเซเชš เชชเซเชฐเชฆเชฐเซเชถเชจ H2O เชตเซ‡เชฌ เชธเชฐเซเชตเชฐ.).

เช† เชชเชธเช‚เชฆเช—เซ€ เช เชนเช•เซ€เช•เชค เชฆเซเชตเชพเชฐเชพ เชธเชฎเชฐเซเชฅเชฟเชค เช›เซ‡ เช•เซ‡ เชคเชฎเชพเชฐเชพ เชชเซ‹เชคเชพเชจเชพ DoH เชธเชฐเซเชตเชฐเชจเชพ เชคเชฎเชพเชฎ เช•เซ‹เชกเชจเซ‡ H2O เชฎเชพเช‚ เชœ เชธเช‚เช•เชฒเชฟเชค เชฆเซเชญเชพเชทเชฟเชฏเชพเชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเซ€เชจเซ‡ เชธเช‚เชชเซ‚เชฐเซเชฃเชชเชฃเซ‡ เช…เชฎเชฒเชฎเชพเช‚ เชฎเซ‚เช•เซ€ เชถเช•เชพเชฏ เช›เซ‡. เชฎเชฐเซเชฌเซ€. เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เช“ เช‰เชชเชฐเชพเช‚เชค, DNS เชธเชฐเซเชตเชฐ เชธเชพเชฅเซ‡ เชกเซ‡เชŸเชพเชจเซ€ เช†เชชเชฒเซ‡ เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ (mrbgem) เชธเซ‹เช•เซ‡เชŸ เชฒเชพเช‡เชฌเซเชฐเซ‡เชฐเซ€เชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡, เชœเซ‡ เชธเชฆเชญเชพเช—เซเชฏเซ‡, H2O 2.3.0-beta2 เชจเชพ เชตเชฐเซเชคเชฎเชพเชจ เชตเชฟเช•เชพเชธ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เชชเชนเซ‡เชฒเซ‡เชฅเซ€ เชœ เชธเชฎเชพเชตเชฟเชทเซเชŸ เช›เซ‡. เชนเชพเชœเชฐ เชซเซเชฐเซ€เชฌเซ€เชเชธเชกเซ€ เชชเซ‹เชฐเซเชŸเซเชธเชฎเชพเช‚. เชœเซ‹ เช•เซ‡, เชฐเซ€เชชเซ‹เชเซ€เชŸเชฐเซ€เชจเซ‡ เช•เซเชฒเซ‹เชจ เช•เชฐเซ€เชจเซ‡ เชคเซ‡เชจเซ‡ เช…เช—เชพเช‰เชจเชพ เช•เซ‹เชˆเชชเชฃ เชธเช‚เชธเซเช•เชฐเชฃเชฎเชพเช‚ เช‰เชฎเซ‡เชฐเชตเซเช‚ เชฎเซเชถเซเช•เซ‡เชฒ เชจเชฅเซ€ เชธเซ‹เช•เซ‡เชŸ เชชเซเชธเซเชคเช•เชพเชฒเชฏเซ‹ เช•เซ‡เชŸเชฒเซ‹เช— เชฎเชพเชŸเซ‡ /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-เช•เซเชตเซ‡เชฐเซ€ เชœเซ‡เชจเชพ เชฎเชพเชŸเซ‡ เช…เชฎเชพเชฐเซเช‚ DNS-เช“เชตเชฐ-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 เชชเซ‡เช•เซ‡เชŸเซ‹เชจเซ€ เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เชฎเชพเชŸเซ‡ เชœเชตเชพเชฌเชฆเชพเชฐ เช›เซ‡ เช…เชจเชฌเชพเช‰เชจเซเชก เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค เชซเซเชฐเซ€เชฌเซ€เชเชธเชกเซ€ เชตเชฟเชคเชฐเชฃเชฎเชพเช‚เชฅเซ€. เชธเซเชฐเช•เซเชทเชพเชจเชพ เชฆเซƒเชทเซเชŸเชฟเช•เซ‹เชฃเชฅเซ€, เช† เชถเซเชฐเซ‡เชทเซเช  เช‰เช•เซ‡เชฒ เช›เซ‡. เชœเซ‹ เช•เซ‡, เช•เช‚เชˆเชชเชฃ เชคเชฎเชจเซ‡ เชฌเชฆเชฒเชตเชพเชฅเซ€ เช…เชŸเช•เชพเชตเชคเซเช‚ เชจเชฅเซ€ เชฒเซ‹เช•เชฒเชนเซ‹เชธเซเชŸ เชคเชฎเซ‡ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฎเชพเช—เซ‹ เช›เซ‹ เชคเซ‡ เช…เชฒเช— 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 เชธเชฐเซเชตเชฐ เชฆเซเชตเชพเชฐเชพ เชชเซเชฐเชพเชชเซเชค เช…เชจเซ‡ เชธเชซเชณเชคเชพเชชเซ‚เชฐเซเชตเช• เชชเซเชฐเช•เซเชฐเชฟเชฏเชพ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ€ เชนเชคเซ€.

เชนเชตเซ‡ เชซเช•เซเชค เชซเชพเชฏเชฐเชซเซ‹เช•เซเชธ เชฌเซเชฐเชพเช‰เชเชฐเชฎเชพเช‚ เช…เชฎเชพเชฐเชพ เชธเชฐเซเชตเชฐเชจเซ‡ เชธเช•เซเชฐเชฟเชฏ เช•เชฐเชตเชพเชจเซเช‚ เชฌเชพเช•เซ€ เช›เซ‡. เช† เช•เชฐเชตเชพ เชฎเชพเชŸเซ‡, เชคเชฎเชพเชฐเซ‡ เชฐเซ‚เชชเชฐเซ‡เช–เชพเช‚เช•เชจ เชชเซƒเชทเซเช เซ‹ เชชเชฐ เช˜เชฃเซ€ เชธเซ‡เชŸเชฟเช‚เช—เซเชธ เชฌเชฆเชฒเชตเชพเชจเซ€ เชœเชฐเซ‚เชฐ เช›เซ‡ about: config.

เช…เชฎเซ‡ เช…เชฎเชพเชฐเชพ DNS-เช“เชตเชฐ-HTTPS เชธเชฐเซเชตเชฐเชจเซ‡ เชตเชงเชพเชฐเซ€เช เช›เซ€เช

เชชเซเชฐเชฅเชฎ, เช† เช…เชฎเชพเชฐเชพ API เชจเซเช‚ เชธเชฐเชจเชพเชฎเซเช‚ เช›เซ‡ เชœเซ‡เชจเชพ เชชเชฐ เชฌเซเชฐเชพเช‰เชเชฐ DNS เชฎเชพเชนเชฟเชคเซ€เชจเซ€ เชตเชฟเชจเช‚เชคเซ€ เช•เชฐเชถเซ‡ network.trr.uri. เชธเซเชฐเช•เซเชทเชฟเชค IP เชฐเชฟเชเซ‹เชฒเซเชฏเซเชถเชจ เชฎเชพเชŸเซ‡ เช† URL เชฎเชพเช‚เชฅเซ€ เชกเซ‹เชฎเซ‡เชจ IP เชจเซ‹ เช‰เชฒเซเชฒเซ‡เช– เช•เชฐเชตเชพเชจเซ€ เชชเชฃ เชญเชฒเชพเชฎเชฃ เช•เชฐเชตเชพเชฎเชพเช‚ เช†เชตเซ‡ เช›เซ‡. network.trr.bootstrapAddress. เช…เชจเซ‡ เช›เซ‡เชฒเซเชฒเซ‡, เชชเชฐเชฟเชฎเชพเชฃ เชชเซ‹เชคเซ‡ network.trr.mode DoH เชจเซ‹ เช‰เชชเชฏเซ‹เช— เชธเชนเชฟเชค. เชตเซ‡เชฒเซเชฏเซเชจเซ‡ "3" เชชเชฐ เชธเซ‡เชŸ เช•เชฐเชตเชพเชฅเซ€ เชฌเซเชฐเชพเช‰เชเชฐเชจเซ‡ เชจเชพเชฎ เชฐเชฟเชเซ‹เชฒเซเชฏเซเชถเชจ เชฎเชพเชŸเซ‡ เชซเช•เซเชค DNS-เช“เชตเชฐ-HTTPS เชจเซ‹ เช‰เชชเชฏเซ‹เช— เช•เชฐเชตเชพ เชฆเชฌเชพเชฃ เช•เชฐเชถเซ‡, เชœเซเชฏเชพเชฐเซ‡ เชตเชงเซ เชตเชฟเชถเซเชตเชธเชจเซ€เชฏ เช…เชจเซ‡ เชธเซเชฐเช•เซเชทเชฟเชค "2" DoH เชจเซ‡ เชชเซเชฐเชพเชงเชพเชจเซเชฏ เช†เชชเชถเซ‡, เชœเซ‡ เชชเซเชฐเชฎเชพเชฃเชญเซ‚เชค DNS เชฒเซเช•เช…เชชเชจเซ‡ เชซเซ‹เชฒเชฌเซ‡เช• เชตเชฟเช•เชฒเซเชช เชคเชฐเซ€เช•เซ‡ เช›เซ‹เชกเซ€ เชฆเซ‡เชถเซ‡.

5. เชจเชซเซ‹!

เชถเซเช‚ เชฒเซ‡เช– เชฎเชฆเชฆเชฐเซ‚เชช เชนเชคเซ‹? เชคเซ‹ เชชเช›เซ€ เช•เซƒเชชเชพ เช•เชฐเซ€เชจเซ‡ เชถเชฐเชฎเชพเชถเซ‹ เชจเชนเซ€เช‚ เช…เชจเซ‡ เชฆเชพเชจ เชซเซ‹เชฐเซเชฎ (เชจเซ€เชšเซ‡) เชฆเซเชตเชพเชฐเชพ เชชเซˆเชธเชพ เชธเชพเชฅเซ‡ เชŸเซ‡เช•เซ‹ เช†เชชเซ‹.

เชธเซ‹เชฐเซเชธ: www.habr.com

เชเช• เชŸเชฟเชชเซเชชเชฃเซ€ เช‰เชฎเซ‡เชฐเซ‹