何が出来るか
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つのパケットを選択して使用します。
その他設定
実行
rootではない環境ではsudoで実行する必要があります。
Macの場合はdオプションでインターフェースを指定しないとエラーになります
cオプションで通話のみ表示されます。
コマンドラインオプション
レポジトリからインストールした際のTLSサポートについて
上に記載したオプションはyumでインストールした際のものですが、githubの公式サイトには以下オプションも有ります。
-k –keyfile: RSA private keyfile to decrypt captured packets
キーを指定すれば暗号化されたパケットの復号が出来るとの事ですが、レポジトリからインストールするとこのオプションは使えません。
TLSをサポートする様にコンパイルされていない様です。
それでTLSをサポートするにはTLSを有効にしてソースからインストールする必要が有ります。
TLSサポート有りでソースからコンパイルする
公式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 しっかり習得するにはこちら↓