VM に Public IP がある場合: VM (NIC) に紐づいた Public IP で SNAT
VM に Public IP がなく、外部 LB に紐づいている場合: LB の Public IP で SNAT
VM に Public IP も外部 LB にも紐づいていない場合: 当該リージョンの任意の Public IP で SNAT
したがって、送信元 IP を固定したい (対向側の Firewall 等で IP 指定で許可設定をしたい) 場合には、前者 2 点のいずれかになります。
SNAT Port の割り当て
VM が Public IP を持たないシナリオの場合、個々の VM に割り当てられる SNAT Port の数に注意が必要です。
VM に Public IP がある場合: 64k Port
VM に Public IP がなく、外部 LB に紐づいている場合: 最大で 1024 Port
VM にも外部 LB にも紐づいていない場合: 1024 Port
1 つの Public IP では TCP / UDP それぞれ 64k Port しか使えませんので、外部 LB の Public IP を使用する (複数の VM で Public IP を共有する) 場合 は、1 台あたりに割り当てられる Port が 1024 までに限られる点に気を付けましょう。(なお、LB 配下の VM が 1 台だけであっても、1024 Port しか使えません) なお、LB のバックエンド プールが 50 台を超える場合には、割り当て Port がさらに少なくなります。(参考)
SNAT Port を使い果たした場合
LB の SNAT Port が使い果たした場合、当然ですが SNAT できないため Public IP 宛の通信ができなくなります。 Azure VM から Public IP あてに多数のセッションを張る場合や、Docker などのコンテナを利用するような場合は、1024 Port を早々に食いつぶす可能性もあるので、きちんと見積もりや設計を行いましょう。(Azure 基盤側としては、VM 上で何台コンテナが起動しているかは把握できないので、同一 VM 上で稼働するすべてのコンテナで 1024 Port を共有することになります。)
ちなみに、負荷テストや再現試験などで SNAT Port を意図的に枯渇させたい場合、Linux で hping3 を使うのがお手軽です。 例えば、以下のような形で実行することで、SYN パケットを100 マイクロ秒ごとに任意の Public IP (xx.xx.xx.xx) の 65000 番の Port に対して、ひたすら投げつけることができます。(一歩間違うと SYN Flood 攻撃になるので、やり方と通信先は慎重に検討しましょう。)
VM (NIC の ipconfig) あたり 1024 Port では足りないという場合、対処策は以下のいずれかになります。
VM に Public IP を直接紐づける
Standard SKU の外部 LB で allocatedOutboundPorts を設定して、SNAT Port の割り当てを変更する
後者の allocatedOutboundPorts は Basic SKU では使えず、Standard SKU でのみ提供される機能ですが、1 VM あたりに割り当てる SNAT Port を 10000 Port などと明示的に設定することが可能です。(もちろん、1 台当たりの Port × LB 配下の VM 台数が 64k に収まるように設計する必要があります。)
Azure VM で ICMP を扱う際には、 いくつか 気を付けないといけない点があります。 Azure をそこそこ使っている人でもハマることがあると思う (特に Azure VM から外部宛) ので、応答が得られない際のご参考までに。
Azure VM に対して ping, traceroute する場合 (Inbound)
NSG の受信許可設定が必要
Azure VM の NIC と Subnet に紐づいた NSG で、受信セキュリティ規則にて ICMP の許可設定を行っているかを確認しましょう。
OS 内の Firewall で受信許可設定が必要
NSG に加えて、当然ですが OS 内の Firewall でも ICMP を許可しましょう。 (特に Windows はデフォルトで不許可です)
LB 経由の ICMP は不可
Azure の Load Balancer は TCP / UDP の通信しか中継できません。 必ず VM の IP に対して直接 ping, traceroute を実行しましょう。
Azure VM から ping, traceroute する場合 (Outbound)
VM に直接 Public IP の付与が必要
Azure では、VM に Public IP を付与せずとも、外部 LB やデータセンターの任意の IP で SNAT して Internet 接続ができます。 ただ、LB は TCP / UDP の通信しか中継できないため、VM に直接 Public IP を紐付けていない構成では ICMP の応答が返りません。
traceroute には NSG で受信許可設定が必要
traceroute の通信は、宛先に指定した IP アドレス以外から応答が戻るため、NSG で ICMP がブロックされていると応答が戻りません。 (TTL が 0 になった時点で、経路上のルーターの IP アドレスから Time Exceeded の応答が返るためやむを得ません。)