# sngrep简介
`sngrep`是一种开源的网络抓包和分析工具,用于监控和分析实时的`SIP`和`RTP`通信。它可以捕获和显示`SIP`消息和`RTP`流量的详细信息,帮助网络管理员和开发人员诊断和解决`VoIP`通信问题。`sngrep`提供了强大的过滤和搜索功能,使用户能够快速定位和分析特定的通信流。
在`CentOS 7`系统上安装:
```shell
yum install https://packages.irontec.com/centos/7/x86_64/sngrep-1.4.9-0.el7.x86_64.rpm
```
在`Debian`系统上安装:
```shell
apt install sngrep
```
`Debian 11`如果想安装较新的版本,可以这样做:
```shell
wget http://packages.irontec.com/public.key -q -O - | apt-key add -
echo 'deb http://packages.irontec.com/debian bullseye main extra' > /etc/apt/sources.list.d/irontec.list
apt update
apt install sngrep
```
`sngrep`常用的命令行参数如下:
- `-r` 捕获`RTP`流
- `-c` 只捕获以`INVITE`开始的对话,这个功能很实用
- `-O` 把捕获到的数据写到`pcap`文件
- `-l` 限制捕获到的最大对话数,比如`-l 100`,捕获到100个对话后不再捕获新对话(如果不设置自动轮转)
- `-R` 达到最大对话数自动轮转,比如`-l 100 -R`
试试下面这个组合是否实用:
```shell
timeout 1m sngrep -c -l 100 -O /tmp/dump.pcap
```
`timeout 1m`就是1分钟后自动结束`sngrep`,只捕获100个以`INVITE`开始的对话,文件保存到`/tmp/dump.pcap`。
启动`sngrep`,主界面如下:
```
Current Mode: Online [any] Dialogs: 1
Match Expression: BPF Filter:
Display Filter:
^Idx Method SIP From SIP To Msgs Source Destination Call State
[ ] 1 REGISTER xxxxx@xxxxxxxxxxxxx xxxxx@xxxxxxxxxxxxx 12 xxxxxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxxx
Esc Quit Enter Show Space Select F1 Help F2 Save F3 Search F4 Extended F5 Clear F7 Filter F8 Settings F9 Clear with Filter F10 Columns
```
中间一大块区域显示捕获到的`SIP`消息,一行就是一个对话(Dialog),按方向键可以上下移动,按回车键或者按[F4]进入另外一个界面,显示当前对话的呼叫流程。
底部是快捷键提示:
- `ESC` 退出
- `回车` 显示当前对话
- `空格` 选择
- `[F1]` 帮助
- `[F2]` 保存为`pcap`
- `[F3]` 查找
- `[F4]` 扩展,就是扩展当前对话
- `[F5]` 清空所有捕获到的对话
- `[F7]` 过滤,比如我们只关心`INVITE`,不关心其它`SIP`方法,那么在过滤时只选择`INVITE`就行
- `[F8]` 设置
- `[F9]` 清空之前设置的过滤条件
- `[F10]`配置哪些列要显示,哪些列不显示。配置可以保存起来,方便下次继续使用
- `p` 暂停捕获,再按一次`p`则继续捕获
我们知道,`FreeSWITCH`是`B2BUA Server`,典型的呼叫流程是收到`INVITE`之后`bridge`到某个`sip`地址,`sngrep`捕获到这二个`sip`对话之后,按空格键选择第一个对话,再移动到另外一个对话,接着按下`[F4]`,这样就可以把两个对话(FreeSWITCH叫两条腿)放到一起分析,对定位问题就非常有帮助了,比如是哪边先发`SIP BYE`。
再比方用户`sip`注册到`FreeSWITCH`跟`FreeSWITCH`呼叫该用户是有关联的,如果`FreeSWITCH`呼叫用户但用户不振铃,我们在`sngrep`找到`REGISTER`和`INVITE`这二个对话,把它们关联到一起查看,查找问题就容易很多。
有时候`FreeSWITCH`跟网关的对接可能碰到问题,这种场合下`sngrep`就可以大显身手,其最大的好处是抓包跟查看融为一体,所见即所得。一般可以先看呼叫流程,比如有没有鉴权,有没有回应,如果有回应而且状态码为`4xx`(或者`5xx`、`6xx`),那么需要重点关注`INVITE`包。如果有30秒自动挂机的问题,要关注`Contact`头等等。
此外,`~/.sngreprc`是配置文件,这里是一个例子:
```
set filter.methods REGISTER,INVITE
```