เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ 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-over-HTTPS เจจเฉ‚เฉฐ เจ‰เจธ เจฐเฉ‚เจช เจตเจฟเฉฑเจš เจฒเจพเจ—เฉ‚ เจ•เจฐเจจเจพ เจœเจฟเจธ เจตเจฟเฉฑเจš เจ‡เจน เจตเจฐเจคเจฎเจพเจจ เจตเจฟเฉฑเจš เจชเฉเจฐเจธเจคเจพเจตเจฟเจค เจนเฉˆ, เจธเจฟเจฐเจซ เจธเจญ เจคเฉ‹เจ‚ เจตเฉฑเจกเฉ€เจ†เจ‚ เจธเฉ‡เจตเจพเจตเจพเจ‚ 'เจคเฉ‡ เจ…เฉฐเจคเจฎ เจ‰เจชเจญเฉ‹เจ—เจคเจพเจตเจพเจ‚ เจฆเฉ€ เจจเจฟเจฐเจญเจฐเจคเจพ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเจพ เจนเฉˆเฅค เจ‡เจน เจ•เฉ‹เจˆ เจญเฉ‡เจค เจจเจนเฉ€เจ‚ เจนเฉˆ เจ•เจฟ DNS เจชเฉเจฐเจธเจผเจจเจพเจ‚ เจฆเจพ เจตเจฟเจธเจผเจฒเฉ‡เจธเจผเจฃ เจœเฉ‹ เจœเจพเจฃเจ•เจพเจฐเฉ€ เจชเฉเจฐเจฆเจพเจจ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ‰เจน เจ‡เจธ เจฌเจพเจฐเฉ‡ เจนเฉ‹เจฐ เจตเฉ€ เจกเฉ‡เจŸเจพ เจ‡เจ•เฉฑเจ เจพ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจจเจพเจฒ เจนเฉ€ เจ‡เจธเจฆเฉ€ เจธเจผเฉเฉฑเจงเจคเจพ เจ…เจคเฉ‡ เจธเจพเจฐเจฅเจ•เจคเจพ เจจเฉ‚เฉฐ เจตเจงเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค

เจ‡เจธ เจธเจฌเฉฐเจง เจตเจฟเฉฑเจš, เจฒเฉ‡เจ–เจ• DNS-over-HTTPS เจฆเฉ‡ เจจเจนเฉ€เจ‚, เจธเจ—เฉ‹เจ‚ DNS-over-TLS เจฆเฉ‡ เจ‡เฉฑเจ• เจตเจฟเจ†เจชเจ•, เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค เจ…เจคเฉ‡ เจ‡เฉฐเจŸเจฐเจจเฉˆเจŸ เจธเจพเจงเจจเจพเจ‚ เจฆเฉ‡ เจนเฉ‹เจฐ เจ•เฉ‡เจ‚เจฆเจฐเฉ€เจ•เจฐเจจ เจฒเจˆ เจ…เจจเฉเจ•เฉ‚เจฒ เจจเจพ เจนเฉ‹เจฃ เจฆเฉ‡ เจฐเฉ‚เจช เจตเจฟเฉฑเจš DNSSEC/DANE เจฆเฉ‡ เจจเจพเจฒ เจธเจฎเฉ‚เจนเจฟเจ• เจฒเจพเจ—เฉ‚ เจ•เจฐเจจ เจฆเจพ เจธเจฎเจฐเจฅเจ• เจธเฉ€ เจ…เจคเฉ‡ เจฐเจฟเจนเจพ เจนเฉˆเฅค DNS เจŸเฉเจฐเฉˆเจซเจฟเจ• เจฆเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจจเฉ‚เฉฐ เจฏเจ•เฉ€เจจเฉ€ เจฌเจฃเจพเจ‰เจฃ เจฒเจˆเฅค เจฌเจฆเจ•เจฟเจธเจฎเจคเฉ€ เจจเจพเจฒ, เจธเจชเฉฑเจธเจผเจŸ เจ•เจพเจฐเจจเจพเจ‚ เจ•เจฐเจ•เฉ‡, เจ•เฉ‹เจˆ เจตเฉ€ เจ•เจฒเจพเจ‡เฉฐเจŸ เจธเฉŒเจซเจŸเจตเฉ‡เจ…เจฐ เจตเจฟเฉฑเจš DoH เจตเจฟเจ•เจฒเจชเจพเจ‚ เจฒเจˆ เจชเฉเฉฐเจœ เจธเจฎเจฐเจฅเจจ เจฆเฉ€ เจคเฉ‡เจœเจผเฉ€ เจจเจพเจฒ เจœเจพเจฃ-เจชเจ›เจพเจฃ เจฆเฉ€ เจ‰เจฎเฉ€เจฆ เจจเจนเฉ€เจ‚ เจ•เจฐ เจธเจ•เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจ‡เจน เจ…เจœเฉ‡ เจตเฉ€ เจธเฉเจฐเฉฑเจ–เจฟเจ† เจคเจ•เจจเจพเจฒเฉ‹เจœเฉ€ เจฆเฉ‡ เจ‰เจคเจธเจผเจพเจนเฉ€เจ†เจ‚ เจฆเจพ เจกเฉ‹เจฎเฉ‡เจจ เจนเฉˆเฅค

เจชเจฐ เจ•เจฟเจ‰เจ‚เจ•เจฟ เจธเจพเจกเฉ‡ เจ•เฉ‹เจฒ เจนเฉเจฃ DoH เจนเฉˆ, เจ•เจฟเจ‰เจ‚ เจจเจพ เจ•เจพเจฐเจชเฉ‹เจฐเฉ‡เจธเจผเจจเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจ†เจชเจฃเฉ‡ เจธเจฐเจตเจฐเจพเจ‚ เจฆเฉเจ†เจฐเจพ เจธเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ DNS-เจ“เจตเจฐ-HTTPS เจธเจฐเจตเจฐ เจฆเฉเจ†เจฐเจพ เจธเฉฐเจญเจพเจตเฉ€ เจจเจฟเจ—เจฐเจพเจจเฉ€ เจคเฉ‹เจ‚ เจฌเจšเจฃ เจคเฉ‹เจ‚ เจฌเจพเจ…เจฆ เจ‡เจธเจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเฉ‹?

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

เจœเฉ‡ เจคเฉเจธเฉ€เจ‚ เจธเจŸเฉˆเจ‚เจกเจฐเจก 'เจคเฉ‡ เจจเจœเจผเจฐ เจฎเจพเจฐเฉ‹ เจ†เจฐเจเจซเจธเฉ€ 8484 DNS-over-HTTPS เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจฆเจพ เจตเจฐเจฃเจจ เจ•เจฐเจฆเฉ‡ เจนเฉ‹เจ, เจคเฉเจธเฉ€เจ‚ เจฆเฉ‡เจ– เจธเจ•เจฆเฉ‡ เจนเฉ‹ เจ•เจฟ เจ‡เจน, เจ…เจธเจฒ เจตเจฟเฉฑเจš, เจ‡เฉฑเจ• เจตเฉˆเฉฑเจฌ API เจนเฉˆ เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ HTTP/2 เจชเฉเจฐเฉ‹เจŸเฉ‹เจ•เฉ‹เจฒ เจตเจฟเฉฑเจš เจ‡เฉฑเจ• เจฎเจฟเจ†เจฐเฉ€ DNS เจชเฉˆเจ•เฉ‡เจœ เจจเฉ‚เฉฐ เจธเจผเจพเจฎเจฒ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค เจ‡เจน เจตเจฟเจธเจผเฉ‡เจธเจผ HTTP เจธเจฟเจฐเจฒเฉ‡เจ–เจพเจ‚ เจฆเฉ‡ เจจเจพเจฒ เจจเจพเจฒ เจชเฉเจฐเจธเจพเจฐเจฟเจค DNS เจกเฉ‡เจŸเจพ เจฆเฉ‡ เจฌเจพเจˆเจจเจฐเฉ€ เจซเจพเจฐเจฎเฉˆเจŸ เจฆเฉ‡ เจฐเฉ‚เจชเจพเจ‚เจคเจฐเจฃ เจฆเฉเจ†เจฐเจพ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจ—เจฟเจ† เจนเฉˆ (เจฆเฉ‡เจ–เฉ‹. เจ†เจฐเจเจซเจธเฉ€ 1035 เจ…เจคเฉ‡ เจฌเจพเจ…เจฆ เจฆเฉ‡ เจฆเจธเจคเจพเจตเฉ‡เจœเจผ) เจจเฉ‚เฉฐ เจ‡เฉฑเจ• เจซเจพเจฐเจฎ เจตเจฟเฉฑเจš เจœเฉ‹ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจ‰เจนเจจเจพเจ‚ เจจเฉ‚เฉฐ เจธเฉฐเจšเจพเจฐเจฟเจค เจ•เจฐเจจ เจ…เจคเฉ‡ เจชเฉเจฐเจพเจชเจค เจ•เจฐเจจ เจฆเฉ‡ เจจเจพเจฒ-เจจเจพเจฒ เจฒเฉ‹เฉœเฉ€เจ‚เจฆเฉ‡ เจฎเฉˆเจŸเจพเจกเฉ‡เจŸเจพ เจจเจพเจฒ เจ•เฉฐเจฎ เจ•เจฐเจจ เจฆเฉ€ เจ‡เจœเจพเจœเจผเจค เจฆเจฟเฉฐเจฆเจพ เจนเฉˆเฅค

เจฎเจฟเจ†เจฐ เจฆเฉ‡ เจ…เจจเฉเจธเจพเจฐ, เจธเจฟเจฐเจซเจผ HTTP/2 เจ…เจคเฉ‡ เจ‡เฉฑเจ• เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค TLS เจ•เจจเฉˆเจ•เจธเจผเจจ เจธเจฎเจฐเจฅเจฟเจค เจนเจจเฅค

เจ‡เฉฑเจ• DNS เจฌเฉ‡เจจเจคเฉ€ เจญเฉ‡เจœเจฃเจพ เจฎเจฟเจ†เจฐเฉ€ GET เจ…เจคเฉ‡ POST เจตเจฟเจงเฉ€เจ†เจ‚ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค เจชเจนเจฟเจฒเฉ‡ เจ•เฉ‡เจธ เจตเจฟเฉฑเจš, เจฌเฉ‡เจจเจคเฉ€ เจจเฉ‚เฉฐ เจ‡เฉฑเจ• base64URL-เจเจจเจ•เฉ‹เจกเจก เจธเจคเจฐ เจตเจฟเฉฑเจš เจฌเจฆเจฒเจฟเจ† เจœเจพเจ‚เจฆเจพ เจนเฉˆ, เจ…เจคเฉ‡ เจฆเฉ‚เจœเฉ‡ เจตเจฟเฉฑเจš, 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 เจนเฉˆ เจคเจพเจ‚ เจฌเฉ‡เจธ64URL เจเจจเจ•เฉ‹เจกเจฟเฉฐเจ— เจคเฉ‹เจ‚ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ เจกเฉ€เจ•เฉ‹เจก เจ•เจฐเฉ‹เฅค
  • เจ‡เจธ เจชเฉˆเจ•เฉ‡เจŸ เจจเฉ‚เฉฐ DNS เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจญเฉ‡เจœเฉ‹เฅค
  • DNS เจธเจฐเจตเจฐ เจคเฉ‹เจ‚ เจœเจตเจพเจฌ เจชเฉเจฐเจพเจชเจค เจ•เจฐเฉ‹
  • เจชเฉเจฐเจพเจชเจค เจ•เฉ€เจคเฉ‡ เจฐเจฟเจ•เจพเจฐเจกเจพเจ‚ เจตเจฟเฉฑเจš เจ˜เฉฑเจŸเฉ‹-เจ˜เฉฑเจŸ TTL เจฎเฉเฉฑเจฒ เจฒเฉฑเจญเฉ‹เฅค
  • HTTP เจฐเจพเจนเฉ€เจ‚ เจ•เจฒเจพเจ‡เฉฐเจŸ เจจเฉ‚เฉฐ เจœเจตเจพเจฌ เจตเจพเจชเจธ เจ•เจฐเฉ‹เฅค

3. เจคเฉเจนเจพเจกเจพ เจ†เจชเจฃเจพ DNS-เจ“เจตเจฐ-HTTPS เจธเจฐเจตเจฐ

เจ†เจชเจฃเฉ‡ เจ–เฉเจฆ เจฆเฉ‡ DNS-เจ“เจตเจฐ-HTTPS เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจšเจฒเจพเจ‰เจฃ เจฆเจพ เจธเจญ เจคเฉ‹เจ‚ เจธเจฐเจฒ, เจธเจญ เจคเฉ‹เจ‚ เจคเฉ‡เจœเจผ เจ…เจคเฉ‡ เจธเจญ เจคเฉ‹เจ‚ เจชเฉเจฐเจญเจพเจตเจธเจผเจพเจฒเฉ€ เจคเจฐเฉ€เจ•เจพ เจนเฉˆ เจ‡เฉฑเจ• HTTP/2 เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจเจพ H2O, เจœเจฟเจธ เจฌเจพเจฐเฉ‡ เจฒเฉ‡เจ–เจ• เจจเฉ‡ เจชเจนเจฟเจฒเจพเจ‚ เจนเฉ€ เจธเฉฐเจ–เฉ‡เจช เจตเจฟเฉฑเจš เจฒเจฟเจ–เจฟเจ† เจนเฉˆ (เจตเฉ‡เจ–เฉ‹ โ€œเจ‰เฉฑเจš เจชเฉเจฐเจฆเจฐเจธเจผเจจ H2O เจตเฉˆเฉฑเจฌ เจธเจฐเจตเจฐ).

เจ‡เจน เจšเฉ‹เจฃ เจ‡เจธ เจคเฉฑเจฅ เจฆเฉเจ†เจฐเจพ เจธเจฎเจฐเจฅเจค เจนเฉˆ เจ•เจฟ เจคเฉเจนเจพเจกเฉ‡ เจ†เจชเจฃเฉ‡ DoH เจธเจฐเจตเจฐ เจฆเฉ‡ เจธเจพเจฐเฉ‡ เจ•เฉ‹เจก เจจเฉ‚เฉฐ H2O เจตเจฟเฉฑเจš เจเจ•เฉ€เจ•เฉเจฐเจฟเจค เจฆเฉเจญเจพเจธเจผเฉ€เจ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ เจชเฉ‚เจฐเฉ€ เจคเจฐเฉเจนเจพเจ‚ เจฒเจพเจ—เฉ‚ เจ•เฉ€เจคเจพ เจœเจพ เจธเจ•เจฆเจพ เจนเฉˆเฅค mruby. เจฎเจฟเจ†เจฐเฉ€ เจฒเจพเจ‡เจฌเฉเจฐเฉ‡เจฐเฉ€เจ†เจ‚ เจคเฉ‹เจ‚ เจ‡เจฒเจพเจตเจพ, 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-เจ“เจตเจฐ-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 เจชเฉˆเจ•เฉ‡เจŸเจพเจ‚ เจฆเฉ€ เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจฒเจˆ เจœเจผเจฟเฉฐเจฎเฉ‡เจตเจพเจฐ เจนเฉˆ เจฌเฉ‡เจ…เฉฐเจค เจฎเจฟเจ†เจฐเฉ€ FreeBSD เจตเฉฐเจก เจคเฉ‹เจ‚เฅค เจธเฉเจฐเฉฑเจ–เจฟเจ† เจฆเฉ‡ เจฆเฉเจฐเจฟเจธเจผเจŸเฉ€เจ•เฉ‹เจฃ เจคเฉ‹เจ‚, เจ‡เจน เจธเจญ เจคเฉ‹เจ‚ เจตเจงเฉ€เจ† เจนเฉฑเจฒ เจนเฉˆ. เจนเจพเจฒเจพเจ‚เจ•เจฟ, เจ•เฉเจ เจตเฉ€ เจคเฉเจนเจพเจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจคเฉ‹เจ‚ เจจเจนเฉ€เจ‚ เจฐเฉ‹เจ•เจฆเจพ เจฒเฉ‹เจ•เจฒเจนเฉ‹เจธเจŸ เจ‡เฉฑเจ• เจตเฉฑเจ–เจฐเฉ‡ 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 เจธเจฐเจตเจฐ เจฆเฉเจ†เจฐเจพ เจธเจซเจฒเจคเจพเจชเฉ‚เจฐเจตเจ• เจชเฉเจฐเจ•เจฟเจฐเจฟเจ† เจ•เฉ€เจคเฉ€ เจ—เจˆ เจธเฉ€เฅค

เจนเฉเจฃ เจธเจฟเจฐเจซเจผ เจซเจพเจ‡เจฐเจซเจพเจ•เจธ เจฌเจฐเจพเจŠเจœเจผเจฐ เจตเจฟเฉฑเจš เจธเจพเจกเฉ‡ เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจเจ•เจŸเฉ€เจตเฉ‡เจŸ เจ•เจฐเจจเจพ เจฌเจพเจ•เฉ€ เจนเฉˆเฅค เจ…เจœเจฟเจนเจพ เจ•เจฐเจจ เจฒเจˆ, เจคเฉเจนเจพเจจเฉ‚เฉฐ เจธเฉฐเจฐเจšเจจเจพ เจชเฉฐเจจเจฟเจ†เจ‚ 'เจคเฉ‡ เจ•เจˆ เจธเฉˆเจŸเจฟเฉฐเจ—เจพเจ‚ เจจเฉ‚เฉฐ เจฌเจฆเจฒเจฃ เจฆเฉ€ เจฒเฉ‹เฉœ เจนเฉˆ เจฌเจพเจฐเฉ‡: เจธเฉฐเจฐเจšเจจเจพ.

เจ…เจธเฉ€เจ‚ เจ†เจชเจฃเฉ‡ DNS-เจ“เจตเจฐ-HTTPS เจธเจฐเจตเจฐ เจจเฉ‚เฉฐ เจตเจงเจพเจ‰เจ‚เจฆเฉ‡ เจนเจพเจ‚

เจชเจนเจฟเจฒเจพเจ‚, เจ‡เจน เจธเจพเจกเฉ‡ API เจฆเจพ เจชเจคเจพ เจนเฉˆ เจœเจฟเจธ 'เจคเฉ‡ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ DNS เจœเจพเจฃเจ•เจพเจฐเฉ€ เจฒเจˆ เจฌเฉ‡เจจเจคเฉ€ เจ•เจฐเฉ‡เจ—เจพ network.trr.uri. เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค IP เจฐเฉˆเจœเจผเฉ‹เจฒเจฟเจŠเจธเจผเจจ เจฒเจˆ เจ‡เจธ URL เจคเฉ‹เจ‚ เจกเฉ‹เจฎเฉ‡เจจ IP เจจเฉ‚เฉฐ เจจเจฟเจฐเจงเจพเจฐเจฟเจค เจ•เจฐเจจ เจฆเฉ€ เจตเฉ€ เจธเจฟเจซเจผเจพเจฐเจธเจผ เจ•เฉ€เจคเฉ€ เจœเจพเจ‚เจฆเฉ€ เจนเฉˆ, เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจ•เฉ‡ DNS เจคเฉฑเจ• เจชเจนเฉเฉฐเจš เจ•เฉ€เจคเฉ‡ เจฌเจฟเจจเจพเจ‚ network.trr.bootstrapAddress. เจ…เจคเฉ‡ เจ…เฉฐเจค เจตเจฟเฉฑเจš, เจชเฉˆเจฐเจพเจฎเฉ€เจŸเจฐ เจ†เจชเจฃเฉ‡ เจ†เจช เจตเจฟเฉฑเจš network.trr.mode DoH เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจธเจฎเฉ‡เจคเฅค เจฎเฉเฉฑเจฒ เจจเฉ‚เฉฐ "3" 'เจคเฉ‡ เจธเฉˆเฉฑเจŸ เจ•เจฐเจจเจพ เจฌเฉเจฐเจพเจŠเจœเจผเจฐ เจจเฉ‚เฉฐ เจจเจพเจฎ เจฐเฉˆเจœเจผเฉ‹เจฒเฉ‚เจธเจผเจจ เจฒเจˆ เจตเจฟเจธเจผเฉ‡เจธเจผ เจคเฉŒเจฐ 'เจคเฉ‡ DNS-over-HTTPS เจฆเฉ€ เจตเจฐเจคเฉ‹เจ‚ เจ•เจฐเจจ เจฒเจˆ เจฎเจœเจฌเฉ‚เจฐ เจ•เจฐเฉ‡เจ—เจพ, เจœเจฆเฉ‹เจ‚ เจ•เจฟ เจตเจงเฉ‡เจฐเฉ‡ เจญเจฐเฉ‹เจธเฉ‡เจฏเฉ‹เจ— เจ…เจคเฉ‡ เจธเฉเจฐเฉฑเจ–เจฟเจ…เจค "2" DoH เจจเฉ‚เฉฐ เจคเจฐเจœเฉ€เจน เจฆเฉ‡เจตเฉ‡เจ—เจพ, เจธเจŸเฉˆเจ‚เจกเจฐเจก DNS เจฒเฉเฉฑเจ•เจ…เจช เจจเฉ‚เฉฐ เจซเจพเจฒเจฌเฉˆเจ• เจตเจฟเจ•เจฒเจช เจตเจœเฉ‹เจ‚ เจ›เฉฑเจก เจ•เฉ‡เฅค

5. เจฒเจพเจญ!

เจ•เฉ€ เจฒเฉ‡เจ– เจฎเจฆเจฆเจ—เจพเจฐ เจธเฉ€? เจซเจฟเจฐ เจ•เจฟเจฐเจชเจพ เจ•เจฐเจ•เฉ‡ เจธเจผเจฐเจฎเจฟเฉฐเจฆเจพ เจจเจพ เจนเฉ‹เจตเฉ‹ เจ…เจคเฉ‡ เจฆเจพเจจ เจซเจพเจฐเจฎ (เจนเฉ‡เจ เจพเจ‚) เจฐเจพเจนเฉ€เจ‚ เจชเฉˆเจธเฉ‡ เจจเจพเจฒ เจธเจนเจพเจ‡เจคเจพ เจ•เจฐเฉ‹เฅค

เจธเจฐเฉ‹เจค: www.habr.com

เจ‡เฉฑเจ• เจŸเจฟเฉฑเจชเจฃเฉ€ เจœเฉ‹เฉœเฉ‹