目的
機能の有効化については、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"
}'
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\"})"
}'
動作確認
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
{
"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 ポリシーを設定します。
Proxy Endpoint のサブドメインと、Cloudflare Zero Trust で有効なルート CA 証明書を指定して確認できます。
curl -4 -p http://www.kyouhei.internal --proxy https://$YOUR_SUBDOMAIN.proxy.cloudflare-gateway.com --cacert certificate.pem
Accept: */* <br />
User-Agent: curl/8.7.1 <br />
Host: www.kyouhei.internal <br />
Clientless Web Isolation
内部 DNS に AAAA レコードがなく、 A レコードのみの場合は以下の Force IPv4
DNS ポリシーを設定します。
チーム名を指定したプレフィックスを付けることで、 Clientless Web Isolation での動作を確認できます。
open https://$YOUR_TEAM_NAME.cloudflareaccess.com/browser/http://www.kyouhei.internal/
Gateway DNS ログ
{
"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 を使うには、これまでも以下の選択肢がありました。
- DNS policies を使った Override
- Local Domain Fallback か Resolver policies を使って、自前の Private DNS サーバーを活用
これからは Cloudflare で Internal DNS を使えることで、自前の Private DNS サーバーを維持する必要がなくなります。
Cloudflare の公開ドメインにおける管理方式と同様に操作ができるため、保守運用性に関しても優れています。
もちろん、Cloudflare の Private LB と合わせて使うことも可能です。
ぜひ Internal DNS サービスの活用を検討してみてください。