tl;dr
DNSプロキシサーバを置くことで可能です。
シナリオ: オンプレミスのコンピューターからの Azure のホスト名の解決。
ソリューション: 対応する仮想ネットワーク内のユーザーが管理する DNS プロキシ サーバーにクエリを転送し、プロキシ サーバーが解決するために Azure にクエリを転送します。 「独自の DNS サーバーを使用する名前解決」を参照してください。
試す
準備
準備として、プライベートDNSゾーンを用意します。また、このプライベートDNSゾーンをVMが稼働している仮想ネットワークへリンクしておきます。
今回はfukasawah.dev
で、Aレコードにvm-1 => 10.0.0.5
を加えておき、これをオンプレミス上から名前解決できるところがゴールです。
ちなみにオンプレミスとの接続構成は仮想ネットワークゲートウェイ(VPN)を使ったSite to Siteです。
仮想ネットワーク上にDNSプロキシサーバを立てる
今回はAzureでubuntuイメージからVMを作り、そこにdnsmasqを入れます。
dnsmasqは内部向けのDNSキャッシュサーバとして使われますが、ネットワークへ公開することでDNSプロキシサーバっぽくふるまうこともできます。
すでにsystemd-resolvedが動いていますが、公開の設定の仕方もよくわからなかったのでdnsmasqを立てたという感じです。
今回、VMのプライベートIPは「10.0.0.4」でしたが、適宜置き換えてください。0.0.0.0を指定するやりかたがなぜか使えなかったので・・・(おそらくsystem-resolvedがいるから?)
sudo apt update
sudo apt install dnsmasq
sudo tee -a /etc/dnsmasq.conf << 'EOF'
interface=eth0
listen-address=10.0.0.4
port=53
EOF
sudo systemctl restart dnsmasq
Azureのubuntuは/etc/resolve.conf
の設定に従い、「ローカルのsystemd-resolved」を通して「Azure DNS」に問い合わせます。
試すだけであればこれで完了です。
クエリを投げて確認
オンプレミス上のマシンからnslookupを試してみます。nslookupは第2引数にDNSサーバのIPを指定することでDNSサーバを明示できます。
C:\Users\fukasawah> nslookup vm-1.fukasawah.dev 10.0.0.4
サーバー: vm-0.internal.cloudapp.net
Address: 10.0.0.4
権限のない回答:
名前: vm-1.fukasawah.dev
Address: 10.0.0.5
後はオンプレミスからはこのDNSプロキシサーバのIPを使うよう、DHCPの設定なりPCのネットワーク設定を変えればよいでしょう。
蛇足:DNSプロキシサーバ無しにできない・・・っぽい
DNS クエリ トラフィックは VM ごとに調整されます。
と、ドキュメントに書かれています。ここで「調整されてもいいからDNSプロキシサーバを仮想ネットワークに置きたくない」という場合、それは出来るのかどうか?というのをやってみました。(オンプレにだけDNSプロキシサーバをおきたい、など...。)
結果としては出来ませんでした。
単純にAzureのDNSサーバである168.63.129.16
を 仮想ネットワーク内から アクセスできればよいのでは?と思い、オンプレミスからの168.63.129.16
への通信を仮想ネットワークゲートウェイに向けるようにルータのルーティングをいじってみました。が、手元の環境ではうまくいきませんでした。
私のルータのルーティングの設定が誤っているか、仮想ネットワークゲートウェイから168.63.129.16
への通信ができないと考えられます。