※ 本記事は、Thomas Van Buggenhout, Emiel Ramakersによる”Implementing Oracle Database for Azure with a hub-and-spoke network“を翻訳したものです。
2023年6月29日
ハブアンドスポーク・ネットワークに接続されたOracle Database Service for Azureを使用するには、インターネット制御メッセージ・プロトコル(ICMP)メッセージがスポーク・ネットワークに到達できるように、Azureで追加の設定が必要です。この設定は、Path MTU Discovery(PMTUD)プロトコルが正しく動作し、すべてのネットワーク・トラフィックが正しく流れるために必要です。
これらのステップがないと、マルチクラウド・ネットワーク・リンク全体でAzureとOracle Cloud Infrastructure (OCI)リソース間の最大セグメント・サイズ(MSS)を正しくネゴシエートできないために発生した接続のハングが発生する可能性があります。
このブログでは背景を説明し、最適な設定について説明します。
背景とアーキテクチャ
図1は、アプリケーションとデータベース間のトラフィックが中央ハブVNetを通過する必要があるネットワーク・トポロジを示しています。

図1: ハブアンドスポーク・ネットワーク・トポロジでOracle Database for Azureを使用した高レベルのネットワーク・フロー図
Oracle Database for Azureでハブアンドスポーク・ネットワークを設定する方法を示す詳細なアーキテクチャは、アーキテクチャ・センターにあります。
図1に示す設定では、2つのスポークVNets (10.40.1.0/24および10.40.2.0/24)がそれぞれ単純な仮想マシン(VM)ベースのアプリケーションとともに表示されます。どちらのアプリケーションも、Oracle Database for Azureを介して同じOCIデータベース(192.168.2.70)に接続する必要があります。
このトラフィックは、ハブVNet (10.40.0.0/24)内のネットワーク仮想アプライアンス(NVA)を経由してルーティングされます。このNVAは、VMベースのNVA、Azureファイアウォール・サービス、またはサードパーティの VMベースのファイアウォールなどの任意のものにできます。スポークVNetsはハブVNetとピアします。
Oracle Database for Azureの設定の一部として、ハブVNetは、Oracle Database for Azureコントロール・プレーンに存在するサービスVNetとピアリングされます。サービスVNetは、顧客には表示されず、Oracleによって管理されます。このサービスVNet内では、ルーターはプライベート・トンネルを介してトラフィックをOCIに転送します。
最大セグメント・サイズのネゴシエーション
AzureとOCIの間のプライベート・トンネルは、ネットワーク・パケットのサイズに対する小さなオーバーヘッドを作成します。そのため、ネットワークのこの部分の最大転送単位(MTU)サイズは、他の方法で接続が行われる場合よりも小さくなります。
PMTUDプロトコルは最大セグメント・サイズ(MSS)をネゴシエートします。PMTUDは業界標準の手法であり、MTUサイズの違いに関係なくネットワーク接続を確立できます。PMTUDの詳細は、接続のハングに関するOCIのドキュメントを参照してください。このドキュメントでは、PMTUDが機能するためには、ICMPタイプ3のコード4のメッセージが接続内のすべてのコンポーネントおよびリソースに到達することを許可されていることが説明されています。
ICMPを許可するための要件
ICMPがスポークVNetsに到達し、PMTUDが機能するようにするには、次の要件を完了します。:
- 接続元のVMを管理するネットワーク・セキュリティ・グループ(NSG)では、Oracle Database for AzureルーターからのICMPトラフィックを許可します。
- ICMPトラフィックが、ハブ VNetのファイアウォール(またはその他のNVAルーティング・デバイス)を経由して自由かつ正しく流れることを確認します。
次のセクションでは、このソリューションの実装方法の詳細を説明します。ただし、次の理由により、この設定を実行できない場合があります。:
- Azureでは、特定のICMPタイプのみを許可することはできません。セキュリティ上の理由から、すべてのICMPトラフィックを許可する必要はありません。
- すべてのマルチノード・サードパーティ・ファイアウォールでセッションの永続性が許可されているわけではありません。そのため、ファイアウォール・ノード間でICMPトラフィックが誤ってルーティングされ、PMTUDパケットが破棄される可能性があります。
- Azure Firewallサービスでは、セッション永続性を有効にできないため、PMTUDパケットを同じ理由でドロップできます。
これらの制限の影響を受ける場合、手動でMTU設定を下げることは、PMTUDが不要なため、回避策とみなされます。この回避方法の各種オプションの詳細は、今後のブログ記事で説明します。
実装の詳細
すでにお伝えしたように、ハブアンドスポーク・ネットワークでOracle Database for Azureを使用するときにPMTUDが正しく動作することを確認するための2つの要件があります。
Oracle Database for AzureルーターからクライアントへのICMPトラフィックを許可
Oracle Database for Azureコンソールで、ルーターのIPアドレスを見つけます。関連するデータベースを選択し、データベース・システムを選択してから「ネットワーク」を選択します。:

図2: ネットワークの詳細(ルーターIPなど)を示すOracle Database for Azureコンソール
IPアドレスが見つかった場合は、AzureリソースNSGでICMPトラフィックを許可するルールを追加できます。

図3: Oracle Database for Azureルーター・アドレス空間からのICMPトラフィックを許可するNSGエントリの追加
図3では、ルーターのIPアドレスのみではなく、100.64.0.0/10 CIDR範囲全体からのトラフィックを許可します(この例では、図2に示すように、100.66.10.73)。すべての Oracle Database for AzureルーターIPは、常にCarrier-Grade NAT(CGNAT)アドレス空間(100.64.0.0/10)から取得されます。範囲全体を許可すると、このステップが簡略化されます。
ICMPトラフィックがハブVNetのファイアウォールを通過していることを確認
また、ICMPトラフィックが、ハブ VNetのファイアウォール(またはその他のNVAルーティングデバイス)を経由して自由かつ正しく流れることを確認する必要があります。
ファイアウォールでは、Oracle Database for AzureルーターからのICMPトラフィックを元のクライアントに許可する必要があります。複数のノードを持つファイアウォールまたはNVAの場合は、非対称ルーティングを回避します。これは通常、NVAまたはファイアウォール・ノードのロードバランサでセッション永続性を構成することを意味します。セッション永続性がないと、ICMPパケットは別のファイアウォール・ノードにヒットし、ファイアウォールによって破棄される可能性があります。
セッション永続性の設定は、ファイアウォールによって動作が異なります。たとえば、AzureマーケットプレイスからFortinetのFortiGate Next Generation Firewall (NGFW)を使用すると、Azure Load Balancerサービスが使用されます。図4に示すように、ロード・バランサでセッション永続性を構成できます。:

図4: Azureロード・バランサのセッション永続性の構成例
ファイアウォールがセッション永続性を使用する場合、クライアントとOracle Database for Azureルーターの間のPMTUD通信は問題なく流れます。
他のファイアウォールでは動作が異なる場合があります。たとえば、常に複数のノードを使用するAzure Firewallサービスでは、ロード・バランサのセッション永続性設定へのアクセスは許可されません。そのため、スポーク・ネットワーク内のリソースとOracle Database for Azureルーターの間のPMTUD通信は、Azure Firewallサービスのこの欠点のため、一貫して機能しません。このような場合、MTU設定を手動で下げることは、PMTUDが不要なため回避策とみなされます。この回避方法の各種オプションの詳細は、今後のブログ記事で説明します。
背景: ICMPを許可する理由
Oracle Database for AzureがハブVNetに対して構成されている場合、VNet内のリソースのデフォルトのNSGに次のエントリが含まれているため、スポークVNetsとOracle Database for Azureの間のICMPトラフィックはデフォルトで有効になりません:
![]()
図5: VirtualNetworkサービスタグを含むAzureのデフォルトのNSGエントリ
図5に示すエントリでは、ICMPを含むすべてのトラフィックが、VirtualNetworkサービス・タグに含まれているすべてのトラフィックに対して移動できます。仮想ネットワーク・サービス・タグに関するAzureのドキュメントによると、このサービス・タグには、特にピアリングされたネットワークが含まれています。ただし、プライマリ・ピアリング・ネットワークのピアリングは継承されません。つまり、ピアのピアは含まれません。
Oracle Database for Azureアーキテクチャでは、PMTUDパケットは、Oracle Database for AzureサービスVNetのルーターによってスポークVNetsに戻されて送信されます。サービスVNetはハブVNetとピアリングされますが、スポークVNetsと直接接続されません。そのため、スポークVNetsでは、VirtualNetworkサービス・タグに、PMTUDパケットの送信元であるOracle Database for AzureサービスVNetは含まれません。その結果、PMTUDパケットはブロックされ、接続試行が開始したクライアントには到達しません。
OCIでは、セキュリティ・リストでは常にICMPタイプ3コード4のメッセージがデフォルトで許可されるため、OCIではPMTUDトラフィックは破棄されません。
設定に誤りがある動作が発生
PMTUDパケットが宛先に到達しないと、スポークVNetのリソースからOracle Database for Azureリソースに接続しようとするとハングします。次の両方の問題は、PMTUDネゴシエーションの失敗によって発生します。:
- すべての接続試行が失敗します。原因は通常、Oracle Database for AzureルーターからのすべてのICMPトラフィック(通常はAzureクライアントのNSG上)がブロックされますが、ファイアウォールによってブロックされることもあります。
- ほとんどの接続は成功しますが、時折ハングアップします。このエラーは、Azure Firewallサービスの使用時など、ファイアウォールの設定が非対称ルーティングの影響を受ける場合に発生する可能性があります。このシナリオでは、「正しくない(incorrect)」ファイアウォール・ノードによって処理されるICMPパケットのみがブロックされます。PMTUDキャッシュのため、接続試行が成功すると、新しいPMTUDネゴシエーションがない期間になり、この時間中に障害は発生しません。したがって、このシナリオでは、接続の試行が少数の失敗のみが表示されます。
使用されるツールおよびプロトコルに応じて、接続の失敗は様々な形式になります。たとえば、SQL*Plusを使用する場合、図6に示すように接続がタイムアウトします。:

図6: タイムアウトしたSQL*Plus接続の例
別の例として、データベース・ホストへの直接SSH接続もタイムアウトします。

図7: タイムアウトしたSSH接続の例
ただし、データベース・ホスト上のポート1521へのtelnetセッションを正常に開始することで、接続が存在することを確認できます。

図8: Telnet接続の成功例
まとめ
多くの企業顧客は、Oracle Database Service for Azureが提供できるマルチクラウド・スプリット・スタック・ソリューションを求めています。これらの企業は、多くの場合、Azure環境でハブアンドスポーク・ネットワーク・トポロジを使用します。Oracle Database for Azureによって作成されたプライベート・トンネル、およびAzure VNetsのICMPトラフィックのデフォルト・ブロック(相互に直接ピアリングされない)のため、この設定によって接続がハングする可能性があります。
この状況では、このソリューションは、すべてのリソースとネットワーク・コンポーネント間でICMPトラフィックを自由に移動できるようにすることです。このソリューションを使用できない場合に、今後のブログ投稿でさまざまな回避策について話し合う予定です。
詳細は、次のリソースを参照してください。:
- Oracle Database Service for Azure
- Oracle Database Service for Azureについて
- マルチクラウドOracle Database Service for Microsoft Azureをハブ・アンド・スポーク・トポロジにデプロイ (リファレンス・アーキテクチャ)
- ハングしている接続
- Oracle Cloud Infrastructureマルチクラウド
