一、什么是sngrep?
sngrep 是专门用于 SIP 信令抓包和分析 的终端工具,比 tcpdump 更直观,特别适合调试 VoIP、FreeSWITCH、Asterisk、Kamailio 等 SIP 系统
简单来说:就是当你拨打 VoIP 电话时,电话的信令(比如谁打电话、谁接电话、如何建立连接、如何挂断等)就是通过 SIP 协议来管理的。
二、sngrep的呼叫流程:
INVITE → 呼叫发起
↓
100 Trying → 服务器收到请求
↓
180 Ringing → 对方在响铃
↓
200 OK → 对方接听
↓
ACK → 确认接听,建立通话
↓
BYE → 挂断通话
三、常见SIP错误状态码:
|-------------|---------------------------------|------------------------|
| 错误码 | 含义 | 可能原因 |
| 403 | Forbidden(禁止访问) | 认证失败、权限不足 |
| 404 | Not Found(未找到) | 目标号码不存在、号码格式错误、目标设备未注册 |
| 480 | Temporarily Unavailable(暂时无法使用) | 目标设备忙、无法连接网络、设备离线 |
| 486 | Busy Here(目标忙线) | 目标设备正在通话中 |
403:检查账号和密码是否正确,确保用户有权限拨打此号码。
404:确认目标号码是否正确,确保该号码已在服务器上注册并存在。
480:目标设备可能忙线或不可达,检查目标设备的状态。
486:目标设备正在通话中,稍后再拨。
四、安装sngrep
在 Debian 或 Ubuntu 系统上安装sngrep
命令:
apt update
apt install sngrep
五、常用的命令
1.在默认网卡上抓所有 SIP 包
sngrep
2.抓指定端口(SIP 5060)
sngrep udp port 5060
3.抓 UDP 的 SIP(常用)
sngrep udp port 5060
4.抓某个网卡
sngrep -d ens33
5.抓 RTP(语音流)
sngrep 默认不显示 RTP,但可以显示呼叫的 RTP 信息。
sngrep -d any port 5060 or portrange 10000-20000
(FreeSWITCH 的 RTP 默认是 16384--32768)
6.保存为 pcap 供 Wireshark 分析
sngrep -O sip.pcap
三、常用的过滤方式
1.基于IP地址过滤
源 IP 地址过滤:
sngrep src host <IP 地址>
目标 IP 地址过滤:
sngrep dst host <IP 地址>
某一 IP 地址过滤:
sngrep host <IP 地址>
- 基于端口过滤
源端口过滤:
sngrep src port <端口号>
目标端口过滤:
sngrep dst port <端口号>
某一端口过滤:
sngrep port <端口号>
- 基于协议过滤
SIP 消息过滤:
sngrep -d sip
- 基于请求类型过滤
可以根据 SIP 请求的类型来过滤消息
过滤 INVITE 请求:
sngrep 'INVITE'
过滤 BYE 请求:
sngrep 'BYE'
过滤 REGISTER 请求:
sngrep 'REGISTER'
- 基于状态码过滤
过滤 200 OK 响应:
sngrep '200 OK'
过滤 404 Not Found 响应:
sngrep '404'
- 时间范围过滤
通过指定时间范围来查看特定时间段内的 SIP 流量
sngrep -t '2025-11-27 08:00:00' -T '2025-11-27 09:00:00'
- 基于会话过滤
过滤某个会话(会话 ID):
sngrep -s <会话ID>
- 其他常用过滤选项
过滤某个特定用户代理:
sngrep 'User-Agent: <某个代理>'
- 组合过滤
结合多个过滤条件来进一步缩小显示的范围,如:
过滤某个 IP 地址和特定请求类型:
sngrep host <IP 地址> 'INVITE'