Cloudflare Gateway の DNS ポリシーを確認する

# Cloudflare Gateway とは

> [Cloudflare Gateway | セキュアなWebゲートウェイ & DNSフィルタリング | Cloudflare](https://www.cloudflare.com/ja-jp/teams/gateway/)

Cloudflare の DNS を利用して名前解決するだけでなく、 DNS / HTTP ポリシーを設定することで DNS フィルタリングやセキュア Web ゲートウェイとして機能するサービスです。

# どのように機能するか

アカウント内に「Location」を設定することができますが、DNS クエリが

- DNS over HTTPS (DoH) / DNS over TLS (DoT) の場合、「Location」ごとに払い出されるユニークなホスト名
- Normal DNS over IPv4 の場合、自分で登録したユニークな送信元 IPv4 アドレス
  - 自宅用回線の通信で用いられるグローバル IP は共有されているので、どなたかが登録していると登録できない場合があります
- Normal DNS over IPv6 の場合、「Location」ごとに払い出されるユニークな宛先 IPv6 アドレス

でどのアカウントのポリシーが適用されるかが判断されます。

> [Locations · Cloudflare for Teams documentation](https://developers.cloudflare.com/cloudflare-one/connections/connect-networks/locations#how-gateway-matches-queries-to-locations)![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/c3f7388b-09d8-b21c-ddd8-58dbfd399b97.png)


# テスト設定

以下のような簡単な設定で DNS クエリがブロックされることを確認します。

![image-20210906230325788](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210906230325788.png)

以下の例では「youtube.com」と付くものはブロックします。（正規表現は [regex101](https://regex101.com/) などのサイトで確認できます。）

![image-20210906230435320](https://cdn.jsdelivr.net/gh/kyouheicf/image@master/uPic/image-20210906230435320.png)



# DNS over IPv4

以下のコマンドで登録 IP と、DNS クエリのソース IP が確認できます。

```shell
export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'

% curl -s -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/locations" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $APIKEY" \
-H "Content-Type: application/json" | jq -r '.result[] | select (.name == "Nuro") | .networks[0].network'
YOUR_IPV4/32

% dig -4 @172.64.36.1 whoami.cloudflare ch txt +short | sed "s/\"//g"
YOUR_IPV4
```

「172.64.36.1」「172.64.36.2」への問い合わせでブロックされることが確認できます。

```shell
% dig -4 @172.64.36.1 www.youtube.com A +short
0.0.0.0
```

# DNS over IPv6

以下のコマンドで自アカウント専用の宛先 IPv6 が確認できます。

```shell
export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'

MY_IPV6=$(curl -s -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/locations" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $APIKEY" \
-H "Content-Type: application/json" | jq -r '.result[] | select (.name == "Nuro") | .ip')
echo $MY_IPV6
```

自アカウント専用の宛先 IPv6 への問い合わせでブロックされることが確認できます。

```shell
% dig -6 @$MY_IPV6 www.youtube.com A +short
0.0.0.0
```

# DNS over HTTPS (DoH)

以下のコマンドで自アカウント専用のユニークホスト名が確認できます。

```shell
export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'

MY_DOH_SUBDOMAIN=$(curl -s -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/locations" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $APIKEY" \
-H "Content-Type: application/json" | jq -r '.result[] | select (.name == "Nuro") | .doh_subdomain')
echo $MY_DOH_SUBDOMAIN
```

自アカウント専用のユニークホスト名への問い合わせでブロックされることが確認できます。

```shell
% curl -s -H 'accept: application/dns-json' \
'https://'$MY_DOH_SUBDOMAIN'.cloudflare-gateway.com/dns-query?name=www.youtube.com&type=A' | jq
{
  "Status": 0,
  "TC": false,
  "RD": true,
  "RA": true,
  "AD": false,
  "CD": false,
  "Question": [
    {
      "name": "www.youtube.com",
      "type": 1
    }
  ],
  "Answer": [
    {
      "name": "www.youtube.com",
      "type": 1,
      "TTL": 60,
      "data": "0.0.0.0"
    }
  ]
}
```

# DNS over TLS (DoT)

以下のコマンドで自アカウント専用のユニークホスト名が確認できます。

```shell
export EMAIL='YOUR_EMAIL'
export APIKEY='YOUR_APIKEY'
export ACCOUNT_ID='YOUR_ACCOUNT_ID'

MY_DOH_SUBDOMAIN=$(curl -s -X GET "https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/locations" \
-H "X-Auth-Email: $EMAIL" \
-H "X-Auth-Key: $APIKEY" \
-H "Content-Type: application/json" | jq -r '.result[] | select (.name == "Nuro") | .doh_subdomain')
# echo $MY_DOH_SUBDOMAIN
```

自アカウント専用のユニークホスト名への問い合わせでブロックされることが確認できます。

```shell
% kdig @$MY_DOH_SUBDOMAIN.cloudflare-gateway.com +tls-ca +tls-host=cloudflare-gateway.com +tls-sni=$MY_DOH_SUBDOMAIN.cloudflare-gateway.com www.youtube.com A +short
0.0.0.0
```

# 参考

- [Cloudflare に対する DNS コマンドメモ - Qiita](https://qiita.com/khayama/items/2f172142141df37d42ef)
- https://api.cloudflare.com/#teams-locations-list-teams-locations

# 参考：Block Page 有効時
こちらの Block Page を有効にすると、`0.0.0.0` ではなく `162.159.36.12` のような Block Page の IP アドレスが応答されます。

> [Block page · Cloudflare for Teams docs](https://developers.cloudflare.com/cloudflare-one/policies/filtering/configuring-block-page#enable-the-block-page-for-dns-policies)
![Pasted_Image_1_20_22__12_19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/101361/d6f8db9a-fdad-b011-19ab-6ab5eb345e5e.png)


```
% dig @172.64.36.1 example.net A +short   
162.159.36.12
```