αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„ DNS-over-HTTPS server αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž‘αž·αžŠαŸ’αž‹αž—αžΆαž–αž•αŸ’αžŸαŸαž„αŸ—αž“αŸƒαž”αŸ’αžšαžαž·αž”αžαŸ’αžαž·αž€αžΆαžš DNS αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αž“αž€αž“αž·αž–αž“αŸ’αž’αž”αŸ‰αŸ‡αž˜αŸ’αžαž„αž αžΎαž™αž˜αŸ’αžαž„αž‘αŸ€αžαž“αŸ…αž€αŸ’αž“αž»αž„αž…αŸ†αž“αž½αž“αž“αŸƒ αž’αžαŸ’αžαž”αž‘ αž”αŸ„αŸ‡αž–αž»αž˜αŸ’αž–αž‡αžΆαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž”αŸ’αž›αž€αŸ‹αŸ” αž‘αž“αŸ’αž‘αžΉαž˜αž“αžΉαž„αž“αŸαŸ‡αžŠαŸ‚αžš αž€αžΆαžšαžŸαž„αŸ’αž€αžαŸ‹αž’αŸ’αž„αž“αŸ‹αž…αž˜αŸ’αž”αž„αž‚αžΊαžαŸ‚αž„αžαŸ‚αž˜αžΆαž“αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž“αŸƒαžŸαŸαžœαžΆαž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαžŠαŸαžŸαŸ†αžαžΆαž“αŸ‹αž“αŸαŸ‡αŸ”

αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„ DNS-over-HTTPS server αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αžšαž αžΌαžαž˜αž€αžŠαž›αŸ‹αž–αŸαž›αžαŸ’αž˜αžΈαŸ—αž“αŸαŸ‡ αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž—αžΆαž–αž„αžΆαž™αžšαž„αž‚αŸ’αžšαŸ„αŸ‡αž‡αžΆαž€αŸ‹αžŸαŸ’αžαŸ‚αž„αž“αŸƒαž…αžšαžΆαž…αžšαžŽαŸ DNS αžŠαŸ‚αž›αž—αžΆαž‚αž…αŸ’αžšαžΎαž“αž“αŸ…αžαŸ‚αžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“αž™αŸ‰αžΆαž„αž…αŸ’αž”αžΆαžŸαŸ‹αž›αžΆαžŸαŸ‹αž‘αŸ…αž“αžΉαž„αžŸαž€αž˜αŸ’αž˜αž—αžΆαž–αž–αŸ’αž™αžΆαž”αžΆαž‘αž›αžΎαž•αŸ’αž“αŸ‚αž€αž“αŸƒαž’αŸ’αž“αž€αž•αŸ’αžαž›αŸ‹αžŸαŸαžœαžΆαžŠαŸ‚αž›αžŸαŸ’αžœαŸ‚αž„αžšαž€αž€αžΆαžšαž”αž„αŸ’αž€αžΎαž“αž”αŸ’αžšαžΆαž€αŸ‹αž…αŸ†αžŽαžΌαž›αžšαž”αžŸαŸ‹αž–αž½αž€αž‚αŸαžŠαŸ„αž™αž€αžΆαžšαž”αž„αŸ’αž€αž”αŸ‹αž€αžΆαžšαž•αŸ’αžŸαžΆαž™αž–αžΆαžŽαž·αž‡αŸ’αž‡αž€αž˜αŸ’αž˜αž“αŸ…αž€αŸ’αž“αž»αž„αžαŸ’αž›αžΉαž˜αžŸαžΆαžš αž—αŸ’αž“αžΆαž€αŸ‹αž„αžΆαžšαžŸαž“αŸ’αžαž·αžŸαž»αžαžšαžŠαŸ’αž‹αžΆαž—αž·αž”αžΆαž› αž“αž·αž„αž€αžΆαžšαž…αžΆαž”αŸ‹αž–αž·αžšαž»αž‘αŸ’αž’αŸ” αž€αŸαžŠαžΌαž…αž‡αžΆαž§αž€αŸ’αžšαž·αžŠαŸ’αž‹αž‡αž“αžŸαžΆαž˜αž‰αŸ’αž‰ αžŠαŸ†αžŽαžΎαžšαž€αžΆαžš αž€αžΆαžšαž–αž„αŸ’αžšαžΉαž„αž€αžΆαžšαž€αžΆαžšαž–αžΆαžšαžšαž”αžŸαŸ‹αžœαžΆαŸ”αž‘αŸ„αŸ‡αž”αžΈαž‡αžΆαž˜αžΆαž“αžœαžαŸ’αžαž˜αžΆαž“αž”αž…αŸ’αž…αŸαž€αžœαž·αž‘αŸ’αž™αžΆαž•αŸ’αžŸαŸαž„αŸ—αžŠαžΌαž…αž‡αžΆ 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 αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αŸ”

αž”αž‰αŸ’αž αžΆαž‘αžΈ 2 αžŠαŸ‚αž›αž˜αžΆαž“αžŸαž€αŸ’αžŠαžΆαž“αž»αž–αž›αžαŸ’αž›αžΆαŸ†αž„αž‡αžΆαž„αž”αž‰αŸ’αž αžΆαž‘αžΈαž˜αž½αž™αž‚αžΊαž€αžΆαžšαž”αŸ„αŸ‡αž”αž„αŸ‹αž…αŸ„αž›αž–αž·αžαž”αŸ’αžšαžΆαž€αžŠαž“αŸƒαžœαž·αž˜αž‡αŸ’αžˆαž€αžΆαžšαž“αŸƒ 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 αž’αŸ’αž“αž€αž’αžΆαž…αž˜αžΎαž›αžƒαžΎαž‰αžαžΆαžαžΆαž˜αž–αž·αžαžœαžΆαž‚αžΊαž‡αžΆ web API αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž…αžΌαž›αž€αž‰αŸ’αž…αž”αŸ‹ DNS αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž“αŸ…αž€αŸ’αž“αž»αž„αž–αž·αž’αžΈαž€αžΆαžš HTTP/2 αŸ” αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αž“αž»αžœαžαŸ’αžαžαžΆαž˜αžšαž™αŸˆαž”αž‹αž˜αž€αžαžΆ HTTP αž–αž·αžŸαŸαžŸ αž€αŸαžŠαžΌαž…αž‡αžΆαž€αžΆαžšαž”αŸ†αž”αŸ’αž›αŸ‚αž„αž‘αŸ’αžšαž„αŸ‹αž‘αŸ’αžšαžΆαž™αž‚αŸ„αž›αž–αžΈαžšαž“αŸƒαž‘αž·αž“αŸ’αž“αž“αŸαž™ DNS αžŠαŸ‚αž›αž”αžΆαž“αž”αž‰αŸ’αž‡αžΌαž“ (αžŸαžΌαž˜αž˜αžΎαž›αŸ” RFC1035 αž“αž·αž„αž―αž€αžŸαžΆαžšαž‡αžΆαž”αž“αŸ’αžαž”αž“αŸ’αž‘αžΆαž”αŸ‹) αž‘αŸ…αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αžŠαŸ‚αž›αž’αž“αž»αž‰αŸ’αž‰αžΆαžαž±αŸ’αž™αž’αŸ’αž“αž€αž”αž‰αŸ’αž‡αžΌαž“ αž“αž·αž„αž‘αž‘αž½αž›αž–αž½αž€αžœαžΆ αž€αŸαžŠαžΌαž…αž‡αžΆαž’αŸ’αžœαžΎαž€αžΆαžšαž‡αžΆαž˜αž½αž™αž‘αž·αž“αŸ’αž“αž“αŸαž™αž˜αŸαžαžΆαž…αžΆαŸ†αž”αžΆαž…αŸ‹αŸ”

αž™αŸ„αž„αžαžΆαž˜αžŸαŸ’αžŠαž„αŸ‹αžŠαžΆαžš αž˜αžΆαž“αžαŸ‚ HTTP/2 αž“αž·αž„αž€αžΆαžšαžαž—αŸ’αž‡αžΆαž”αŸ‹ TLS αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž”αŸ‰αž»αžŽαŸ’αžŽαŸ„αŸ‡αžŠαŸ‚αž›αžαŸ’αžšαžΌαžœαž”αžΆαž“αž‚αžΆαŸ†αž‘αŸ’αžšαŸ”

αž€αžΆαžšαž•αŸ’αž‰αžΎαžŸαŸ†αžŽαžΎ DNS αž’αžΆαž…αžαŸ’αžšαžΌαžœαž”αžΆαž“αž’αŸ’αžœαžΎαžŠαŸ„αž™αž”αŸ’αžšαžΎαžœαž·αž’αžΈαžŸαžΆαžŸαŸ’αžαŸ’αžš GET αž“αž·αž„ POST αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž‘αžΈαž˜αž½αž™ αžŸαŸ†αžŽαžΎαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ†αž”αŸ’αž›αŸ‚αž„αž‘αŸ…αž‡αžΆαžαŸ’αžŸαŸ‚αž’αž€αŸ’αžŸαžšαžŠαŸ‚αž›αž”αžΆαž“αž’αŸŠαž·αž“αž€αžΌαžŠ base64URL αž αžΎαž™αž“αŸ…αž€αŸ’αž“αž»αž„αž‘αžΈαž–αžΈαžš αžαžΆαž˜αžšαž™αŸˆαžαž½αž“αŸƒαžŸαŸ†αžŽαžΎ POST αž€αŸ’αž“αž»αž„αž‘αž˜αŸ’αžšαž„αŸ‹αž‚αŸ„αž›αž–αžΈαžšαŸ” αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ αž”αŸ’αžšαž—αŸαž‘αž‘αž·αž“αŸ’αž“αž“αŸαž™ MIME αž–αž·αžŸαŸαžŸαžαŸ’αžšαžΌαžœαž”αžΆαž“αž”αŸ’αžšαžΎαž€αŸ’αž“αž»αž„αž’αŸ†αž‘αž»αž„αž–αŸαž›αžŸαŸ†αžŽαžΎ DNS αž“αž·αž„αž€αžΆαžšαž†αŸ’αž›αžΎαž™αžαž” αž€αž˜αŸ’αž˜αžœαž·αž’αžΈ/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 αžαŸ’αž›αž½αž“αžœαžΆαž•αŸ’αž‘αžΆαž›αŸ‹αŸ” 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-αžŸαŸ†αžŽαž½αžš αžŠαŸ‚αž›αž˜αŸ‰αžΆαžŸαŸŠαžΈαž“αž˜αŸ DNS-over-HTTPS αžšαž”αžŸαŸ‹αž™αžΎαž„αžŠαŸ‚αž›αžŸαžšαžŸαŸαžšαž‡αžΆ mruby αž“αž·αž„αž αŸ…αžαžΆαž˜αžšαž™αŸˆαž‡αž˜αŸ’αžšαžΎαžŸ handler αž‚αžΊαž–αž·αžαž‡αžΆαž‘αž‘αž½αž›αžαž»αžŸαžαŸ’αžšαžΌαžœ 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 αž€αŸ’αž“αž»αž„αž€αžšαžŽαžΈαž“αŸαŸ‡ unbound αž–αžΈαž€αžΆαžšαž…αŸ‚αž€αž…αžΆαž™ 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 αŸ” αžŠαžΎαž˜αŸ’αž”αžΈαž’αŸ’αžœαžΎαžŠαžΌαž…αž“αŸαŸ‡αž’αŸ’αž“αž€αžαŸ’αžšαžΌαžœαž•αŸ’αž›αžΆαžŸαŸ‹αž”αŸ’αžαžΌαžšαž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αž‡αžΆαž…αŸ’αžšαžΎαž“αž“αŸ…αž›αžΎαž‘αŸ†αž–αŸαžšαž€αŸ†αžŽαžαŸ‹αžšαž…αž“αžΆαžŸαž˜αŸ’αž–αŸαž“αŸ’αž’ αž’αŸ†αž–αžΈ: config.

αž™αžΎαž„αžŠαŸ†αž‘αžΎαž„ DNS-over-HTTPS server αžšαž”αžŸαŸ‹αž™αžΎαž„αŸ”

αž‘αžΈαž˜αž½αž™ αž“αŸαŸ‡αž‚αžΊαž‡αžΆαž’αžΆαžŸαž™αžŠαŸ’αž‹αžΆαž“ API αžšαž”αžŸαŸ‹αž™αžΎαž„ αžŠαŸ‚αž›αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αž“αžΉαž„αžŸαŸ’αž“αžΎαžŸαž»αŸ†αž–αŸαžαŸŒαž˜αžΆαž“ DNS αž…αžΌαž› network.trr.uri. αžœαžΆαžαŸ’αžšαžΌαžœαž”αžΆαž“αž•αŸ’αžŠαž›αŸ‹αž’αž“αž»αžŸαžΆαžŸαž“αŸαž•αž„αžŠαŸ‚αžšαžŠαžΎαž˜αŸ’αž”αžΈαž”αž‰αŸ’αž‡αžΆαž€αŸ‹ IP αžŠαŸ‚αž“αž–αžΈ URL αž“αŸαŸ‡αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αž€αžΆαžšαžŠαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™ IP αž”αŸ’αžšαž€αž”αžŠαŸ„αž™αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αžŠαŸ„αž™αž”αŸ’αžšαžΎαž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžαŸ’αž›αž½αž“αžœαžΆαžŠαŸ„αž™αž˜αž·αž“αž…αžΆαŸ†αž”αžΆαž…αŸ‹αž…αžΌαž›αž”αŸ’αžšαžΎ DNS αž…αžΌαž› network.trr.bootstrap αž’αžΆαžŸαŸαž™αžŠαŸ’αž‹αžΆαž“. αž αžΎαž™αž‘αžΈαž”αŸ†αž•αž»αžαž”αŸ‰αžΆαžšαŸ‰αžΆαž˜αŸ‰αŸ‚αžαŸ’αžšαžαŸ’αž›αž½αž“αž―αž„ network.trr.mode αžšαž½αž˜αž‘αžΆαŸ†αž„αž€αžΆαžšαž”αŸ’αžšαžΎαž”αŸ’αžšαžΆαžŸαŸ‹ DoH αŸ” αž€αžΆαžšαž€αŸ†αžŽαžαŸ‹αžαž˜αŸ’αž›αŸƒαž‘αŸ… "3" αž“αžΉαž„αž”αž„αŸ’αžαŸ†αž±αŸ’αž™αž€αž˜αŸ’αž˜αžœαž·αž’αžΈαžšαž»αž€αžšαž€αžαžΆαž˜αž’αŸŠαžΈαž“αž’αžΊαžŽαž·αžαž”αŸ’αžšαžΎ DNS-over-HTTPS αž‘αžΆαŸ†αž„αžŸαŸ’αžšαž»αž„αžŸαž˜αŸ’αžšαžΆαž”αŸ‹αžŠαŸ†αžŽαŸ„αŸ‡αžŸαŸ’αžšαžΆαž™αžˆαŸ’αž˜αŸ„αŸ‡ αžαžŽαŸˆαž–αŸαž›αžŠαŸ‚αž› "2" αžŠαŸ‚αž›αž’αžΆαž…αž‘αž»αž€αž…αž·αžαŸ’αžαž”αžΆαž“ αž“αž·αž„αžŸαž»αžœαžαŸ’αžαž·αž—αžΆαž–αž‡αžΆαž„αž“αžΉαž„αž•αŸ’αžαž›αŸ‹αž’αžΆαž‘αž·αž—αžΆαž–αžŠαž›αŸ‹ DoH αžŠαŸ„αž™αž‘αž»αž€αž€αžΆαžšαžšαž€αž˜αžΎαž› DNS αžŸαŸ’αžαž„αŸ‹αžŠαžΆαžšαž‡αžΆαž‡αž˜αŸ’αžšαžΎαžŸαž‡αŸ†αž“αž½αžŸαžœαž·αž‰αŸ”

5. αž…αŸ†αžŽαŸαž‰!

αžαžΎαž’αžαŸ’αžαž”αž‘αž˜αžΆαž“αž”αŸ’αžšαž™αŸ„αž‡αž“αŸαž‘αŸ? αž”αž“αŸ’αž‘αžΆαž”αŸ‹αž˜αž€αžŸαžΌαž˜αž€αž»αŸ†αžαŸ’αž˜αžΆαžŸαŸ‹αž’αŸ€αž“ αž“αž·αž„αž‚αžΆαŸ†αž‘αŸ’αžšαžŠαŸ„αž™αž”αŸ’αžšαžΆαž€αŸ‹αžαžΆαž˜αžšαž™αŸˆαž‘αž˜αŸ’αžšαž„αŸ‹αž’αŸ†αžŽαŸ„αž™ (αžαžΆαž„αž€αŸ’αžšαŸ„αž˜)αŸ”

αž”αŸ’αžšαž—αž–: www.habr.com

αž”αž“αŸ’αžαŸ‚αž˜αž˜αžαž·αž™αŸ„αž”αž›αŸ‹