3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Cloudflare で Internal DNS を使う

Last updated at Posted at 2025-02-05

目的

機能の有効化については、Cloudflare アカウントチームにご相談ください。

以下のように Cloudflare で Internal DNS を設定して、問題なく名前解決できることを確認します。

参考 : .internal TLD

以下のような動きを踏まえると、今後、内部 DNS の TLD には .internal を使用して統一できると良さそうです。

▽プライベート利用のためのTLD(draft-davies-internal-tld)
プライベートIPアドレス[1]に相当する、組織内で使用するためのトップレベルドメイン(TLD)を定義するための提案です。提案者はIANAのKim Davies氏とICANNのAndrew McConachie氏で、会場ではKim Davies氏が発表しました。

現在、通常のインターネットの利用以外に使われるドメイン名は特殊用途ドメイン名(Special-Use Domain Names)として予約されています。特殊用途ドメイン名の例として、マルチキャストDNSで使われる.local、DNS以外の手段で名前解決されることを示す.alt、家庭用ネットワークで使われる.home.arpaなどが挙げられます。

本提案には2024年1月にIANAが公開した評価結果 を受け、2024年7月にICANN理事会がこのためのTLDとして「.internal」を予約したことが記述されています。

WGでは「フルリゾルバーに.internalのネガティブトラストアンカー[2]を追加する必要がある」「.internalを特殊用途ドメイン名に追加すべき」「IETFでBest Current Practice(BCP)[3]のRFCとすることで重みを持たせるとよい」などのコメントがある一方、「そうしたTLDの予約はIETFではなくICANNで決定すべきだ」という声もあり、継続して作業を進めることとなりました。

Internal DNS Zone の作成

2025 年 2 月 5 日時点では、API 操作のみ対応しています。

"type": "internal" として以下のコマンドで作成します。

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

curl https://api.cloudflare.com/client/v4/zones \
  -X POST \
  -H 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" \
  -d '{
    "account": {
      "id": "'$ACCOUNT_ID'"
    },
    "name": "kyouhei.internal",
    "type": "internal"
  }'

DNS レコードの作成

API もしくは GUI から以下のような DNS レコードを作成します。

export INTERNAL_ZONE_ID='YOUR_INTERNAL_ZONE_ID'

curl https://api.cloudflare.com/client/v4/zones/$INTERNAL_ZONE_ID/dns_records \
  -X POST \
  -H 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" \
  -d '{
      "comment": "Internal DNS",
      "content": "10.146.0.12",
      "name": "www.kyouhei.internal",
      "proxied": false,
      "tags": [
        "type:internal-dns"
      ],
      "type": "A"
    }'

image.png

DNS View の作成

2025 年 2 月 5 日時点では、API 操作のみ対応しています。

Resolver Policy との紐付けに必要な DNS View を以下のコマンドで作成します。

export INTERNAL_ZONE_ID='YOUR_INTERNAL_ZONE_ID'

curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/dns_settings/views \
  -X POST \
  -H 'Content-Type: application/json' \
  -H "X-Auth-Email: $EMAIL" \
  -H "X-Auth-Key: $APIKEY" \
  -d '{
    "name": "kyouhei-internal-dns-view",
    "zones": [
      "'$INTERNAL_ZONE_ID'"
    ]
  }’

Resolver Policy の作成

API もしくは GUI から以下のような Resolver Policy を作成します。

export DNS_VIEW_ID='YOUR_DNS_VIEW_ID'

curl https://api.cloudflare.com/client/v4/accounts/$ACCOUNT_ID/gateway/rules \     
    -H 'Content-Type: application/json' \
    -H "X-Auth-Email: $EMAIL" \
    -H "X-Auth-Key: $APIKEY" \
    -d '{
      "action": "resolve",
      "name": "kyouhei.internal",
      "description": "Internal DNS",
      "enabled": true,
      "rule_settings": {"resolve_dns_internally": {
        "fallback": "none",
        "view_id": "'$DNS_VIEW_ID'"
      }},
      "traffic": "any(dns.domains[*] in {\"kyouhei.internal\"})"
    }'

image.png

動作確認

DNS over IPv4

% dig -4 @172.64.36.1 www.kyouhei.internal A +short
10.146.0.12

DoH

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

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

自アカウント専用のユニークホスト名への問い合わせで内部 DNS への問い合わせが名前解決されることが確認できます。

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

Proxy Endpoint

内部 DNS に AAAA レコードがなく、 A レコードのみの場合は以下の Force IPv4 DNS ポリシーを設定します。

image.png

Proxy Endpoint のサブドメインと、Cloudflare Zero Trust で有効なルート CA 証明書を指定して確認できます。

curl -4 -p http://www.kyouhei.internal --proxy https://$YOUR_SUBDOMAIN.proxy.cloudflare-gateway.com --cacert certificate.pem                                    
result.txt
Accept: */* <br />
User-Agent: curl/8.7.1 <br />
Host: www.kyouhei.internal <br />

Clientless Web Isolation

内部 DNS に AAAA レコードがなく、 A レコードのみの場合は以下の Force IPv4 DNS ポリシーを設定します。

image.png

チーム名を指定したプレフィックスを付けることで、 Clientless Web Isolation での動作を確認できます。

open https://$YOUR_TEAM_NAME.cloudflareaccess.com/browser/http://www.kyouhei.internal/

Gateway DNS ログ

gateway-dns-log.json
{
  "AccountID": "xxx",
  "ApplicationID": 0,
  "ApplicationName": "",
  "AuthoritativeNameServerIPs": [],
  "CNAMECategoryIDs": [],
  "CNAMECategoryNames": [],
  "CNAMEs": [],
  "CNAMEsReversed": [],
  "ColoCode": "NRT",
  "ColoID": 22,
  "CustomResolveDurationMs": 0,
  "CustomResolverAddress": "",
  "CustomResolverPolicyID": "92227d07-15b9-4e60-8019-4f63e9ece970",
  "CustomResolverPolicyName": "kyouhei.internal",
  "CustomResolverResponse": "unknown",
  "Datetime": "2025-02-04T16:26:04Z",
  "DeviceID": "",
  "DeviceName": "",
  "DoHSubdomain": "xxx",
  "DoTSubdomain": "",
  "DstIP": "162.159.36.5",
  "DstPort": 443,
  "EDEErrors": [],
  "Email": "",
  "InitialCategoryIDs": [],
  "InitialCategoryNames": [],
  "IsResponseCached": false,
  "Location": "xxx",
  "LocationID": "76c7ca27-5d1c-4c1b-a3b3-e841a538921f",
  "MatchedCategoryIDs": [],
  "MatchedCategoryNames": [],
  "MatchedIndicatorFeedIDs": [],
  "MatchedIndicatorFeedNames": [],
  "Policy": "",
  "PolicyID": "",
  "PolicyName": "",
  "Protocol": "https",
  "QueryCategoryIDs": [],
  "QueryCategoryNames": [],
  "QueryID": "0603e875-90b0-418e-b803-85cbb630760f",
  "QueryIndicatorFeedIDs": [],
  "QueryIndicatorFeedNames": [],
  "QueryName": "www.kyouhei.internal",
  "QueryNameReversed": "internal.kyouhei.www",
  "QuerySize": 49,
  "QueryType": 1,
  "QueryTypeName": "A",
  "RCode": 0,
  "RData": [
    {
      "type": "1",
      "data": "A3d3dwdreW91aGVpCGludGVybmFsAAABAAEAAAEsAAQKkgAM"
    }
  ],
  "ResolvedIPCategoryIDs": [],
  "ResolvedIPCategoryNames": [],
  "ResolvedIPContinentCodes": [
    ""
  ],
  "ResolvedIPCountryCodes": [
    ""
  ],
  "ResolvedIPs": [
    "10.146.0.12"
  ],
  "ResolverDecision": "allowedOnNoPolicyMatch",
  "ResourceRecords": [
    {
      "type": "1",
      "data": "A3d3dwdreW91aGVpCGludGVybmFsAAABAAEAAAEsAAQKkgAM"
    }
  ],
  "ResourceRecordsJSON": "[{\"name\":\"www.kyouhei.internal\",\"type\":\"A\",\"class\":\"IN\",\"ttl\":300,\"rdata\":\"10.146.0.12\"}]",
  "SrcIP": "x.x.x.x",
  "SrcIPContinentCode": "AS",
  "SrcIPCountryCode": "JP",
  "SrcPort": 0,
  "TimeZone": "",
  "TimeZoneInferredMethod": "noScheduleConfigured",
  "UserID": ""
}

まとめ

内部 DNS を使うには、これまでも以下の選択肢がありました。

これからは Cloudflare で Internal DNS を使えることで、自前の Private DNS サーバーを維持する必要がなくなります。

Cloudflare の公開ドメインにおける管理方式と同様に操作ができるため、保守運用性に関しても優れています。

もちろん、Cloudflare の Private LB と合わせて使うことも可能です。

image.png

ぜひ Internal DNS サービスの活用を検討してみてください。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?