一、引言
SIP(会话初始协议)在现代通信领域,尤其是VoIP(网络电话)中起着至关重要的作用。抓包分析SIP信令可以帮助我们理解通信流程、排查故障以及进行性能优化。本文将详细介绍在Windows和Linux系统下抓包分析SIP信令的方法,即使是刚入行的新手也能轻松上手。
二、Windows系统下使用Wireshark抓包
2.1 打开Wireshark并选择抓包接口
如果你使用的是Windows系统,首先打开Wireshark抓包软件。由于本文示例是本地启动的SIP信令服务器,所以选择“Adapter for loopback traffic capture”(本地环回网络)。双击该选项后,Wireshark会直接开始抓包,但此时显示的信息会非常繁杂,因为它会捕获本地网络的所有信息。
2.2 使用过滤语法筛选流量
在Wireshark中,可以通过过滤语法(Display Filters)来筛选SIP协议流量和特定IP/端口的流量。以下是具体的筛选方法和示例:
2.2.1 筛选SIP协议流量
- 筛选所有SIP协议流量:在过滤框中输入
sip
,Wireshark会显示所有SIP协议(会话初始协议)的数据包,包括请求(如INVITE、REGISTER)和响应(如200 OK)。 - 筛选特定SIP方法
- 筛选INVITE请求:输入
sip.Method == "INVITE"
。 - 筛选REGISTER请求:输入
sip.Method == "REGISTER"
。 - 筛选响应码(如200 OK):输入
sip.Status-Code == 200
。
- 筛选INVITE请求:输入
- 筛选SIP消息头字段
- 筛选包含特定Call-ID的SIP消息:输入
sip.Call-ID contains "abcdef12345"
。 - 筛选From或To字段中的用户:输入
sip.from.user contains "alice" || sip.to.user contains "bob"
。
- 筛选包含特定Call-ID的SIP消息:输入
2.2.2 筛选IP地址和端口
- 筛选特定IP地址
- 筛选源或目标IP为192.168.1.100的流量:输入
ip.addr == 192.168.1.100
。 - 筛选源IP为10.0.0.1的流量:输入
ip.src == 10.0.0.1
。
- 筛选源或目标IP为192.168.1.100的流量:输入
- 筛选特定端口
- 筛选SIP默认端口(5060)的流量:输入
tcp.port == 5060 || udp.port == 5060
。 - 筛选源端口为5060的流量:输入
tcp.srcport == 5060 || udp.srcport == 5060
。
- 筛选SIP默认端口(5060)的流量:输入
2.2.3 组合筛选条件
- 筛选特定IP的SIP流量:输入
sip && ip.addr == 192.168.1.100
。 - 筛选特定端口上的SIP方法(如5060端口的INVITE请求):输入
sip.Method == "INVITE" && (tcp.port == 5060 || udp.port == 5060)
。 - 筛选某个用户(From字段)的SIP注册请求:输入
sip.Method == "REGISTER" && sip.from.user == "alice@domain.com"
。
2.3 高级技巧
- 快速定位SIP会话流:右键点击SIP数据包,选择“Follow → UDP Stream”(或TCP Stream),即可查看完整的会话。
- 保存过滤结果:筛选完成后,按
Ctrl + S
保存过滤后的数据包(仅显示部分)。 - 捕获时预过滤:在捕获前设置过滤条件(Capture Filters),例如输入
host 192.168.1.100 and (port 5060 or sip)
。
2.4 常见问题及解决方法
- 为什么筛选不到SIP流量? 确认数据包是否包含SIP协议,可能使用了非标准端口,如5061。使用
sip
过滤后,检查是否有数据包显示为SIP/SDP。 - 如何区分TCP和UDP的SIP流量? 添加协议类型过滤,输入
sip && tcp
筛选TCP承载的SIP流量,输入sip && udp
筛选UDP承载的SIP流量。 - 筛选条件不生效? 检查语法是否正确,Wireshark的过滤语法区分大小写,例如是
ip.addr
而非IP.Addr
。
2.5 查看SIP信令信息
筛选出SIP信令和本地设备的IP,并配置好设备的GB28181平台信息后,就能抓包到所有与设备交互的SIP信令。如果要查看具体的SIP信令信息,右下角有完整的协议信息可以查看,包括交互的网址和端口,以及指令消息,以下是一次完整的国标协议的设备注册指令。
三、Linux系统下抓包
3.1 使用tcpdump抓包
tcpdump
是一个轻量高效的命令行抓包工具,适合快速排查问题。
3.1.1 安装tcpdump
在Ubuntu系统上,可以使用以下命令安装:
sudo apt install tcpdump
3.1.2 示例命令
- 抓取指定IP的ICMP流量:假设
enp3s0
是网卡名称,使用以下命令抓取指定IP的ICMP流量:
sudo tcpdump -i enp3s0 host 192.168.1.100 and icmp
- 保存到文件并限制抓包时间:使用以下命令将抓包结果保存到文件
capture.pcap
中,并限制抓包时间为60秒:
sudo tcpdump -i enp3s0 -w capture.pcap -G 60
保存后的文件可以拷贝到Windows系统上,使用Wireshark打开进行分析。
3.2 使用sngrep抓包分析
sngrep
是一款专为SIP(Session Initiation Protocol)协议设计的命令行网络抓包与分析工具,主要针对VoIP(如电话、视频通话)流量进行实时捕获、过滤和可视化。
3.2.1 核心功能
- 实时捕获与过滤:支持从网卡实时抓包,或读取已有的
.pcap
文件。可以按SIP方法(如INVITE、BYE)、IP、端口等条件过滤流量。 - 会话流可视化:将SIP消息按会话(Call-ID)分组,显示完整的呼叫流程(如注册、呼叫建立、终止),类似Wireshark的 “Follow Stream” 功能,但更专注于SIP交互。
- 关键字高亮与搜索:高亮关键字段(如状态码200 OK、487 Request Terminated),支持正则表达式搜索特定内容(如用户名、电话号码)。
- 统计与报告:生成SIP事务统计(如请求/响应数量、错误率)。
3.2.2 安装方法
在Ubuntu/Debian系统上,可以通过以下命令安装:
sudo apt update
sudo apt install sngrep
3.2.3 基础使用示例
- 实时捕获SIP流量
- 捕获所有SIP流量(默认网卡):使用命令
sngrep
。 - 指定网卡(如eth0):使用命令
sngrep -d eth0
。 - 过滤特定IP或端口:使用命令
sngrep host 192.168.1.100 and port 5060
。
- 捕获所有SIP流量(默认网卡):使用命令
- 读取已有抓包文件:使用命令
sngrep -I capture.pcap
。 - 界面操作
- 上下键:选择会话。
- 回车键:展开会话详情。
- /键:输入过滤表达式(如
sip.Method=INVITE
)。 - q键:退出。
3.2.4 常用命令行参数
参数 | 说明 |
---|---|
-d <网卡> | 指定捕获网卡(如eth0) |
-H | 隐藏SIP消息体(简化显示) |
-O <文件> | 将捕获结果保存为 .pcap 文件 |
-R <表达式> | 加载时过滤(如 sip.Method=REGISTER ) |
-n | 禁用自动滚动(适合长会话分析) |
3.2.5 典型应用场景
- VoIP故障排查:快速定位呼叫失败原因(如403 Forbidden权限问题、408 Timeout超时)。
- 监控SIP注册状态:检查终端设备(如IP电话)是否成功注册到SIP服务器。
- 分析SIP攻击:识别异常流量(如大量INVITE洪水攻击)。
- 调试SIP服务器配置:验证SIP路由规则、头域修改是否生效。
四、总结
通过本文的介绍,你已经学会了在Windows和Linux系统下使用Wireshark、tcpdump和sngrep抓包分析SIP信令协议的方法。无论是新手还是有经验的开发者,都可以利用这些工具深入了解SIP通信流程,解决实际问题。希望本文能对你有所帮助!