แž™แžพแž„แžŠแŸ†แžกแžพแž„ 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: max@kostikov.co

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: max@kostikov.co

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 unbound-bugs@nlnetlabs.nl
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

แž‘แžทแž‰แž€แžถแžšแž”แž„แŸ’แž แŸ„แŸ‡แžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แžŸแž˜แŸ’แžšแžถแž”แŸ‹แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แž˜แžถแž“แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS, แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS ๐Ÿ”ฅ แž‘แžทแž‰แžŸแŸแžœแžถแž”แž„แŸ’แž แŸ„แŸ‡แž‚แŸแž แž‘แŸ†แž–แŸแžšแžŠแŸ‚แž›แžขแžถแž…แž‘แžปแž€แž…แžทแžแŸ’แžแž”แžถแž“แž‡แžถแž˜แžฝแž™แž“แžนแž„แž€แžถแžšแž€แžถแžšแž–แžถแžš DDoS แž“แžทแž„แž˜แŸ‰แžถแžŸแŸŠแžธแž“แž˜แŸ VPS VDS | ProHoster