モバイルネットワークでは各ノードが様々なインターフェース上でメッセージをやり取りしながらサブスクライバーを管理しています。本ドキュメントでは、PGW を中心にして特定のサブスクライバーのセッションをキャプチャーからトレースする方法を説明します。
PGW のインターフェース
PGW 周辺のインターフェースは通常以下のようになっています。それぞれのインターフェースでトラッキングする方法を見ていきます。SGi は通常の IP ネットワークですので除外します。
S5 インターフェース(GTP)
SGW とのインターフェースは GTP というプロトコルが使用されています。新規にサブスクライバーからセッションが確立される場合は、Create Session Request というメッセージが SGW から送信されますので、この中からまずはサブスクライバーの識別子である IMSI を確認します。
この IMSI に紐づくパケットをトレースしていくわけですが、GTP では TEID(Tunnel Endpoint IDentifier) という識別子を使用して各セッションを認識していますので、この IMSI に紐づく TEID を確認します。TEID は Unidirection なので SGW/PGW で別で管理していますので、それぞれ確認する必要があります。
まず SGW 側は、Create Session Request に含まれるF-TEID で確認できます。ちなみに、こちらはコントロールプレーンである GTP-C の TEID になり、データプレーンである GTP-U の TEID は Create Session Request の Bearer Context IE 内にありますが、本ドキュメントではコントロールプレーンにフォーカスしていますので割愛します。
また、PGW 側は Create Session Response に含まれている F-TEID で確認できます。Create Session Response には IMSI が含まれていませんので、先ほど確認した SGW の TEID と一致するパケットを確認する必要があります。
これで S5/GTP に関してはトラックすることができます。Wireshark のフィルターであらわすと以下になります。
gtpv2.imsi==123456123456789||gtpv2.teid==1||gtpv2.teid==2147483649
Radius
Radius の場合は、Access-Request に IMSI やユーザ名などの識別子が含まれるはずですので、それを元に確認ができます。以下の例では IMSI を確認しています。
Accounting-Request も同様です。
Radius のレスポンスメッセージに関しては、Identifier で識別可能なのですが、通常 255 で Wraparound してしまうためキャプチャー内で重複する可能性が高いです。ですので、フィルターしても関係ないパケットも含まれる可能性がありますので注意が必要です。
以上をふまえて、Radius に関しては以下のようなフィルターになります。
radius.3GPP_IMSI==123456123456789||radius.id==55
Gx インターフェース(Diameter)
PCRF との Gx インターフェースでは主に Diameter プロトコルが使用されます。通常 Initial Request に IMSI が含まれますので、そのパケットから Diameter Session-ID を抜き出すことでトレースが可能です。
まず、対象の IMSI を見つけます。
同じパケットに含まれる Session-ID を確認します。
これで以降の Gx のやり取りをトレースできます。Wireshark のフィルターであらわすと以下になります。
diameter.Session-Id == "gx.cisco.com;25020001;262;543c552c-602"
Gy インターフェース(Diameter)
Gy も Gx と同様です。Initial Request に IMSI が含まれているはずですのでそこから Session-ID を見つけます。
Wireshark のフィルターであらわすと以下になります。
diameter.Session-Id == "gy.cisco.com;25020001;518;543c552c-602"
まとめ
それぞれのキーをまとめると以下のとおりです。
全てのパケットが含まれたキャプチャーから特定 IMSI のサブスクライバーをトレースする Wireshark フィルタは以下になります。これは上述の例の場合ですので、もちろんフィルターする値は適宜変更してください。
gtpv2.imsi==123456123456789||gtpv2.teid==1||gtpv2.teid==2147483649||radius.3GPP_IMSI==123456123456789||radius.id==55||diameter.Session-Id=="gx.cisco.com;25020001;262;543c552c-602"||diameter.Session-Id=="gy.cisco.com;25020001;518;543c552c-602"