searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

使用 Sngrep 进行 GB/T28181 信令分析

2023-06-26 06:52:18
480
0

1. 介绍一下 GB/T 28181

GB/T 28181是公共安全领域视频监控联网视频信息以及控制信令信息安全保护的一项技术要求,常用于安防领域,市面上大部分专业的安防监控设备都支持该规则接入纳管平台,其控制协议的本质是对 IETF RFC 3261 (SIP)IETF RFC 4566 (SDP) 等协议运用与扩充。

 

2. 为什么使用 Sngrep

我们常用 tcpdump 或者 wireshark 一类的工具做抓包分析,但对于某些以SIP为基础的会话协议而言,此类工具便略显低效率了 (你需要在一堆没有组织的报文中寻找你想要进行故障定位的会话)。而 sngrep 作为一款专门为 SIP 协议打造的开源抓包分析工具,它可以用非常直观的交互图来展示服务端与设备端的会话。它具有以下优点 :

  • 实时抓取,实时展示
  • 可打开常见的pcap等格式包,用于分析sip交互
  • 可以根据sip信令的字段设置过滤器
  • 抓取到的sip信令会自动关联到已知会话

当然它也有一些缺点,比如在特定条件下,抓取的包可能不完整,甚至有丢包情况发生,而且 sngrep 工具非常占用内存和 cpu避免长时间开启,因此建议与 tcpdump 等更强大、灵活的抓包工具配合使用。

3. Sngrep 安装/使用方法介绍

3.1 安装

参考github仓库: https://github.com/irontec/sngrep
仓库提供针对各种系统的 sngrep 安装方式,按步骤安装即可。

3.2 参数简介

调用方式: sngrep [-hVcivNqrD] [-IO pcap_dump] [-d dev] [-l limit] [-B buffer] [<match expression>] [<bpf filter>]

    -h --help            查看帮助

    -V --version         查看版本信息

    -d --device          指定网卡

    -I --input           从 pcap 文件中读取抓包内容

    -O --output          将抓包数据输出到 pcap 文件

    -B --buffer          设置 pcap 抓包缓存区大小,单位:MB (默认: 2 MB)

    -c --calls           只显示 INVITE 会话

    -r --rtp             抓取 RTP 负载

    -l --limit           设置抓包数量上限为 N 个会话

    -i --icase           设置匹配表达式为大小写敏感

    -v --invert          反向匹配

    -N --no-interface    无图形化界面模式,只进行抓包

    -q --quiet           在无图形化界面模式下,不输出抓取的会话

    -D --dump-config     转储当前配置文件后退出

    -f --config          从文件中读取配置文件

    -F --no-config       禁止从默认配置文件中读取配置

    -R --rotate          采用滚动抓取模式

3.3 常用命令

3.3.1 实时抓取,实时展示

  • 如果需要实时分析某网卡上全量的 Sip 包,可以采用以下方法:
# -d 参数后填写需要抓取的网卡,例如:
sudo ./sngrep -d bond0
  •  效果如下:

  • 此时可以选择想看的会话,并按下 回车键 进入查看详情,也可以使用 空格键 选取多个会话并回车,如此可以共同展示多个会话。

  • 该界面下可以按 09 调整页面布局,以展示完整的信息。如图为一个完整的邀请推流会话。

     

  • 如果需要对实时抓取的包进行保存,可以先用空格键选择想要保存的会话,再按 F2 键并填写文件名保存即可。

3.3.2 打开常见的pcap等格式包

  • 如果已经抓取了一个格式为pcap的包,可以使用以下命令打开。
# -I 参数后填写pcap的文件路径,例如:

sudo ./sngrep -I example.pcap
  • 如此便可打开先前使用 F2 保存的文件。该命令同样可以打开通过tcpdump所抓取的包。

3.3.3 根据sip信令的字段设置过滤器

  • 如果想抓取特定设备,如:11111111111321111111 的信令包,可以采用以下方法:
sudo ./sngrep -d bond0 11111111111321111111
  • 如果想抓取特定类型的报文,如:INVITE 的信令包,可以采用以下方法:
sudo ./sngrep -d bond0 INVITE
  • 当然也可以进入sngrep 抓包界面后再按F7进行筛选

3.4 GB/T 28181 设备接入常见故障

3.4.1 设备无响应

  • 如图,平台发送多次 INVITE 而设备均为正常响应,考虑设备卡死,或者断网问题。

3.4.2 设备返回 404 错误

  • 如图,平台在下发 INVITE 后设备返回 404 错误,大概率是设备未配置正确的通道ID或者该通道确实离线。
  • 使用 sngrep 也可方便的看到设备附加的 Warning 信息:399 devnull "<282>[Component]Channel not online"

3.4.3 设备返回 486 错误

  • 如图,频繁拉流或者同时拉去多路流,有时会导致设备负载超出上限,这是设备会返回 486 错误。

3.4.4 设备主动 Bye

  • 如图,在取设备 TCP流 时, INVITE 200OK 后,设备经过很短的时间立刻发送了 Bye,该种情况可能是服务端 TCP 端口不通,或者设备对 TCP推流 支持不好,个别设备还存在主动推流端口(15060)和本地端口(15060)配置冲突而无法正常推流的情况。

3.4.5 设备SSRC异常

  • 如图,个别老旧设备可能存在不发 SSRC(y字段为空),或者 SSRC 永远为 0 的情况,该种情况需要纳管平台支持多端口才能正常加入,但是会存在冲突的可能,建议联系设备厂商升级固件。

 

END结束语

以上即为在设备装维过程中利用 sngrep 工具排查部分典型故障的实战示例,各位可以结合自己和项目需求再做探索,最后附上信令的常见报错及其释义,如果大家还遇到过什么奇葩的设备接入问题,也欢迎在评论区交流呀~

 


 

附录

(【GB28181-SIP 错误码以及代表的含义】转载自:https://blog.csdn.net/huoyahuoya/article/details/90371271)

1xx
100 Trying 说明caller正在呼叫,但还没联系上callee。
180 Ringing 说明callee已经被联系上,callee的铃正在响。收到这个信息后,等待200 OK 。
181 Call is being forwarded 说明call被重新路由到另外一个目的地
182 Queued 说明callee当前是不可获得的,但是对方不想直接拒绝呼叫,而是选择放在呼叫队列中
183 Session progress 用来警告caller频段(inband)错误。当从PSTN收到一个ISDN消息,SIP gateway 产生183 Session progress

2xx successful Responses
200 OK

3xx Redirection Responses
300 Multiple choices 说明呼叫的地址被解析成多个地址,所有的地址都被提供出来,用户或用户代理可以从中选择联系哪个。
301 Moved permanently 说明指定地址的用户已经永远不可用,在头中已经用另外一个地址替换了.
302 Moved temporarily 说明指定地址的用户临时不可用,在头中已经用另外一个地址代替了.
305 Use proxy 说明caller必须用一个proxy来联系callee.
380 Alternative service 说明call不成功,但是可选择其他的服务

4xx Request Failure Responses
400 Bad Request 说明由于非法格式,请求不能被理解。
401 Unauthorized 说明请求需要用户认证。
402 Payment required 说明完成会话需要付费.
403 Forbidden 说明server已经收到并能理解请求但不提供服务。
404 Not Found 说明server有明确的信息在指定的域中用户不存在.
405 Method Not Allowed 说明请求中指定的方法是不被允许的。将返回一个允许的方法列表。
406 Not Acceptable 说明被请求的资源只对某些特殊的请求作出响应,对目前头(header)中指定的请求不接受.
407 Proxy authentication required 和401 Unauthorized response相似.但是,它说明client必须首先在proxy上认证自己。
408 Request timeout 说明在timeout时间过期前,server不能产生响应.
409 Conflict 说明由于和当前资源状态产生冲突,请求不能被处理。
410 Gone 说明请求资源在server上永远不可用,也没有转发的地址。
411 Length required 说明用户拒绝接受没有定义content长度的请求。
413 Request entity too large 说明server拒绝处理请求,因为它太大,超过了server能处理的大小。
414 Request-URI too long 说明server拒绝处理请求,因为请求的URI太长,server不能解释它。
415 Unsupported media 说明server拒绝处理请求,因为body格式不被目的终端支持
420 Bad extension 说明server不能理解在header中指出的扩展协议。
480 Temporarily unavailable 说明callee已经被联系上,但是暂时不可用。
481 Call leg/transaction does not exist 说明server正在忽略请求,由于它是一个没有匹配legID的BYE或者是一个没有匹配事务的CANCEL。
482 Loop detected 说明server收到了一个包含它自己路径的请求.
483 Too many hops 说明server收到了一个请求,它需要的hop数超过了在header中允许的最大hop数.
484 Address incomplete 说明server收到一个地址不完整的请求.
485 Ambiguous 说明server收到一个请求,其中callee的地址是不明确的,也没有可能备用的地址供选择。
486 Busy here 说明callee已经被联系上,但是它们的系统不能承受额外的call.
488 暂时不能进行。

5xx Server Failure Responses
500 Server internal error 说明server或gateway发生意外错误从而不能处理请求.
501 Not implemented 说明server或gateway不支持完成请求所需的功能.
502 Bad gateway 说明server或gateway从下游server收到一个非法响应.
503 Service unavailable 说明由于超负载或维护问题,server或gateway不能处理请求.
504 Gateway timeout 说明server或gateway没有从另外一个server(如location server)收到一个及时的响应.
505 Version not supported 说明server或gateway不支持在请求中用到的SIP版本。

6xx Global Responses
600 Busy everywhere 说明callee已经被联系上,但是处于忙状态中,在这个时间不能接受call。
603 Decline 说明callee已经被联系上,但是不能或不想加入call。
604 Does not exist anywhere 说明server有正式的信息说明callee不存在于网络中。
606 Not acceptable 说明callee已经被联系上,但是session描述的某些方面不被接受。
0条评论
0 / 1000
InuaNG
4文章数
1粉丝数
InuaNG
4 文章 | 1 粉丝
原创

使用 Sngrep 进行 GB/T28181 信令分析

2023-06-26 06:52:18
480
0

1. 介绍一下 GB/T 28181

GB/T 28181是公共安全领域视频监控联网视频信息以及控制信令信息安全保护的一项技术要求,常用于安防领域,市面上大部分专业的安防监控设备都支持该规则接入纳管平台,其控制协议的本质是对 IETF RFC 3261 (SIP)IETF RFC 4566 (SDP) 等协议运用与扩充。

 

2. 为什么使用 Sngrep

我们常用 tcpdump 或者 wireshark 一类的工具做抓包分析,但对于某些以SIP为基础的会话协议而言,此类工具便略显低效率了 (你需要在一堆没有组织的报文中寻找你想要进行故障定位的会话)。而 sngrep 作为一款专门为 SIP 协议打造的开源抓包分析工具,它可以用非常直观的交互图来展示服务端与设备端的会话。它具有以下优点 :

  • 实时抓取,实时展示
  • 可打开常见的pcap等格式包,用于分析sip交互
  • 可以根据sip信令的字段设置过滤器
  • 抓取到的sip信令会自动关联到已知会话

当然它也有一些缺点,比如在特定条件下,抓取的包可能不完整,甚至有丢包情况发生,而且 sngrep 工具非常占用内存和 cpu避免长时间开启,因此建议与 tcpdump 等更强大、灵活的抓包工具配合使用。

3. Sngrep 安装/使用方法介绍

3.1 安装

参考github仓库: https://github.com/irontec/sngrep
仓库提供针对各种系统的 sngrep 安装方式,按步骤安装即可。

3.2 参数简介

调用方式: sngrep [-hVcivNqrD] [-IO pcap_dump] [-d dev] [-l limit] [-B buffer] [<match expression>] [<bpf filter>]

    -h --help            查看帮助

    -V --version         查看版本信息

    -d --device          指定网卡

    -I --input           从 pcap 文件中读取抓包内容

    -O --output          将抓包数据输出到 pcap 文件

    -B --buffer          设置 pcap 抓包缓存区大小,单位:MB (默认: 2 MB)

    -c --calls           只显示 INVITE 会话

    -r --rtp             抓取 RTP 负载

    -l --limit           设置抓包数量上限为 N 个会话

    -i --icase           设置匹配表达式为大小写敏感

    -v --invert          反向匹配

    -N --no-interface    无图形化界面模式,只进行抓包

    -q --quiet           在无图形化界面模式下,不输出抓取的会话

    -D --dump-config     转储当前配置文件后退出

    -f --config          从文件中读取配置文件

    -F --no-config       禁止从默认配置文件中读取配置

    -R --rotate          采用滚动抓取模式

3.3 常用命令

3.3.1 实时抓取,实时展示

  • 如果需要实时分析某网卡上全量的 Sip 包,可以采用以下方法:
# -d 参数后填写需要抓取的网卡,例如:
sudo ./sngrep -d bond0
  •  效果如下:

  • 此时可以选择想看的会话,并按下 回车键 进入查看详情,也可以使用 空格键 选取多个会话并回车,如此可以共同展示多个会话。

  • 该界面下可以按 09 调整页面布局,以展示完整的信息。如图为一个完整的邀请推流会话。

     

  • 如果需要对实时抓取的包进行保存,可以先用空格键选择想要保存的会话,再按 F2 键并填写文件名保存即可。

3.3.2 打开常见的pcap等格式包

  • 如果已经抓取了一个格式为pcap的包,可以使用以下命令打开。
# -I 参数后填写pcap的文件路径,例如:

sudo ./sngrep -I example.pcap
  • 如此便可打开先前使用 F2 保存的文件。该命令同样可以打开通过tcpdump所抓取的包。

3.3.3 根据sip信令的字段设置过滤器

  • 如果想抓取特定设备,如:11111111111321111111 的信令包,可以采用以下方法:
sudo ./sngrep -d bond0 11111111111321111111
  • 如果想抓取特定类型的报文,如:INVITE 的信令包,可以采用以下方法:
sudo ./sngrep -d bond0 INVITE
  • 当然也可以进入sngrep 抓包界面后再按F7进行筛选

3.4 GB/T 28181 设备接入常见故障

3.4.1 设备无响应

  • 如图,平台发送多次 INVITE 而设备均为正常响应,考虑设备卡死,或者断网问题。

3.4.2 设备返回 404 错误

  • 如图,平台在下发 INVITE 后设备返回 404 错误,大概率是设备未配置正确的通道ID或者该通道确实离线。
  • 使用 sngrep 也可方便的看到设备附加的 Warning 信息:399 devnull "<282>[Component]Channel not online"

3.4.3 设备返回 486 错误

  • 如图,频繁拉流或者同时拉去多路流,有时会导致设备负载超出上限,这是设备会返回 486 错误。

3.4.4 设备主动 Bye

  • 如图,在取设备 TCP流 时, INVITE 200OK 后,设备经过很短的时间立刻发送了 Bye,该种情况可能是服务端 TCP 端口不通,或者设备对 TCP推流 支持不好,个别设备还存在主动推流端口(15060)和本地端口(15060)配置冲突而无法正常推流的情况。

3.4.5 设备SSRC异常

  • 如图,个别老旧设备可能存在不发 SSRC(y字段为空),或者 SSRC 永远为 0 的情况,该种情况需要纳管平台支持多端口才能正常加入,但是会存在冲突的可能,建议联系设备厂商升级固件。

 

END结束语

以上即为在设备装维过程中利用 sngrep 工具排查部分典型故障的实战示例,各位可以结合自己和项目需求再做探索,最后附上信令的常见报错及其释义,如果大家还遇到过什么奇葩的设备接入问题,也欢迎在评论区交流呀~

 


 

附录

(【GB28181-SIP 错误码以及代表的含义】转载自:https://blog.csdn.net/huoyahuoya/article/details/90371271)

1xx
100 Trying 说明caller正在呼叫,但还没联系上callee。
180 Ringing 说明callee已经被联系上,callee的铃正在响。收到这个信息后,等待200 OK 。
181 Call is being forwarded 说明call被重新路由到另外一个目的地
182 Queued 说明callee当前是不可获得的,但是对方不想直接拒绝呼叫,而是选择放在呼叫队列中
183 Session progress 用来警告caller频段(inband)错误。当从PSTN收到一个ISDN消息,SIP gateway 产生183 Session progress

2xx successful Responses
200 OK

3xx Redirection Responses
300 Multiple choices 说明呼叫的地址被解析成多个地址,所有的地址都被提供出来,用户或用户代理可以从中选择联系哪个。
301 Moved permanently 说明指定地址的用户已经永远不可用,在头中已经用另外一个地址替换了.
302 Moved temporarily 说明指定地址的用户临时不可用,在头中已经用另外一个地址代替了.
305 Use proxy 说明caller必须用一个proxy来联系callee.
380 Alternative service 说明call不成功,但是可选择其他的服务

4xx Request Failure Responses
400 Bad Request 说明由于非法格式,请求不能被理解。
401 Unauthorized 说明请求需要用户认证。
402 Payment required 说明完成会话需要付费.
403 Forbidden 说明server已经收到并能理解请求但不提供服务。
404 Not Found 说明server有明确的信息在指定的域中用户不存在.
405 Method Not Allowed 说明请求中指定的方法是不被允许的。将返回一个允许的方法列表。
406 Not Acceptable 说明被请求的资源只对某些特殊的请求作出响应,对目前头(header)中指定的请求不接受.
407 Proxy authentication required 和401 Unauthorized response相似.但是,它说明client必须首先在proxy上认证自己。
408 Request timeout 说明在timeout时间过期前,server不能产生响应.
409 Conflict 说明由于和当前资源状态产生冲突,请求不能被处理。
410 Gone 说明请求资源在server上永远不可用,也没有转发的地址。
411 Length required 说明用户拒绝接受没有定义content长度的请求。
413 Request entity too large 说明server拒绝处理请求,因为它太大,超过了server能处理的大小。
414 Request-URI too long 说明server拒绝处理请求,因为请求的URI太长,server不能解释它。
415 Unsupported media 说明server拒绝处理请求,因为body格式不被目的终端支持
420 Bad extension 说明server不能理解在header中指出的扩展协议。
480 Temporarily unavailable 说明callee已经被联系上,但是暂时不可用。
481 Call leg/transaction does not exist 说明server正在忽略请求,由于它是一个没有匹配legID的BYE或者是一个没有匹配事务的CANCEL。
482 Loop detected 说明server收到了一个包含它自己路径的请求.
483 Too many hops 说明server收到了一个请求,它需要的hop数超过了在header中允许的最大hop数.
484 Address incomplete 说明server收到一个地址不完整的请求.
485 Ambiguous 说明server收到一个请求,其中callee的地址是不明确的,也没有可能备用的地址供选择。
486 Busy here 说明callee已经被联系上,但是它们的系统不能承受额外的call.
488 暂时不能进行。

5xx Server Failure Responses
500 Server internal error 说明server或gateway发生意外错误从而不能处理请求.
501 Not implemented 说明server或gateway不支持完成请求所需的功能.
502 Bad gateway 说明server或gateway从下游server收到一个非法响应.
503 Service unavailable 说明由于超负载或维护问题,server或gateway不能处理请求.
504 Gateway timeout 说明server或gateway没有从另外一个server(如location server)收到一个及时的响应.
505 Version not supported 说明server或gateway不支持在请求中用到的SIP版本。

6xx Global Responses
600 Busy everywhere 说明callee已经被联系上,但是处于忙状态中,在这个时间不能接受call。
603 Decline 说明callee已经被联系上,但是不能或不想加入call。
604 Does not exist anywhere 说明server有正式的信息说明callee不存在于网络中。
606 Not acceptable 说明callee已经被联系上,但是session描述的某些方面不被接受。
文章来自个人专栏
音视频后端技术
4 文章 | 1 订阅
0条评论
0 / 1000
请输入你的评论
0
0