ALG(Application Layer Gateway)と SIP ALG の解説

本資料では、ファイアウォールや NAT 装置で利用される ALG(Application Layer Gateway) の役割と、特に VoIP でよく問題になる SIP ALG の動作・メリット・トラブル事例・無効化の考え方を整理します。

ALGSIPVoIPNAT Traversal

目次

1. ALG とは何か

ALG(Application Layer Gateway) は、ファイアウォールや NAT ルータの中で動作する、アプリケーション層プロトコルを理解してパケットの中身を書き換えたり制御したりする機能 です。

ALG の基本的な役割
  • アプリケーション層のペイロードを解析する(Layer 7)
  • ペイロード内の IP アドレスやポート番号を、NAT 後の値に書き換える
  • アプリケーションの制御情報に応じて、動的にポートを開閉する
  • セッションの状態を追跡し、タイムアウトやクローズのタイミングを制御する

2. ALG が必要になる理由

通常の TCP/UDP 通信であれば、L3/L4 のヘッダにある IP アドレス・ポート番号だけを NAT で変換すれば問題なく動作します。しかし、次のようなプロトコルでは ペイロード内に IP アドレスやポート番号が埋め込まれる ため、単純な NAT だけでは正常に動作しないことがあります。

例として FTP(アクティブモード)では、クライアントからサーバに送るコマンド内に「自分の IP アドレスとポート番号」が書かれます。NAT 装置がそこを書き換えないと、サーバ側は プライベート IP に対して接続しようとしてしまい失敗 します。

+-----------+ +-----------+ +-----------+ | Client | 192.168.1.10 NAT | Server | | (private) |-------------[ FW / Router ]---------| (public) | +-----------+ +-----------+ +-----------+ FTP PORT コマンド (例) PORT 192,168,1,10,195,80 ↑ NAT されないと、Server は 192.168.1.10:50000 に接続しようとして失敗

このようなケースに対応するため、NAT 装置がアプリケーションのペイロードを理解し、書き換えを行う機能として ALG が利用されます。

3. SIP と NAT 越えの課題

SIP(Session Initiation Protocol) は VoIP で利用されるシグナリングプロトコルで、通話の開始・終了・呼制御などを行います。

3-1. SIP 通信の構成

SIP を用いた VoIP 通信は、大きく以下の 2 つの要素で構成されます。

シグナリングは SIP メッセージ(INVITE, 200 OK, BYE など)として送受信され、その中に 通話のために使用するメディア IP / ポート情報 が含まれます。

3-2. SIP メッセージ内に埋め込まれる IP / ポート

SIP では次のようなヘッダや SDP に、端末自身の IP アドレスやポート番号が書き込まれます。

INVITE sip:alice@example.com SIP/2.0 Via: SIP/2.0/UDP 192.168.10.10:5060;branch=z9hG4bK-123456 Contact: <sip:1001@192.168.10.10:5060> ... v=0 o=- 3747 3747 IN IP4 192.168.10.10 s=- c=IN IP4 192.168.10.10 t=0 0 m=audio 40000 RTP/AVP 0 8 18

この例では、端末のプライベート IP 192.168.10.10 と、音声用のポート 40000 が SIP/SDP 内に書かれています。NAT 装置を通過するときに、これらが外側から正しく到達できる形に変換されないと、通話は確立しても音声が流れない・片通話になる、などの問題につながります。

NAT の外側から見ると、SIP サーバは 「SIP/SDP に書かれた IP に向けて RTP を送る」 ため、プライベート IP のままだと到達できません。

4. SIP ALG の動作

SIP ALG は、前述のような SIP / SDP 内の IP・ポート情報を理解し、必要に応じて NAT 後の IP・ポートに書き換える機能 です。また、それに合わせてファイアウォールの許可ルールや NAT テーブルも動的に操作します。

4-1. SIP メッセージの書き換え

SIP ALG は、以下のような情報を解析・書き換えます。

例えば、内部端末からの SIP INVITE を通過させる際に、次のような変換が行われます。

[変換前(内部端末 → FW 内部)] Contact: <sip:1001@192.168.10.10:5060> c=IN IP4 192.168.10.10 m=audio 40000 RTP/AVP 0 8 18 [変換後(FW 外部 → SIP サーバ行き)] Contact: <sip:1001@203.0.113.10:5060> c=IN IP4 203.0.113.10 m=audio 52000 RTP/AVP 0 8 18

ここでは、NAT 装置の外側 IP 203.0.113.10 と、変換された RTP ポート 52000 に書き換えています。

4-2. 動的なポート開放(ピンホール)

SIP ALG は、SDP の情報をもとに、メディア用の UDP ポートをファイアウォールで動的に開放します。

4-3. セッションの状態管理

SIP ALG は、REGISTER / INVITE / ACK / BYE といったシグナリングを追跡し、以下のような状態管理も行うことがあります。

4-4. SDP でネゴシエーションされたメディア用ポートの動的開放

よく聞かれるポイントとして、「SIP ALG は SDP でネゴシエーションされたメディア用ポート(RTP/RTCP)も動的に空けてくれるのか?」 があります。

結論から言うと、はい、SIP ALG は SDP に記載された m=audio / m=video のポートを解析し、そのポートに対するピンホール(動的ポート開放)を行います。

典型的な流れは以下のようになります。

  1. 端末から SIP INVITE が送出され、その中の SDP に m=audio 40000 などのメディアポートが含まれる。
  2. SIP ALG が SDP を解析し、内部 IP とポート(例:192.168.10.10:40000)を把握する。
  3. NAT 後に使用するグローバル側ポート(例:203.0.113.10:52000)を割り当て、SDP 内の IP/ポートを書き換える。
  4. 同時に、ファイアウォール内部で「203.0.113.10:52000 → 192.168.10.10:40000」に対応する UDP ピンホールを動的に作成する。
  5. 通話終了(BYE など)または一定時間無通信となった時点で、そのピンホールを削除する。
内部端末 FW / NAT (SIP ALG) SIPサーバ 192.168.10.10:40000 → 203.0.113.10:52000 → (RTP送信先として認識) 1. INVITE (SDP: 192.168.10.10:40000) 2. ALG が SDP を解析し書き換え → SDP: 203.0.113.10:52000 3. ALG が 203.0.113.10:52000 のピンホールを動的に開放 4. SIPサーバは 203.0.113.10:52000 宛てに RTP を送信 5. ALG が 192.168.10.10:40000 に転送

この「SDP をもとにメディア用ポートを開ける」動きこそが、SIP ALG の中核機能のひとつです。ただし、次のような場合にはうまく働かない/逆効果になることがあります。

そのため、「ALG によるメディアポートの動的開放」が本来の狙いではあるものの、現代の STUN/TURN/ICE ベースの環境では、ALG が書き換えた結果としてむしろ片通話や無音などの障害を引き起こすケースも多く、実務では無効化が推奨されることが多い、という点が重要です。

5. SIP ALG のメリット

適切に動作している場合、SIP ALG には以下のようなメリットがあります。

特に、古い IP Phone や宅内小型ルータ配下の単純な構成では、SIP ALG によって「何も設定していないが通話ができている」ように見えるケースもあります。

6. SIP ALG が引き起こすトラブル

しかし実務では、SIP ALG が原因で VoIP が正常に動作しない ケースの方が多く、ベンダやサービスプロバイダからも「SIP ALG を無効化してください」と案内されることがよくあります。

6-1. よくあるトラブル例

SIP ALG が SIP/SDP を「賢く直しているつもり」で書き換える結果、端末側の NAT 対応機能(STUN/TURN/ICE)と競合 し、却って通信を壊してしまうことが多いです。

6-2. SIP over TLS / SRTP との相性

SIP や SDP が TLS で暗号化されている場合、ALG は中身を解読できません。その結果:

現代のセキュアな VoIP(SIP over TLS + SRTP)との相性は悪く、ALG 自体が前提としていた「平文の SIP/SDP を見て書き換える」というモデルと噛み合わなくなってきています。

7. 実務での扱い方(ベストプラクティス)

現代の IP 電話端末やソフトフォンは、ほとんどが以下のような NAT Traversal 機能を持っています。

これらの技術がある前提の設計では、SIP ALG はむしろ邪魔になることが多く、原則として無効化が推奨 されることが一般的です。

実務上の基本方針(目安)
  • VoIP 利用時、まずはルータ/FW の SIP ALG を無効化して動作確認する
  • STUN/TURN/ICE に対応した端末・PBX・クラウドサービスを前提とする
  • どうしても ALG が必要な古い環境では、対象機器やトポロジを明確に限定する

多くのクラウド PBX / SIP トランク事業者のドキュメントにも、「ホームルータや UTM の SIP ALG を無効にしてください」という記述があるのは、このためです。

8. 設定例:Cisco ASA での SIP ALG 無効化

Cisco ASA では、inspect sip が SIP ALG に相当する機能です。デフォルトでは global_policy の中で有効になっていることが多く、これを無効化することで ALG を止めることができます。

8-1. SIP ALG(inspect sip)の無効化例

! 既存の global_policy を確認 show run policy-map ! SIP のインスペクションを無効化 conf t policy-map global_policy class inspection_default no inspect sip end write memory

上記のように no inspect sip を設定することで、ASA による SIP メッセージの書き換えや RTP ポートの動的開放が行われなくなります。

代わりに、クラウド側の SBC や PBX、エンドポイント側の STUN/TURN/ICE 機能に NAT 越えを任せる構成が一般的です。

8-2. その他装置の例(参考イメージ)

装置ごとに名称やコマンドは異なりますが、概ね以下のような設定で SIP ALG を無効化します。

9. まとめ

環境ごとに挙動が異なるため、VoIP のトラブルシュートでは「途中経路のどこかで SIP ALG が動いていないか?」を必ず疑うとよいです。