1. ALG とは何か
ALG(Application Layer Gateway) は、ファイアウォールや NAT ルータの中で動作する、アプリケーション層プロトコルを理解してパケットの中身を書き換えたり制御したりする機能 です。
ALG の基本的な役割
アプリケーション層のペイロードを解析する(Layer 7)
ペイロード内の IP アドレスやポート番号を、NAT 後の値に書き換える
アプリケーションの制御情報に応じて、動的にポートを開閉する
セッションの状態を追跡し、タイムアウトやクローズのタイミングを制御する
2. ALG が必要になる理由
通常の TCP/UDP 通信であれば、L3/L4 のヘッダにある IP アドレス・ポート番号だけを NAT で変換すれば問題なく動作します。しかし、次のようなプロトコルでは ペイロード内に IP アドレスやポート番号が埋め込まれる ため、単純な NAT だけでは正常に動作しないことがあります。
FTP(PORT / PASV モード)
SIP(VoIP)
H.323
RTSP などのマルチメディア系プロトコル
例として 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 シグナリング (通常 UDP/TCP 5060、TLS であれば 5061 など)
RTP/RTCP メディア (実際の音声・映像を流す UDP ポート。範囲は装置により異なる)
シグナリングは SIP メッセージ(INVITE, 200 OK, BYE など)として送受信され、その中に 通話のために使用するメディア IP / ポート情報 が含まれます。
3-2. SIP メッセージ内に埋め込まれる IP / ポート
SIP では次のようなヘッダや SDP に、端末自身の IP アドレスやポート番号が書き込まれます。
Via ヘッダ
Contact ヘッダ
SDP の c=(connection)、m=(media)行 など
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 は、以下のような情報を解析・書き換えます。
Via / Contact ヘッダ内の IP アドレス・ポート
SDP の c= 行(メディア用 IP アドレス)
SDP の m= 行(RTP などのメディアポート番号)
例えば、内部端末からの 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 ポートをファイアウォールで動的に開放します。
SIP メッセージを検査し、RTP 用ポート番号を抜き出す
そのポートに対し、一時的に「外からの inbound UDP」を許可する
通話終了(BYE など)やタイムアウトで、開放したポートをクローズする
4-3. セッションの状態管理
SIP ALG は、REGISTER / INVITE / ACK / BYE といったシグナリングを追跡し、以下のような状態管理も行うことがあります。
どのクライアントがどの SIP アカウントで登録されているか
どの通話がアクティブで、どのポートがその通話に紐づいているか
タイムアウトや異常終了時のリソース解放
4-4. SDP でネゴシエーションされたメディア用ポートの動的開放
よく聞かれるポイントとして、「SIP ALG は SDP でネゴシエーションされたメディア用ポート(RTP/RTCP)も動的に空けてくれるのか?」 があります。
結論から言うと、はい、SIP ALG は SDP に記載された m=audio / m=video のポートを解析し、そのポートに対するピンホール(動的ポート開放)を行います。
典型的な流れは以下のようになります。
端末から SIP INVITE が送出され、その中の SDP に m=audio 40000 などのメディアポートが含まれる。
SIP ALG が SDP を解析し、内部 IP とポート(例:192.168.10.10:40000)を把握する。
NAT 後に使用するグローバル側ポート(例:203.0.113.10:52000)を割り当て、SDP 内の IP/ポートを書き換える。
同時に、ファイアウォール内部で「203.0.113.10:52000 → 192.168.10.10:40000」に対応する UDP ピンホールを動的に作成する。
通話終了(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 の中核機能のひとつです。ただし、次のような場合にはうまく働かない/逆効果になることがあります。
端末やクラウド PBX が STUN/TURN/ICE を利用して自分で NAT 越えを最適化している場合
SIP/SDP が TLS で暗号化されており、ALG が中身を読めない場合
ベンダ独自拡張やフォーマット差異により、ALG が SDP を正しく解釈できない場合
そのため、「ALG によるメディアポートの動的開放」が本来の狙いではあるものの、現代の STUN/TURN/ICE ベースの環境では、ALG が書き換えた結果としてむしろ片通話や無音などの障害を引き起こすケースも多く、実務では無効化が推奨されることが多い 、という点が重要です。
5. SIP ALG のメリット
適切に動作している場合、SIP ALG には以下のようなメリットがあります。
端末側が STUN/TURN/ICE 非対応でも、NAT 越えが可能になる
ファイアウォールの静的ポート開放設定を最小限にできる
NAT 装置が SIP セッションを把握しているため、セキュリティ的な制御もしやすい
特に、古い IP Phone や宅内小型ルータ配下の単純な構成では、SIP ALG によって「何も設定していないが通話ができている」ように見えるケースもあります。
6. SIP ALG が引き起こすトラブル
しかし実務では、SIP ALG が原因で VoIP が正常に動作しない ケースの方が多く、ベンダやサービスプロバイダからも「SIP ALG を無効化してください」と案内されることがよくあります。
6-1. よくあるトラブル例
電話機は登録(REGISTER)は成功するが、発着信が不安定
発信はできるが、着信ができない / 着信がワン切れになる
通話は成立するが、音声が片方向しか聞こえない(one-way audio)
音声は聞こえるが、映像だけ映らない、またはその逆
時間が経つと急に通話が切れる(セッションタイムアウトや ALG の誤動作)
SIP ALG が SIP/SDP を「賢く直しているつもり」で書き換える結果、端末側の NAT 対応機能(STUN/TURN/ICE)と競合 し、却って通信を壊してしまうことが多いです。
6-2. SIP over TLS / SRTP との相性
SIP や SDP が TLS で暗号化されている場合、ALG は中身を解読できません。その結果:
パケットの中身が見えないため、ALG として何もできない
一部の装置では、暗号化されている SIP を「不正な SIP」とみなしてブロックする
現代のセキュアな VoIP(SIP over TLS + SRTP)との相性は悪く、ALG 自体が前提としていた「平文の SIP/SDP を見て書き換える」というモデルと噛み合わなくなってきています。
7. 実務での扱い方(ベストプラクティス)
現代の IP 電話端末やソフトフォンは、ほとんどが以下のような NAT Traversal 機能を持っています。
STUN(Session Traversal Utilities for NAT)
TURN(Traversal Using Relays around NAT)
ICE(Interactive Connectivity Establishment)
これらの技術がある前提の設計では、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 を無効化します。
UTM/ルータの GUI で「SIP ALG」「SIP Helper」「VoIP ALG」などのチェックボックスを OFF
CLI で no alg sip 、no ip nat service sip などのコマンド
9. まとめ
ALG は、アプリケーション層プロトコルを理解してペイロードを書き換える機能で、NAT 越えに必要な場合がある。
SIP ALG は、SIP/SDP 内の IP・ポートを書き換えたり、RTP ポートを動的に開放したりするために利用される。
特に SDP の m=audio / m=video でネゴシエーションされたメディア用ポートについて、SIP ALG はその情報を解析し、メディア用 UDP ポートのピンホールを動的に開放する 。
古い端末やシンプルな構成では有効に働くこともあるが、現代の VoIP(STUN/TURN/ICE や SIP over TLS)とは相性が悪く、トラブルの原因になりやすい。
実務では、まず SIP ALG を無効化し、端末やクラウド側の NAT Traversal 機能に任せる 方針が一般的。
Cisco ASA では no inspect sip を設定することで SIP ALG を無効化できる。
環境ごとに挙動が異なるため、VoIP のトラブルシュートでは「途中経路のどこかで SIP ALG が動いていないか?」を必ず疑うとよいです。
本ページをそのまま .html ファイルとして保存し、ブラウザで開くことで閲覧用ドキュメントとして利用できます。