AzurePaaS研究サイト

Azure研究サイト

~理解しずらい情報をシンプルにお伝えします~

AppService/Functionsの受信IP(着信IP)と送信IPの違い・固定IPは設定できるのか

受信IP(着信IP)と送信IPの違いを理解する

AppService/Functions上の通信を理解する上で、受信IP(着信IP)と送信IPの違いを知る必要があります。
 
WebWorker(インスタンス)で実行されているアプリケーションを軸に、クライアント側からリクエストを受信するので「受信」、アプリケーション処理内から外部(データベース、ストレージアカウント、その他外部のRESTAPI呼び出しなど)にアクセスする際は「送信」というワードを使ってます。そのイメージができれば、以下の内容が覚えやすいと思います。「受信トラフィック」「送信トラフィック」というワードも考え方は同じです。

受信IP(着信IP)とは

手書きですが、ざっくりイメージ図を書きました。

 
 
受信IP(着信IP)は、クライアントからAzureにリクエストが送信されて、WebWorkerで受信する際のIPアドレスのことを指します。
少し難しいのですがもう1歩踏み込んで説明すると、WebWorkerにとっての送信元IPは、外部インターネット上のクライアントのIPアドレスではなく、あくまでもAzure内のFrontEndのIPがWebWorkerにとっての送信元IPになります。
 

受信IP(着信IP)が表示される場所

送信IPとは

こちらも、ざっくりイメージ図を書きました。

 
 
AppServiceアプリケーションからAppServiceアプリの外(DB,Storage,外部サービス)にアクセスする際のIPアドレスのことを指します。
 

送信IPが表示される場所

 

AppService/FunctionsのIPアドレスの仕組みを理解

すべてのAppService/Functionsリソース一つ一つに一意になるIPアドレスが付与されてると思っていたら、それは間違いです。Aさんが作ったリソースにもBさんが作ったリソースにも同じIPアドレスが割り当てられたりするということです。
 
まず覚えておくべきこととしては、PaaSの性質上、複数ユーザのアプリケーションが一つのIPアドレスを共有しています。そのため、特定のアプリケーションにアクセスするためには、ドメインを用いたURLでアクセスする必要があります。割り当てられているIPアドレスで、アプリケーションにアクセスしてみると404エラーになります。
 
また、ブラウザからアプリケーションへのアクセス時に、実際どのIPアドレスを使って通信しているかは状況によって異なり、何かのきっかけによってIPアドレスが変更されることがありますが、詳細は後述します。
 

AppService/Functionsの送信IPは固定できるのか

AzureSQLDatabaseやAzureStorageAccountを、特定のAppService/Functionsからのみアクセスされるように制限したい、というセキュリティ対策をよく見かけます。(送信IP側の話です)
 
AppServiceプランの場合送信IPは原則固定ですが、まだ送信IPが変わる可能性は残ります。ASE(AppServiceEnvironment)を使えば出来ますがただ固定IPのために使うとしたら割高過ぎます。そもそも固定IPでなくても、アクセス制御方法はあります。
代表的な例は、「仮想ネットワーク・Vnet統合を構築する」ですね。これをやると、SNATポート枯渇も発生しなくなるなど、いくつかメリットがあります。
 
とはいえ・・・送信IPでアクセス制限したい人は、AppServiceやFunctionsの送信IPは複数ユーザのアプリケーションが共有して使用してるということことを知らない気もします。やりたければやってもいいけど、送信IPは共有されてるので、IPアドレスによるアクセス制限はセキュリティ的に問題ありだと思います。
 
 
また、「何かのきっかけによって、AppService/FunctionsのIPアドレスが変更されることがある」については、以下の公式ドキュメントに記載されてます。
 
受信IPはいつ変更されるか

docs.microsoft.com

 
送信IPはいつ変更されるか

docs.microsoft.com

===== 抜粋 ここから =====
次のいずれかの操作を実行すると、アプリの一連の送信IPアドレスが変更されます。
 
アプリを削除した後、別のリソース グループ内に再作成する (デプロイ単位が変更される場合があります)。
リソース グループ と リージョンの組み合わせに含まれる最後のアプリケーションを削除した後、再作成する (デプロイ単位が変更される場合があります)。
アプリを下位レベル(Basic、Standard、および Premium)、Premium V2、PremiumV3 レベルの間でスケーリングする(IPアドレスはセットに追加するか、削除することができます)。
===== 抜粋 ここまで =====

 

【案1】NATゲートウェイを利用して固定IPを実現

1つ目の方法としては、
NATゲートウェイをご利用することにより、AppServiceからのアウトバウンド通信の送信IPアドレスを固定することが可能です。 AppServiceでNATゲートウェイを使用するため、リージョンVNet統合を行います。また、すべての送信トラフィックをVNetにルーティングするよう設定します。

アプリをAzure仮想ネットワークと統合する > リージョンVNet統合
https://docs.microsoft.com/ja-jp/azure/app-service/web-sites-integrate-with-vnet#regional-vnet-integration ===== 抜粋 ここから =====
既定では、アプリではRFC1918トラフィックのみがVNetにルーティングされます。 すべての送信トラフィックをVNetにルーティングする場合は、アプリの設定WEBSITE_VNET_ROUTE_ALLをアプリに適用します。 アプリ設定を構成するには、次のようにします。
 
アプリ ポータルの [構成] UI にアクセスします。 [新しいアプリケーション設定] を選択します。
[名前] ボックスに「WEBSITE_VNET_ROUTE_ALL」、 [値] ボックスに「1」と入力します。
===== 抜粋 ここまで =====
 
NATゲートウェイを使用することで、VNet内からVNetの外に出ていく通信がNATゲートウェイを経由して、NATゲートウェイのパブリック IPアドレスを利用した通信になるように設定することができます。
英語ページですが、AppServiceでNATゲートウェイを使用する方法の公式ドキュメントはこちら。

NAT Gateway and app integration

azure.github.io

=== 抜粋 ここから === To use a NAT Gateway with your app, you need to
・Configure Regional Vnet Integration with your app as described in Integrate your app with an Azure virtual network
・Route all the outbound traffic into your Azure virtual network
・Provision a NAT Gateway in the same virtual network and configureit with the subnet used for VNet Integration
 
(機械翻訳)
アプリでNATゲートウェイを使用するには、次のことを行う必要があります。
・アプリとAzure仮想ネットワークの統合の説明に従って、アプリとのリージョナルVnet統合を構成します。
・すべてのアウトバウンドトラフィックをAzure仮想ネットワークにルーティングします
・同じ仮想ネットワークにNATゲートウェイをプロビジョニングし、VNet統合に使用されるサブネットで構成します
=== 機械翻訳 ここまで ===
 

【案2】AzureFirewallを利用して固定IPを実現

2つ目の方法としては、
AppServiceのVNet統合サブネットからAzureFirewallを経由し、AzureFirewallに設定された固定のIPアドレスによりインターネットへ通信を行うことが可能です。
AzureFirewallの送信SNATについての、公式ドキュメントを載せます。
 
Azure Firewall の機能 > 送信 SNAT サポート

docs.microsoft.com

 
ルートテーブルのルート作成手順の公式ドキュメント チュートリアル:AzurePortalを使用してルート テーブルでネットワーク トラフィックをルーティングする > ルートの作成

docs.microsoft.com

VNet統合のサブネットとルートテーブルの関連付け手順の公式ドキュメント チュートリアル:AzurePortalを使用してルート テーブルでネットワーク トラフィックをルーティングする > サブネットへのルート テーブルの関連付け

docs.microsoft.com

 
同様の構成についての参考サイト
マルチテナント型AzureWebAppsでアウトバウンドIPを固定する https://torumakabe.github.io/post/webapp-outbound/ (AzureFirewallを使用したアウトバウンド通信の構成について記載されてます。)  
 

おまけ

オンプレミスからアクセスしたときに、インターネットを経由したくない

ExpressRouteを使う。
 

WebAppsにローカルIPアドレスを割り当てたい

内部ASEを使う。
 
 
以上です。
 

最終更新日.2022/11/05
ご意見・ご要望はこちらへ