AzurePaaS研究サイト

AzurePaaS研究サイト

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

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

最終更新日.2021/ 9/ 6

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

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

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

受信IP(着信IP)

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

f:id:nanacy7741:20210722100859p:plain

 

受信IP(着信IP)は、クライアントからリクエストを受信する際に使用されるIPのことを指します。
 
 
< 受信IP(着信IP)>(この辺りに表示されてます)

f:id:nanacy7741:20210720011424p:plain

f:id:nanacy7741:20210720011236p:plain

送信IP 

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

f:id:nanacy7741:20210722101012p:plain

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

< 送信IP >(この辺りに表示されてます)

f:id:nanacy7741:20210720010820p:plain

 

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

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

 
 

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

SQL Database や Storage Account を、特定の 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 アドレスはセットに追加するか、削除することができます)。
===== 抜粋 ここまで =====

 

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

1つ目の方法としては、
NAT ゲートウェイをご利用することにより、App Service からのアウトバウンド通信の送信 IP アドレスを固定することが可能です。 App Service で 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 アドレスを利用した通信になるように設定することができます。
英語ページですが、App Service で 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統合に使用されるサブネットで構成します
=== 機械翻訳 ここまで ===
 

Azure Firewall を利用して固定 IP を実現(案2)

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

docs.microsoft.com

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

docs.microsoft.com

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

docs.microsoft.com

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

おまけ

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

ExpressRoute を使う。
 

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

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

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