, , ,

TCP通信もPrivate Endpointを通るか?

このエントリは2026/11/12現在の情報に基づいています。将来の機能追加や変更に伴い、記載事項からの乖離が発生する可能性があります。

問い合わせ

いつもの主から、以下のような問いが届いた。

現在ACA (Azure Container Apps) を2個作成してClientとServerとし、両アプリをPrivate Endpoint経由で通信させようとしている。

  • 通信は成功する?
  • 追加Ingressを構成した場合も影響ない?
  • 構成上注意点はある?

「HTTP通るんですし(TCPですし)🍣」という気持ちはあれど、確認しておいて損はしないので、やってみた。

検証トポロジー

非常にシンプルなものである。 

  • app-bはパブリックネットワークからのHTTPアクセスを待ち受け、Query parameterで指定されたポートに対してリクエストを投げる。
  • app-aは、app-bから送信されたTCP通信のメッセージに対して応答を返す

ネットワーク構成は以下の通り。

  • 各ACAアプリはカスタムVNetにデプロイされていて、両VNETはPeeringしていない
  • app-bをホストするACAが属するVNETから、app-aをホストするACA (厳密にはACE) に対してPrivate Endpointを構成済み
  • 最初はapp-aではtcp/18192のみをIngressで公開する。公開スコープはVNet。
  • 検証後、tcp/28192、tcp/38192を追加Ingressで公開する。これらの公開スコープもVNet。

アプリケーションのしくみ

まず、app-bに対してリクエストを投げる。

https://{app-bのFQDN}/api/tcp?port={port}

これで、app-aのtcp/18192に対してメッセージを投げる。このメッセージは以下のよう。

Hello {port}, how are you?

app-aは、app-bからの上記メッセージに対して応答を返す。

Acknowledged {request} This message is sent from {port}!

app-bは、上記応答をHTTP responseとして返す。

テスト

確認してみた。

(1) tcpリスニングポートへの通信

curlで呼び出したところ、応答は問題なく通っている。

ログからも、app-bからapp-aに向けた通信も問題なく通っていることがわかる。

ログに見えるIPアドレスは?

ログにPrivate IPレンジのIPアドレスがあるが、これは、ACA Workload Profileで内部用に予約している IP 範囲のもの。以下のドキュメントに、予約アドレスの記載がある。

  • 100.100.0.0/17
  • 100.100.128.0/19
  • 100.100.160.0/19
  • 100.100.192.0/19

Subnet – Configure Virtual Networks in Azure Container Apps Environments | Microsoft Learn

Private Link では送信元 IP が NAT IP に変わり、アプリケーション(今回で言えばapp-a)には、実際のクライアントIPではなく、このNAT IPが見える。

Getting connection Information using TCP Proxy v2 – What is Azure Private Link service? | Microsoft Learn
NAT IP configuration (ipConfigurations) – What is Azure Private Link service? | Microsoft Learn

これらのことから、TCP ingress では実際のクライアント IP は取れないので、予約範囲を自分の VNET で使わず、アクセス制御は PE サブネットの NSG や PE 接続の承認で行う必要がある。

コードなど

以下のリポジトリに設定ならびにコードを公開中。

anishi1222/ACA_tcp

コメントをどうぞ

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください。