Azure Private DNSの設定方法をまとめます。Azureが提供するマネージドサービスのDNSサーバを使用することもできれば、自前のDNSサーバを使用する事もできます。
前提
公式ドキュメント
参考になる公式ドキュメントを以下に示します。
- Azure プライベート DNS とは
- クイック スタート:Azure CLI を使用して Azure プライベート DNS ゾーンを作成する
- Azure での Linux 仮想マシンの DNS 名前解決のオプション
事前設定
以下、リソースグループを作成します。
az group create --name MyResourceGroup --location japaneast
以下、仮想ネットワークを作成します。
az network vnet create \ --resource-group MyResourceGroup \ --name MyVnet \ --address-prefix 172.16.0.0/16 az network vnet subnet create \ --resource-group MyResourceGroup \ --name MySubnet \ --vnet-name MyVnet \ --address-prefixes 172.16.1.0/24
仮想マシンを作成します。
for i in 10 11 12; do az vm create \ --resource-group MyResourceGroup \ --name linux0${i} \ --image CentOS \ --size Standard_B1s \ --admin-username azureuser \ --ssh-key-values ~/.ssh/authorized_keys \ --vnet-name MyVnet \ --subnet MySubnet \ --private-ip-address 172.16.1.${i} done
デフォルトの挙動
仮想マシンへsshでログインします。/etc/resolv.confを見ると以下のような設定になっています。
デフォルト設定の名前解決方法はLinuxのディストリビューションによって異なります。詳細は「Azure での Linux 仮想マシンの DNS 名前解決のオプション」を参照ください
[azureuser@linux010 ~]$ cat /etc/resolv.conf ; generated by /usr/sbin/dhclient-script search oifzzskd1f4ezdgm4xgb4l230b.lx.internal.cloudapp.net internal.cloudapp.net nameserver 168.63.129.16 [azureuser@linux010 ~]$
168.63.129.16というのはAzureのマネージドサービスのDNSサーバです。DNSサーバのIPアドレスはDHCPによって通知されます。また、デフォルトではinternal.cloudapp.netドメインに対してAレコードが作成されます。それでは名前解決が可能かどうかを確認してみましょう。
[azureuser@linux010 ~]$ dig @168.63.129.16 linux011.internal.cloudapp.net a ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @168.63.129.16 linux011.internal.cloudapp.net a ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 52523 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1224 ;; QUESTION SECTION: ;linux011.internal.cloudapp.net. IN A ;; ANSWER SECTION: linux011.internal.cloudapp.net. 10 IN A 172.16.1.11 ;; Query time: 5 msec ;; SERVER: 168.63.129.16#53(168.63.129.16) ;; WHEN: 火 5月 03 12:00:06 UTC 2022 ;; MSG SIZE rcvd: 75 [azureuser@linux010 ~]$ ping linux011.internal.cloudapp.net -c 3 PING linux011.internal.cloudapp.net (172.16.1.11) 56(84) bytes of data. 64 bytes from linux011.internal.cloudapp.net (172.16.1.11): icmp_seq=1 ttl=64 time=1.86 ms 64 bytes from linux011.internal.cloudapp.net (172.16.1.11): icmp_seq=2 ttl=64 time=2.09 ms 64 bytes from linux011.internal.cloudapp.net (172.16.1.11): icmp_seq=3 ttl=64 time=2.00 ms --- linux011.internal.cloudapp.net ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 1.868/1.990/2.096/0.093 ms [azureuser@linux010 ~]$
プライベートDNS
プライベートDNSの定義
デフォルト設定のinternal.cloudapp.netという名前が使いづらい場合は、独自のドメイン名を定義する事もできます。プライベートな独自のドメインを定義するには以下のようなコマンドを使用します。
az network private-dns zone create \ --name private.gokatei.com \ --resource-group MyResourceGroup
上記設定で定義した独自のドメインは「仮想ネットワークリンク」と呼ばれる設定で、どの仮想ネットワークで使用可能にするかを定義できます。
引数registration-enabledは日本語訳では「自動登録を有効にする」と呼ばれる設定で、仮想マシンに対するAレコードを自動的に作成するか否かの設定です。registration-enabledをtrueにした場合は、仮想マシンに対するAレコードが自動的に作成されます。
az network private-dns link vnet create \ --name MyDnsLink \ --resource-group MyResourceGroup \ --zone-name private.gokatei.com \ --virtual-network MyVnet \ --registration-enabled true
自動登録レコードの確認
自動的に登録されたレコードを確認します。すべてのサービスから、「ネットワーキング」「プライベートDNSゾーン」「ゾーン名(private.gokatei.com)」「概要」の順に画面遷移すると、自動的に登録されたレコードを確認できます。
CLIで確認する場合は以下のようなコマンドを使用します。
$ az network private-dns record-set list \ --resource-group MyResourceGroup \ --zone-name private.gokatei.com [ { "aRecords": null, <omitted> }, { "aRecords": [ { "ipv4Address": "172.16.1.10" } ], <omitted>
仮想マシンへsshでログインし、digコマンド等で名前解決可能な事を確認します。
[azureuser@linux010 ~]$ dig @168.63.129.16 linux011.private.gokatei.com a ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @168.63.129.16 linux011.private.gokatei.com a ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29665 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1224 ;; QUESTION SECTION: ;linux011.private.gokatei.com. IN A ;; ANSWER SECTION: linux011.private.gokatei.com. 10 IN A 172.16.1.11 ;; Query time: 5 msec ;; SERVER: 168.63.129.16#53(168.63.129.16) ;; WHEN: 火 5月 03 12:27:45 UTC 2022 ;; MSG SIZE rcvd: 73 [azureuser@linux010 ~]$ ping linux011.private.gokatei.com -c 3 PING linux011.private.gokatei.com (172.16.1.11) 56(84) bytes of data. 64 bytes from linux011.internal.cloudapp.net (172.16.1.11): icmp_seq=1 ttl=64 time=2.30 ms 64 bytes from linux011.internal.cloudapp.net (172.16.1.11): icmp_seq=2 ttl=64 time=1.29 ms 64 bytes from linux011.internal.cloudapp.net (172.16.1.11): icmp_seq=3 ttl=64 time=1.34 ms --- linux011.private.gokatei.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.293/1.645/2.304/0.468 ms [azureuser@linux010 ~]$
手動登録
レコードを手動で登録する事もできます。以下は、db012.private.gokatei.comにlinux012.private.gokatei.comというエイリアスを定義するCNAME作成例です。
az network private-dns record-set cname create \ --resource-group MyResourceGroup \ --zone-name private.gokatei.com \ --name db012 az network private-dns record-set cname set-record \ --resource-group MyResourceGroup \ --zone-name private.gokatei.com \ --record-set-name db012 \ --cname linux012.private.gokatei.com
仮想マシンへsshでログインし、digコマンド等でCNAMEの名前解決可能な事を確認します。
[azureuser@linux010 ~]$ dig @168.63.129.16 db012.private.gokatei.com ; <<>> DiG 9.9.4-RedHat-9.9.4-61.el7 <<>> @168.63.129.16 db012.private.gokatei.com ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 58976 ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1224 ;; QUESTION SECTION: ;db012.private.gokatei.com. IN A ;; ANSWER SECTION: db012.private.gokatei.com. 1800 IN CNAME linux012.private.gokatei.com. linux012.private.gokatei.com. 10 IN A 172.16.1.12 ;; Query time: 8 msec ;; SERVER: 168.63.129.16#53(168.63.129.16) ;; WHEN: 火 5月 03 13:56:12 UTC 2022 ;; MSG SIZE rcvd: 93 [azureuser@linux010 ~]$ ping db012.private.gokatei.com -c 3 PING linux012.private.gokatei.com (172.16.1.12) 56(84) bytes of data. 64 bytes from linux012.internal.cloudapp.net (172.16.1.12): icmp_seq=1 ttl=64 time=3.85 ms 64 bytes from linux012.internal.cloudapp.net (172.16.1.12): icmp_seq=2 ttl=64 time=2.07 ms 64 bytes from linux012.internal.cloudapp.net (172.16.1.12): icmp_seq=3 ttl=64 time=1.66 ms --- linux012.private.gokatei.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2003ms rtt min/avg/max/mdev = 1.669/2.534/3.857/0.951 ms [azureuser@linux010 ~]$
カスタムDNS
AzureのマネージドサービスのDNSサーバで要件を充足しない場合は、自前のDNSサーバを利用する事もできます。デフォルトではDHCPによってAzureマネージドサービスのDNSサーバ(168.63.129.16)が通知されますが、DHCPによって通知するDNSサーバを変更する事もできます。
ポータル(GUI)で設定変更する場合は、すべてのサービスから「ネットワーキング」「仮想ネットワーク」「仮想ネットワーク名(MyVnet)」「DNS」サーバの順に画面遷移すると操作できます。
CLIで操作する場合は以下のコマンドを使用します。
az network vnet update \ --resource-group MyResourceGroup \ --name MyVnet \ --dns-servers 172.16.1.12
DHCPによって通知されるDNSサーバが変わりますので、設定変更にはDHCPによる再割り当て操作が必要です。sshで仮想マシンにログインし、OS再起動をします。
sudo reboot
OS再起動後に/etc/resolv.confを見ると、DNSサーバが変わった事が分かります。
[azureuser@linux010 ~]$ cat /etc/resolv.conf ; generated by /usr/sbin/dhclient-script search reddog.microsoft.com nameserver 172.16.1.12 [azureuser@linux010 ~]$