Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

DNS over HTTPS(DoH)

最終更新 Markdown で表示Agent セットアップ

Cloudflare Gateway では、デバイスに Cloudflare One Client をインストールしなくても、DNS ロケーション またはユーザー単位で DNS over HTTPS(DoH)リクエストをフィルタできます。

ロケーションベースのポリシーでは、DNS リクエストを ロケーション固有の DoH エンドポイント へ送ります。アイデンティティベースのポリシーでは、リクエストに ユーザー固有の DoH トークン を含めます。

ロケーション単位で DoH リクエストをフィルタする

ロケーションベースのポリシーでは、そのロケーションに割り当てられた固有の DoH エンドポイント へ DNS クエリを送ります。

https://<YOUR_DOH_SUBDOMAIN>.cloudflare-gateway.com/dns-query

前提条件

ロケーションの DoH サブドメイン を取得します。

ブラウザーで DoH を設定する

ブラウザーは任意の DNS over HTTPS(DoH)エンドポイントを使うよう設定できます。ブラウザーで直接 DoH を設定する場合は、DoH エンドポイントとして Gateway の DNS ロケーションを選んでください。選ばないと、そのブラウザーでは DNS フィルタが働きません。

Mozilla Firefox

  1. Firefox で 設定 を開きます。
  2. プライバシーとセキュリティDNS over HTTPS を開きます。
  3. 次を使用してセキュア DNS を有効化:最大限の保護 を選びます。
  4. プロバイダーを選択カスタム を選びます。
  5. 入力欄に https://<YOUR_DOH_SUBDOMAIN>.cloudflare-gateway.com/dns-query を入力します。

これで Firefox は、DoH エンドポイントを使う設定になりました。Firefox の DoH 設定の詳細は、Mozilla のドキュメント を参照してください。

Google Chrome

  1. Chrome で 設定 > プライバシーとセキュリティ > セキュリティ を開きます。
  2. 下にスクロールし、セキュア DNS を使用する を有効にします。
  3. カスタムを使用 を選びます。
  4. カスタム プロバイダーを入力 欄に https://<YOUR_DOH_SUBDOMAIN>.cloudflare-gateway.com/dns-query を入力します。

Chrome で DNS over HTTPS を有効にする 方法の詳細を参照してください。

Microsoft Edge

  1. Microsoft Edge で 設定 を開きます。
  2. プライバシー、検索、サービス を選び、セキュリティ までスクロールします。
  3. セキュア DNS を使用する を有効にします。
  4. サービス プロバイダーを選択する を選びます。
  5. カスタム プロバイダーを入力 欄に https://<YOUR_DOH_SUBDOMAIN>.cloudflare-gateway.com/dns-query を入力します。

Brave

  1. Brave で 設定 > セキュリティとプライバシー > セキュリティ を開きます。
  2. セキュア DNS を使用する を有効にします。
  3. カスタムを使用 を選びます。
  4. カスタム プロバイダーを入力 欄に https://<YOUR_DOH_SUBDOMAIN>.cloudflare-gateway.com/dns-query を入力します。

Safari

現在、Safari は DNS over HTTPS に対応していません。

DNS クエリは Gateway へ送られ、フィルタ対象になります。これらのリクエストをフィルタするには、DNS Location セレクターを使う DNS ポリシーを作成します。

OS で DoH を設定する

Windows 11

  1. ロケーションの DoH エンドポイントに紐づく A レコードと AAAA レコードの値を取得します。

    1. 次のコマンドを実行し、A レコードの値を取得します。
    nslookup -type=A <your-subdomain>.cloudflare-gateway.com
    1. AAAA レコードの値を取得します。
    nslookup -type=AAAA <your-subdomain>.cloudflare-gateway.com
    1. 得られた IP アドレスをコピーします。
  2. 既知の DoH サーバー一覧にアドレスを追加します。

    1. 各アドレスに対して次のコマンドを実行します。
    Add-DnsClientDohServerAddress -ServerAddress <IP-address> -DohTemplate https://<your-subdomain>.cloudflare-gateway.com/dns-query -AllowFallbackToUdp $False -AutoUpgrade $False
    1. アドレスが追加されたことを確認します。
    Get-DnsClientDohServerAddress
  3. Windows で Settings > Network & internet > 使用中のインターネット接続を開きます。Ethernet または Wi-Fi です。

  4. DNS server assignmentEdit を選びます。

  5. ドロップダウンで Manual を選びます。

  6. IPv4 を有効にします。

  7. Preferred DNSAlternate DNS に、A レコードコマンドで得た IPv4 アドレスを入力します。DNS over HTTPSOn (automatic template) にします。

  8. IPv6 を有効にします。

  9. Preferred DNSAlternate DNS に、AAAA レコードコマンドで得た IPv6 アドレスを入力します。DNS over HTTPSOn (automatic template) にします。

Windows Server 2022

ロケーションの DoH エンドポイントに紐づく A レコードと AAAA レコードの値を取得します。

  1. 次のコマンドを実行し、A レコードの値を取得します。
nslookup -type=A <your-subdomain>.cloudflare-gateway.com
  1. AAAA レコードの値を取得します。
nslookup -type=AAAA <your-subdomain>.cloudflare-gateway.com
  1. 得られた IP アドレスをコピーします。
  2. 既知の DoH サーバー一覧に アドレスを追加 します。
  3. DoH を使うよう Windows Server クライアントを設定 するか、グループポリシーを設定 します。

詳細は、Windows Server 2022 以降向けの Microsoft の DoH ガイド を参照してください。

汎用 DoH エンドポイントを使う

汎用の Cloudflare DoH エンドポイント dns.cloudflare-gateway.com へ DoH リクエストを送れます。リクエストでロケーションを指定するには、cf-dns-location ヘッダーにロケーションの DoH サブドメインを含めます。例:

GET /dns-query?name=example.com&type=A HTTP/2
Host: dns.cloudflare-gateway.com
cf-dns-location: 9y65g5srsm
Accept: application/dns-message

ユーザー単位で DoH リクエストをフィルタする

ユーザーのアイデンティティに基づいて DoH クエリをフィルタするには、各クエリにユーザー固有の認証トークンを含めます。ユーザーあたり複数デバイスがあり、デバイス単位のポリシーを適用したい場合は、各デバイスを別のメールアドレスに対応付けてください。

現時点では、認証トークンは API でのみ生成できます。セットアップを自動化するこの 対話型 Python スクリプト を実行するか、次の手順に従ってください。

1. アカウントのサービストークンを作成する

各 Cloudflare アカウントで、DNS over HTTPS(DoH)向けに認可できる有効な Access サービストークン は、同時に 1 つだけです。

curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/service_tokens" \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{"name":"ACME Corporation service token"}'

サービストークンの client_idclient_secretid を保存します。

応答例

{
	"result": {
		"client_id": "88bf3b6d86161464f6509f7219099e57.access",
		"client_secret": "cfast_EqN8f9vx3sKOSY4mwCMCbZYb02L4OvfAkacLAqTZ63a435a7",
		"created_at": "2022-06-09T01:59:17Z",
		"enabled": true,
		"expires_at": "2023-06-09T01:59:17Z",
		"id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415",
		"name": "ACME Corporation service token",
		"updated_at": "2022-06-09T01:59:17Z"
	},
	"success": true,
	"errors": [],
	"messages": []
}

2. サービストークンで DoH を有効にする

curl --request PUT \
"https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/organizations/doh/$SERVICE_TOKEN_ID" \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN"

access.api.error.service_token_not_found エラーが出た場合は、$SERVICE_TOKEN_IDclient_id ではなく id の値になっているか確認してください。

応答例

{
	"result": {
		"client_id": "88bf3b6d86161464f6509f7219099e57.access",
		"created_at": "2022-06-09T01:59:17Z",
		"expires_at": "2023-06-09T01:59:17Z",
		"id": "f174e90a-fafe-4643-bbbc-4a0ed4fc8415",
		"name": "ACME Corporation service token",
		"updated_at": "2022-06-09T01:59:17Z",
		"duration": "8760h"
	},
	"success": true,
	"errors": [],
	"messages": []
}

3. ユーザーを作成する

新しいユーザーを作成し、任意でグループに追加します。

curl "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/access/users" \
--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
--header "Content-Type: application/json" \
--data '{
  "name": "John Doe",
  "email": "[email protected]",
  "custom": {"groups":[{"id": "02fk6b3p3majl10", "email": "[email protected]", "name": "Finance"}]}
}'

応答で返ったユーザーの id を保存します。

応答例

{
	"result": {
		"id": "54d425de-7a78-4186-9975-d43c88ee7899",
		"created_at": "2022-03-16T21:18:39.93598Z",
		"updated_at": "2022-05-17T23:50:39.598345Z",
		"uid": "54d425de-7a78-4186-9975-d43c88ee7899",
		"name": "John Doe",
		"email": "[email protected]",
		"custom": {
			"groups": [
				{
					"email": "[email protected]",
					"id": "02fk6b3p3majl10",
					"name": "Finance"
				}
			]
		}
	},
	"success": true,
	"errors": [],
	"messages": []
}

4. ユーザーの DoH トークンを生成する

サービストークンで チームドメイン に認証し、ユーザーの DoH トークンをリクエストします。

curl "https://<TEAM_NAME>.cloudflareaccess.com/cdn-cgi/access/doh-token?account-id=<ACCOUNT_ID>&user-id=<USER_ID>&auth-domain=<TEAM_NAME>.cloudflareaccess.com" \
--header "Cf-Access-Client-Id: <CLIENT_ID>" \
--header "Cf-Access-Client-Secret: <CLIENT_SECRET>"

応答には、そのユーザーに紐づく固有の DoH トークンが含まれます。このトークンは 24 時間で期限切れになります。DoH クエリごとに新しく生成するのではなく、DoH トークンのリフレッシュフローを用意することを推奨します。

応答例

{
	"token": "y2khbGciOiJSUzI1NiIsImtpZCI6ImJlZjVkYjg4ZTEwMjk3ZDEwNzhkMmEyYjE0MjMxZTljYTQwMjQ2NjAwOTQzNmJhOTQwOGJkODY3ZmI4OWFiOGQifQ.eyJ0eXBlIjoiZG9oIiwiYXVkIjoiY2xvdWRmbGFyZS1nYXRld2F5LmNvbSIsImlhdCI6MTY1NDc1MTg3NSwiZXhwIjoxNjU0ODM4Mjc1LCJhY2NvdW50LWlkIjoiMTA4MDM0OGIyZGYzYmQwN2QxZmI1MjM3Y2Q1ZDU5M2EiLCJ1c2VyLWlkIjoiNTRkNDI1ZGUtN2E3OC00MTg2LTk5NzUtZDQzYzg4ZWU3ODk5In0.I5p4WsH2dPhQ8vwy84zF05PsoBHCsUSXAaMpNhEH36oFZ3tXcs9ksLz7OzpZ_x3HxUfO3n57LlpAF1VehaBt2i94XCkvSgtHpYcwd_qZydLp-BGtcyfU1LbdXQC3m6zxKcIWu5VySi8I-J25UYlpyJhYgZ4DQUZIpqbSSt6WcVRKvA7OBa7xjkTux4OcqWAViO_ZS-GLwl-fqhvolmiwk37seBD3YuV1zG06VeWXfrMkZ5MbhooHD1DZDBHOZpTtmN8MbeKeI4tlY1mb_O3-jE-um6F9Hrl4NQm89MKFzsum-_Rywi5m4PTSlDza7fjdJs7RzFgJd3VWgzG-jgyQKw"
}

5. 認証付き DoH クエリを送る

https://<ACCOUNT_ID>.cloudflare-gateway.com/dns-query のリゾルバーへ DoH クエリを送ります。CF-Authorization ヘッダーにユーザーの DoH トークンを含めてください。

curl --silent "https://<ACCOUNT_ID>.cloudflare-gateway.com/dns-query?name=example.com" \
--header "accept: application/dns-json" \
--header "CF-Authorization: <USER_DOH_TOKEN>" | jq

サイトがブロックされ、ポリシーで ブロックページ を有効にしている場合、クエリは 162.159.36.12(Gateway ブロックページの IP アドレス)を返します。ブロックページが無効なら、応答は 0.0.0.0 です。

応答例

{
	"Status": 0,
	"TC": false,
	"RD": true,
	"RA": true,
	"AD": false,
	"CD": false,
	"Question": [
		{
			"name": "example.com",
			"type": 1
		}
	],
	"Answer": [
		{
			"name": "example.com",
			"type": 1,
			"TTL": 60,
			"data": "162.159.36.12"
		}
	]
}

リクエストが正しいユーザーメールに紐づいているかは、Gateway DNS ログ で確認できます。これらのリクエストをフィルタするには、Gateway の アイデンティティベースセレクター のいずれかを使う DNS ポリシーを作成します。

役に立ちましたか?