はじめに
今回はオンプレ→Azureのプライベートエンドポイントの通信をHubのAzure Firewallにルーティングする方法をご紹介します。
現場でMicrosoftのサポートも駆使した上で、解決に時間を要した問題ですので、今後誰かが同じ問題に当たった時の役に立てれば幸いです。
また、体験学習コーナーでは以下のような環境を作成します。クラウド技術の学習では自分で手を動かして学習することが非常に大事ですので、是非実施していただければと思います。
対象読者
- Azureを使用する現場に従事している方
- Azureの資格勉強をしている方
- Azureに興味がある方
- クラウド技術に興味がある方
免責事項
Azureの従量課金アカウントが作成されていることが前提です。
ハンズオンにあたって料金がかかります。今回の体験学習ではVPN GatewayやAzure Firewallなど放置しておくととんでもなく高額になるサービスが含まれます。記事の最後にリソースの削除の仕方も解説しておりますので、ハンズオンが終了したらただちに削除を実施してもらうようお願いします。
また、Azureの画面に関しては、2024年11月30日時点のものを使用しております。
使用サービス・技術
・Virtual Network(以下、VNet)
Azure内で仮想マシン(VM)やその他のリソース間で安全な通信を可能にするための論理的な分離ネットワークです。
・サブネット
VNet内でIPアドレス範囲をさらに細分化した論理区画です。サブネットを使うことで、VNet内のリソースをグループ化し、異なるセキュリティおよびネットワークポリシーを適用することが可能になります。
・ルートテーブル
ネットワークトラフィックのルーティングを制御するためのカスタマイズ可能なルーティングルールを定義するために使用されます
・VPN Gateway
Azure内の仮想ネットワーク(VNet)をオンプレミスのネットワークや他のVNetに接続するためのリソースです。これにより、安全なトンネルを通じてインターネットを介してデータを暗号化し、リモートネットワーク間で通信することが可能になります。
・ローカルネットワークゲートウェイ
オンプレミスのネットワーク環境(または他のクラウドサービスプロバイダーのネットワーク)とAzureの仮想ネットワーク(VNet)を接続する際に使用されるリソースです。ローカルネットワークゲートウェイは、オンプレミスネットワークのIPアドレス範囲やネットワークゲートウェイの情報(例えば、VPNデバイスのパブリックIPアドレス)をAzureに認識させる役割を担います。
・プライベートDNSゾーン
Azure仮想ネットワーク内のリソースに対してプライベートなDNS解決機能を提供するためのサービスです。この機能により、Azure VNet内のリソースがインターネットに公開されることなく、内部的に隔離された状態でDNS解決を実行できます。
・プライベートDNSリゾルバー
Azure仮想ネットワーク(VNet)内でプライベートDNSゾーンを利用して名前解決を行うためのサービスです。これにより、VNet内外のリソース間で安全で効率的なDNS解決を提供することができます。
・プライベートエンドポイント
Azureのパブリックサービス(例:Azure Storage、Azure SQL Database、Azure Cosmos DB など)に対してプライベートな接続を提供するためのネットワークインターフェースです。プライベートエンドポイントを使用することで、これらのサービスにインターネット経由ではなく、Azureの仮想ネットワーク(VNet)内のプライベートIPアドレスを介して安全にアクセスできるようになります。
・Azure Firewall
Azureの仮想ネットワークでネットワークトラフィックを管理し、セキュリティを強化するためのクラウド型のセキュリティサービスです。Azure Firewallは、統合されたステートフル(状態保存型)ネットワークファイアウォールとして機能し、トラフィックのフィルタリング、ログの取得、セキュリティポリシーの管理を一元的に行うことができます。
・ストレージアカウント
クラウドでデータを格納、管理、およびアクセスするためのAzure Storageサービスを提供する基本単位です。ストレージアカウントを作成することで、Azureが提供するさまざまなストレージサービスやデータサービスを利用するためのコンテナやデータベースをホストできます。
・VirtualMachine(以下、VM)
クラウド環境でのコンピューティングリソースを提供するサービスです。これは仮想サーバーとも呼ばれ、ユーザーが仮想環境で物理サーバーを使うようにコンピューティングリソースを利用できます。AzureのVMは、WindowsやLinuxのオペレーティングシステムを実行でき、Webサーバー、データベース、アプリケーションのホスト、開発テスト環境など、さまざまな用途に使用されます。
・Azure Bastion
Azure仮想ネットワーク内の仮想マシン(VM)にセキュアで無操作なRDP(リモートデスクトッププロトコル)およびSSH(セキュアシェル)接続を提供するマネージドサービスです。Bastionを使用することで、仮想マシンに直接パブリックIPアドレスを公開することなく、安全に管理できます。
1. 問題
オンプレ→プライベートエンドポイントの通信をAzure Firewallにルーティングするルートテーブルを使っても、デフォルトの設定ではAzure Firewallにルーティングしてくれない。
2. 解決策
プライベートエンドポイントがあるサブネットの「ネットワークポリシー」の設定でルートテーブルを有効化する
上述の設定が無効になっている場合、プライベート エンドポイントが作成された際に自動で作られる内部的な経路が優先され、ルート テーブルで指定している経路ではなく、直接通信してしまうことが原因でした。
3. 体験学習
それでは実際に環境を構築して体験学習していきます。
3-1.環境作成
今回作成するリソースが非常に多いため、私のGitHubリポジトリから以下のようなネットワーク環境を一括で作成します。
以下のリンクからGitHubに移動してください。
shuhei0720のGitHubリポジトリへ移動
下にスクロールし、[Deploy to Azure]ボタンをクリックしてください。
すると、Azureのログイン画面に移動するため、読者様個人のアカウントでログインします。
ログインが完了すると、Azureのデプロイ画面に移動します。
最初の「基本」タブで以下のように入力します。「サブスクリプション」は各自のサブスクリプションを選択してください。入力後、[次へ]をクリックします。
「Hub VNET」タブで以下のように入力し、[次へ]をクリックします。
「Spoke VNET」タブで以下のように入力し、[次へ]をクリックします。
「オンプレミスのシミュレーション」タブで以下のように入力し、[次へ]をクリックします。
「サイト間共有キー」は任意のパスワードを入力してください。
「仮想マシン」タブで以下のように入力し、[次へ]をクリックします。
仮想マシンのサイズは何でもいいですが、できれば画像のものと合わせてください。
管理者ユーザー名とパスワードは任意のものを入力してください。(VMのパスワードポリシーに引っかからないようにできるだけ複雑な方が良いです。)
「タグ」タブは特に入力せず[次へ]をクリックしてください。
すると、以下のような画面になります。デプロイに1時間程度かかるので1時間ほど待ってから画面を見に来てください。
以上で、「3-1.環境作成」は完了です。
3-2.診断設定有効化
Azure Firewallで通信ログを取るために、診断設定を有効化します。
最初にログを格納する箱を作成します。
ポータル画面で「Log」と検索し[LogAnalyticsワークスペース]をクリックします。
以下のように入力し、[確認と作成]→[作成]をクリックします。
次にAzure Firewallの診断設定を有効化していきます。
ポータル画面で「ファイアウォール」と検索し、[ファイアウォール]をクリックします。
以上で、「3-2.診断設定有効化」は完了です。
3-3.ストレージアカウントの設定
Azureポータルで「ストレージ」と検索し、[ストレージアカウント]を選択します。
「基本」タブで以下のように入力し、[次へ]をクリックします。
※ストレージアカウント名は世界で一意になる必要があります。適宜変更してください。
「詳細」タブはそのままで[次へ]をクリックします。
「ネットワークタブ」で以下のように入力し、[プライベートエンドポイントの追加」をクリックします。
「プライベートエンドポイントの作成」画面で以下のように入力し、[OK]をクリックします。
元の画面に戻るので[次へ]をクリックします。
「データ保護」タブで以下のように入力し、[次へ]をクリックします。
その他のタブはデフォルトのままで[確認と作成]を押してください。ここで検証に失敗した場合、ストレージアカウント名が世界ですでに使用されている可能性がありますので、変更してください。
検証に成功したら、[作成]をクリックします。
「プライマリエンドポイント」のURLをメモ帳にコピーしておきましょう。
「BLOBのアップロード」画面で[ファイルの参照]をクリックし、この記事に添付している[index.html]ファイル保存し、それを選択します。
※この記事に添付しているindex.htmlは私がテキトウに作成したhtmlファイルです。htmlファイルで名前がindex.htmlであればなんでもいいです。
「BLOBのアップロード」画面に戻り、「既存のコンテナーを選択する」で[$web]を選択し、[アップロード]をクリックします。
試しに、先ほどメモ帳にコピーしたURLをブラウザで入力してみましょう。
以下のようにWebサイトにアクセスできるはずです。
次に、このWebサイトへのアクセスをプライベートエンドポイントからのみアクセスできるように変更します。
ストレージアカウントの画面で左ペインの「セキュリティとネットワーク」を開き、[ネットワーク]をクリックします。
「ファイアウォールと仮想ネットワーク」の画面で「パブリックネットワークアクセス」を[無効]にし、[保存]をクリックします。
保存出来たら、先ほどアクセスしたURLにもう一度アクセスしてみましょう。個人のPCからのアクセスはパブリックインターネットを通るので、拒否されるはずです。
※先ほどと同じように表示された場合キャッシュが残っています。シークレットブラウザでアクセスしてみましょう。
以上で、「3-3.ストレージアカウントの設定」は完了です!
3-4.プライベートDNSの設定
次にプライベートエンドポイントのDNSの設定を行っていきます。
まず、Spoke VnetのDNSサーバーを設定します。
ポータル画面で「vnet」と検索し、[仮想ネットワーク]をクリックします。
DNSサーバーを[規定(Azure提供)]を選択し、[保存]をクリックします。
次に、インバウンドエンドポイント専用のサブネットを作成します。
VNET-Spoke1の画面の左ペインから[サブネット]を選択します。
サブネット追加は完了です。
次に、プライベートDNSリゾルバーを作成していきます。
ポータル画面で「DNS」と検索し、[DNS Private Resolver]をクリックします。
「基本」タブで以下のように入力し、[次へ]をクリックします。
「受信エンドポイント」タブで[+ エンドポイントの追加]をクリックします。
「受信エンドポイントの追加」画面で以下のように入力し、[保存]をクリックします。
以下の画面のようになれば、DNSリゾルバーの作成は完了です。
3-5.疑似オンプレミスのDNSサーバーの設定
まず、疑似オンプレミスのVNetのDNSサーバーを設定します。
ポータル画面から「vnet」で検索し、[仮想ネットワーク]をクリックします。
次に、疑似オンプレミスVNet内のVMにDNSサーバーの役割を追加し、条件付きフォワーダーの設定を行います。
ポータル画面から「virtual」と検索し、[Virtual Machines]をクリックします。
環境作成時に指定したユーザーとパスワードを入力し、[接続]をクリックします。
※接続時に「クリップボードを許可しますか」と聞かれた場合、[はい]を選択します。
接続すると、Server Managerが開いていますので、右上の[Manage]→[Add Roles and Features]を選択します。
開いた画面でそのまま[Add Features]をクリックします。
Server Managerの画面に戻りますので、右上の[Tools]→[DNS]をクリックします。
DNS Managerの画面で、[VM-OnPrem]→[Conditional Forwarders]→[New Conditional Forwarders]をクリックします。
VMが起動したら、名前解決をテストしてみます。VM内でコマンドプロンプトを開きます。
先ほどメモしたURLからnslookupのコマンドを作成します。
先ほど作成したnslookupコマンドを実行してみます。
10.0.1.5が返ってきていれば名前解決は成功しています。
続いて、VM内でブラウザを開きメモにあるURLを検索してみましょう。
以下のようにプライベートエンドポイント経由でアクセスできました。
以上で、「3-5.疑似オンプレミスのDNSサーバーの設定」は完了です。
3-6.Azure Firewallのログの確認
さて、環境が整ったところで、オンプレ→SpokeのHTTPS通信がAzure Firewallを経由しているか、ログを確認してみましょう。
Azureポータルから[ファイア]と検索し、[ファイアウォール]をクリックします。
開いた画面で、以下のクエリを実行してください。
※以下の画像と画面の表示が違う場合は、[KQLモード]に切り替えてください。
AZFWNetworkRule
| where DestinationIp contains "10.0.1.5"
結果が表示されずログがない(=Azure Firewallを通っていない)ことがわかります。
3-7.サブネットの設定(今回の肝)
それでは、この通信をFirewallを通すための設定を行います。
ポータル画面で「vnet」と検索し、[仮想ネットワーク]をクリックします。
左ペインから[プライベートエンドポイント]をクリックします。
「プライベートエンドポイント」画面で「プライベートエンドポイントネットワークポリシー」が[Disabled]になっていると思うので、そちらをクリックします。
「サブネットの編集」画面で下にスクロールし、「プライベートエンドポイントネットワークポリシー」を[ルートテーブル]に変更し、[保存]をクリックします。
もとの画面に戻るので、「プライベートエンドポイントネットワークポリシー」が「RouteTableEnabled」に代わっていることを確認してください。
さて、サブネットの設定が完了したので、先ほどのVMの画面に戻り、新しいプライベートウィンドウからもう一度ストレージアカウントに検索してみましょう。
タスクバーのMicrosoft Edgeのアイコンを右クリックし、[New InPrivate window]をクリックします。
次にまた先ほどと同じようにAzure Firewallのログを確認します。(ログに反映されるまで5~10分かかるのでしばらく待ってください。)
すると、ログが出てきます。これでAzure Firewallを通るようになったことが確認できました。
以上で、すべてのハンズオンは完了です。
3-9.リソースの削除
※高額なリソースが含まれるので、途中で中断する場合も必ず削除してください。
ハンズオンが終了したら、課金が発生しないようにリソースを削除しておきましょう。
Azureポータルから[リソースグループ]をクリックします。
[rg-hub]、[rg-onprem]、[rg-spoke1]を削除していきます。
まず、[rg-hub]をクリックします。
「リソースグループの削除」画面でリソースグループ名を入力し、[削除]をクリックします。
同様に、[rg-onprem]、[rg-spoke1]も削除します。
削除には時間がかかります。
しばらくすると以下のように通知が来るのでリソースグループの画面から[rg-hub]、[rg-onprem]、[rg-spoke1]が削除されたことを確認しましょう。
以上で、リソースグループの削除は完了です。
おわりに
今回は、オンプレ→Azureのプライベートエンドポイントの通信をHubのAzure Firewallにルーティングする方法を紹介しました。
複雑なアーキテクチャになってくると原因を特定するのがかなり大変です。
今回もルートテーブル等の設定に注目していたら、なかなか気づかないような点に解決策があるので情報がないと苦労します。
現場で私と同じような機会があれば、是非この記事の設定を参考にしていただければ幸いです。