sngrep Linuxターミナルで動くSIPパケット解析ツール

何が出来るか

sngrepはLinuxターミナルで動作するSIP(Session Initiation Protocol)デバッグツールです。
https://github.com/irontec/sngrep/wiki

公式サイトには以下の様に説明されています。

・Capture SIP packets from devices or read from PCAP file
・Supports UDP, TCP and TLS (partially) transports
・Allows filtering using BPF (Berkeley Packet Filter)
・Save captured packets to PCAP file

  • パケットキャプチャ: デバイス(NIC)からとPCAPファイルから
  • UDP, TCP, TLS(一部)に対応
  • BPFによるフィルタリング
  • PCAPファイルへのキャプチャの保存

インストール

以下のバイナリが提供されています。

  • Debian / Ubuntu
  • CentOS / RedHat / Fedora
  • Alpine Linux
  • Gentoo
  • Arch
  • OSX
  • OpenWRT/LEDE

例えばCentOSであればFedora Copr (Cool Other Package Repo) リポジトリを利用してyumでインストール出来ます。
Macの場合はHomebrewでインストールします。
ソースからインストールも可能です。

何が凄いのか

通常、VoIPエンジニアがLinuxでSIPパケットを解析しようとする場合、SIPサーバーのログを見るかパケットキャプチャを録ってWiresharkで確認するのが一般的です。

そこまでしなくてもちょっとパケットを確認したい時は有ります。
またテストを繰り返す際に、毎回キャプチャファイルをサーバーからダウンロードしてWiresharkで開くもの手間です。

sngrepを使うとLinuxターミナル上で通話一覧やSIPフローやRTP, SIPのrawデータなどをリアルタイムで確認出来ます。
フィルタ機能も有りSIPパケットを絞り込んで表示する事が可能です。

Call List Window

sngrepを起動すると初めに表示される画面です。
全てのSIPパケットが一覧で表示されます。
通話だけを表示したり、フィルタを使って特定のIPからのパケットだけを表示させる事も可能です。
矢印キー上下でパケットを選択します。

フィルタ機能

アドレスで一覧に表示するパケットを絞り込めます。
SIPメソッドを選択して表示する事も可能です。

表示項目選択

Call List Windowに表示する項目を選択します。

Call Flow Window

Call List Windowでパケットを選択してエンターキーを押すと表示される画面です。
これが有るのでsngrepを使うと言っても過言ではありません。

左側にSIPフロー、右側にSIPヘッダーとSDPの情報が項目毎に表示されます。
矢印キー上下でリクエストかレスポンスを選択します。
キャプチャの様に2つのパケットを同時に表示する事も可能です。
RTPやDTMFも表示する事も可能です。

Call Raw window

Call Flow Windowでエンターキーを押すと選択されたリクエストかレスポンスのRawデータが表示されます。

Message diff window

2つのパケットを比較します。
Call Flow Windowでスペースキーを使って2つのパケットを選択して使用します。

その他設定

実行

sudo sngrep

rootではない環境ではsudoで実行する必要があります。

sngrep
Couldn’t activate capture: socket: Operation not permitted
sngrep -d en0

Macの場合はdオプションでインターフェースを指定しないとエラーになります

sudo sngrep -c

cオプションで通話のみ表示されます。

コマンドラインオプション

sngrep -h
Usage: sngrep [-hVcivNqrD] [-IO pcap_dump] [-d dev] [-l limit] [-LH capture_url] [] []
-h --help  This usage
-V --version  Version information
-d --device  Use this capture device instead of default
-I --input  Read captured data from pcap file
-O --output  Write captured data to pcap file
-c --calls  Only display dialogs starting with INVITE
-r --rtp  Capture RTP packets payload
-l --limit  Set capture limit to N dialogs
-i --icase  Make  case insensitive
-v --invert  Invert
-N --no-interface  Don’t display sngrep interface, just capture
-q --quiet  Don’t print captured dialogs in no interface mode
-D --dump-config  Print active configuration settings and exit
-f --config  Read configuration from file
-F --no-config  Do not read configuration from default config file
-R --rotate  Rotate calls when capture limit have been reached
-H --eep-send  Homer sipcapture url (udp:X.X.X.X:XXXX)
-L --eep-listen  Listen for encapsulated packets (udp:X.X.X.X:XXXX)

レポジトリからインストールした際のTLSサポートについて

上に記載したオプションはyumでインストールした際のものですが、githubの公式サイトには以下オプションも有ります。

-k –keyfile: RSA private keyfile to decrypt captured packets

キーを指定すれば暗号化されたパケットの復号が出来るとの事ですが、レポジトリからインストールするとこのオプションは使えません。
TLSをサポートする様にコンパイルされていない様です。
それでTLSをサポートするにはTLSを有効にしてソースからインストールする必要が有ります。

sudo sngrep -k key.pem
sngrep is not compiled with SSL support.

TLSサポート有りでソースからコンパイルする

./bootstrap.sh
./configure --with-openssl
make
make install (as root)

公式WkiにはTLS (partially) 限定的と有る様に全てのTLSが見える訳ではない様です。
同じTLS v1.2を使っているSoftPhoneでもJistiではSIPが見えてZoiperでは見えなかったりします。
GitのissueによるとTLS属性が異なるのではとの記載が有ります。

via: SIP/2.0/TLS
Contact: transport=tls

WiresharkでSIP/TLSを復号する方法はこちら↓

Linux CLIからSIPサーバーとの疎通を確認するツールsipsakはこちら↓

まとめ

VoIPエンジニアというニッチな世界ではありますが、とても便利なツールです。
LinuxでSIPサーバーを運用しているエンジニアには是非使ってほしいと思います。
実際、sngrepがないと仕事になりません。

記録に残すにはパケットキャプチャを録る必要が有りますが、確認には非常に有用なツールです。
(sngrepからpcapファイルへの保存が出来ます。pacpをsngrepに読み込ませる事も可能です)
WiresharkのCUI版でtsharkが有りますがSIPフローを見る事は出来ません。
sngrepはSIPに特化したツールと言えます。

何かと多機能なWireshark しっかり習得するにはこちら↓

TwitterFacebookLinkedInHatenaPocketCopy Link