概要
このドキュメントでは TCP port 2000 を使った NAT 通信に失敗する場合の発生原因とソリューションについて解説します。
前提条件
要件
このドキュメントは、次の項目に関する知識があることが推奨されます。
使用するコンポーネント
このドキュメントは、NAT にて Skinny プロトコル変換をサポートしている IOS version 12.1(5)T 以降のソフトウェアを使用します。
表記法
ドキュメント表記の詳細は、『シスコ テクニカル ティップスの表記法』を参照してください。
障害内容
NAT を有効にしている際に TCP port 2000 を使った通信に対して NAT 変換が行われず、TCP connection の確立に失敗する。
解説と解決策
解説
TCP port 2000 は Cisco CallManager 環境において利用される Skinny Client Control Protocol(SCCP)にて使用されます。SCCP は一般的には Skinny(スキニー)プロトコルと称されます。
通常 NAT は Layer 3で動作し、送信元および宛先 IP アドレスを変換します。IP ペイロード内の Layer 4〜7の IP アドレスは変換しません。ただし、Application Layer Gateway(ALG)を有効にすることで、IP ペイロード内の IP アドレスを変換することができるようになります。
IOS version 12.1(5)T 以降の IOS では NAT にて Skinny プロトコルに対する ALG をサポートしており、本機能が有効の場合には TCP port 2000 のパケットを受信するとパケットを Skinny パケットとみなして ALG での処理を行います。たとえ Skinny パケット以外の TCP port 2000を使ったパケットを受信した場合でも、本機能が有効の場合には NAT ルータは受信パケットを Skinny パケットとして ALG での処理を行おうとします。しかし Skinny パケットとしての適切な処理ができないためパケットは NAT 変換されずに転送される場合があります。
IOS version 12.4(6)T 以降の IOS では Skinny プロトコルのフラグメントパケットの扱いに関する ALG の機能拡張がされており、Skinny プロトコル以外のプロトコルで TCP port 2000 を使った通信を行おうとすると NAT 変換が行われないという問題が顕著に発生します。
Skinny プロトコルに対する ALG 機能は、下記コマンドでサポートされます。
(no) ip nat service skinny tcp port port_number
本機能は、サポートバージョンの IOS version 12.1(5)T から IOS version 12.1(5)T6 までの IOS ではデフォルトで無効となっておりますが、IOS version 12.1(5)T7以降の IOS ではデフォルトで有効となっており、下記コマンドが設定されている状態となっておりますのでご注意ください。
ip nat service skinny tcp port 2000
解決策
解決策1
NAT を有効にしている際に Skinny プロトコル以外のプロトコルで TCP port 2000 を使用する場合には下記設定が必要となります。
no ip nat service skinny tcp port 2000
上記設定をすることにより、TCP port 2000 のパケットを通常の TCP パケットとして NAT 変換させることができるようになります。
解決策2
Skinny プロトコルで使用するポートを TCP port 2000 以外に設定することで TCP port 2000 のパケットを通常の TCP パケットとして NAT 変換させることができるようになります。
ip nat service skinny tcp port port_number
上記設定をすることにより、port_number で指定したポートを使用する TCP パケットは Skinny パケットとして扱われますのでご注意ください。Cisco CallManager 環境以外では Skinny プロトコルに対する ALG 機能を無効にされることをお奨めします。