AzurePaaS研究サイト

AzurePaaS研究サイト

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

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

最終更新日.2022/05/05

 
 
AppService/Functions上の通信を理解する上で、受信IP(着信IP)と送信IPの違いを知る必要があります。
 

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

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

受信IP(着信IP)とは

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

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

送信IPとは

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

AppServiceからAppService外(DB, Storage, 外部サービス)にアクセスする際に使用されるIPアドレスのことを指します。
 

< 送信IP >(Azure画面の表示場所)

 

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

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

 
 

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

AzureSQLDatabaseやAzureStorageAccountを、特定の AppService/Functions からのみアクセスされるように制限したい、というセキュリティ対策をよく見かけます。
 
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

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

docs.microsoft.com

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

docs.microsoft.com

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

おまけ

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

ExpressRouteを使う。
 

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

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

ご意見・ご要望はこちらへ