Alibaba Cloud HTTPDNS は、RFC 8484 に準拠し、TLS で暗号化された HTTPS 接続による DNS 名前解決を提供します。ブラウザなどのユースケースに最適です。
DoT/DoH エンドポイントの取得
Alibaba Cloud DNS - HTTPDNS コンソールに移動します。
[Access Configuration] タブで、 [Method 3: DoT/DoH-based access] を選択します。
DoT/DoH は、短縮アドレスとカスタム暗号化アドレスの 2 つのアクセス方法をサポートしています。
重要セキュリティを強化するため、暗号化アドレスの使用を推奨します。
[Add an encrypted URL] をクリックします。ダイアログボックスで、カスタム文字列を入力して一意のエンドポイントを生成します。
スイッチをオンにして、暗号化エンドポイントを有効にします。
警告DoH を使用した HTTPDNS へのアクセスを停止するには、スイッチをオフにします。
サービス停止機能は慎重に使用してください。サービスを停止すると、お客様のアカウントは無料ユーザーにダウングレードされます。課金が停止し、コンソールレポートなどの機能が利用できなくなります。お客様の HTTPDNS サービスは SLA の対象外となり、スロットリングおよびクエリ拒否の対象となります。
停止したサービスを再開すると、元の構成が復元され、課金が再開されます。
エンドユーザー向け DoH
お客様の DoH エンドポイントが https://5***4-2h*****ynx3tls.alidns.com/dns-query であると仮定します。
このセクションでは、Chrome で DoH を設定する方法を説明します。
Chrome を開き、[設定] に移動します。
検索ボックスに「DNS」と入力し、検索結果で [セキュリティ] の右側にある展開矢印をクリックします。
ページの一番下までスクロールします。[詳細設定] セクションで [セキュア DNS を使用する] をオンにします。次に、[カスタム] ボックスに
https://5***4-2h*****ynx3tls.alidns.com/dns-queryを入力します。
開発者向け DoH サービス
開発者は、RFC 8484 の標準に従って DoH HTTP リクエストを生成し、DoH サービスアドレスに送信する必要があります。
DoH は GET メソッドと POST メソッドの両方を使用できます。POST メソッドを使用する場合、DNS クエリメッセージは HTTP リクエストのメッセージボディに含まれます。GET メソッドを使用する場合、「dns」という名前の単一変数に、DNS リクエストの base64url エンコードされたコンテンツが割り当てられます。
コード例 (Python および Golang)
GET メソッドを使用して DoH クエリを開始するには、まずバイナリ DNS メッセージを base64url エンコードして DNS クエリパラメータを取得します。このパラメータを使用して完全な DoH HTTP URL を構築し、HTTP リクエストを介して送信して DNS 応答メッセージを取得します。
次の Python コードは、開発者が DoH を使用してドメイン
alibaba.comをクエリする例です。import dns.message import requests import base64 import json doh_url = "https://5***4-2h*****ynx3tls.alidns.com/dns-query" domain = "alibaba.com" rr = "A" result = [] message = dns.message.make_query(domain, rr) dns_req = base64.urlsafe_b64encode(message.to_wire()).decode("UTF8").rstrip("=") r = requests.get(doh_url + "?dns=" + dns_req, headers={"Content-type": "application/dns-message"}) for answer in dns.message.from_wire(r.content).answer: dns = answer.to_text().split() result.append({"Query": dns[0], "TTL": dns[1], "RR": dns[3], "Answer": dns[4]}) print(json.dumps(result))出力は次のとおりです:
$ python test_doh.py [{"Answer": "106.11.XXX.XXX", "Query": "alibaba.com.", "RR": "A", "TTL": "133"}]次の Go コードは、開発者が DoH を使用してドメイン
www.taobao.comをクエリする例です。package main import ( "encoding/base64" "fmt" "github.com/miekg/dns" "io/ioutil" "net/http" "os" ) func main() { query := dns.Msg{} query.SetQuestion("www.taobao.com.", dns.TypeA) msg, _ := query.Pack() b64 := base64.RawURLEncoding.EncodeToString(msg) resp, err := http.Get("https://5***4-2h*****ynx3tls.alidns.com/dns-query?dns=" + b64) if err != nil { fmt.Printf("Send query error, err:%v\n", err) os.Exit(1) } defer resp.Body.Close() bodyBytes, _ := ioutil.ReadAll(resp.Body) response := dns.Msg{} response.Unpack(bodyBytes) fmt.Printf("Dns answer is :%v\n", response.String()) }出力は次のとおりです:
Sent Get query https://5***4-2h*****ynx3tls.alidns.com/dns-query?dns=xzEBAAABAAAAAAAAA3d3dwZ0YW9iYW8DY29tAAABAAE Dns answer is :;; opcode: QUERY, status: NOERROR, id: 5***3 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1 ;; QUESTION SECTION: ;www.taobao.com. IN A ;; ANSWER SECTION: www.taobao.com. 15 IN CNAME www.taobao.com.danuoyi.tbcache.com. www.taobao.com.danuoyi.tbcache.com. 15 IN A 221.229.XXX.XXX www.taobao.com.danuoyi.tbcache.com. 15 IN A 221.229.XXX.XXX ;; ADDITIONAL SECTION: ;; OPT PSEUDOSECTION: ; EDNS: version 0; flags: ; udp: 4096