背景
前からずっと不思議に思っていますが、以下のシナリオの場合、VM間のTCP通信はなぜblockされないのか?
シナリオ:
VM AとVM Bがあります。
AのNSGにはBからの通信をblockするルールを設定しています。
この場合、AからBにTCP通信(例えばRDP)を出すと、成功になります。
疑問:
RDPはTCPですが、往復通信です。AからBへの往路通信はoutboundで許可して、問題ないですが、
BからAへの復路通信はAのinbound blockルールがあるのに、影響されないです。これはなぜでしょうか。
TCP通信では、クライアント(ここではVM A)がサーバー(VM B)に接続を開始する際、以下のような通信の流れが発生します:
往路(VM A → VM B):VM AからVM BへRDP接続を確立するためのSYNパケットが送信される(アウトバウンド通信)。
復路(VM B → VM A):VM Bが応答としてSYN-ACKパケットを返し、その後のデータ通信が行われる(インバウンド通信)。
回答
VM AのNSGでVM Bからのインバウンド通信をブロックしていても、VM AからVM BへのRDP接続が成功する理由は、Azure NSGのステートフルな動作により、VM Aが開始したTCPセッションの復路通信(VM B → VM A)が自動的に許可されるためです。この復路通信は、インバウンドブロックルールの対象外となります。
もし意図的にRDPをブロックしたい場合は、VM AのアウトバウンドルールまたはVM BのインバウンドルールでRDP通信を明示的に拒否する必要があります。
技術Point
1.NSGのステートフルな動作:
AzureのNSGはステートフルファイアウォールとして機能します。つまり、許可されたアウトバウンド接続に関連する復路通信(レスポンス)は、自動的に許可されます。
VM AからVM BへのRDP接続(アウトバウンド)がNSGで許可されている場合、関連する復路通信(VM BからVM AへのSYN-ACKやデータパケット)は、VM AのNSGのインバウンドルールで明示的にブロックされていても、ステートフルなセッション管理によって許可されます。
このステートフルな動作により、VM AのNSGの「VM Bからのインバウンド通信をブロックする」ルールは、VM Aが開始したTCPセッションの復路通信には適用されません。
2.インバウンドブロックルールの適用範囲:
VM AのNSGのインバウンドブロックルールは、VM Bが新規に開始するインバウンド接続(例:VM BからVM Aへの新しいTCPセッション)に適用されます。
しかし、VM Aが開始したRDP接続に関連する復路通信は、「新規接続」ではなく「既存のセッションの応答」と見なされるため、ブロックルールの対象外となります。