一 tcpdump抓包命令
关于tcpdump的抓包命令,非常的多,这里我只记录我平时开发时比较常用的抓包命令,当然后面可能不断的在本篇补上对应的内容。
1 tcpdump的命令格式
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ][ -i 网络接口 ] [ -r 文件名]
[ -s snaplen ] [ -T 类型 ] [ -w 文件名 ] [表达式 ]
2 参数选项
参数 | 含义 |
-a | 将网络地址和广播地址转变成名字 |
-A | 以ASCII格式打印出所有分组,并将链路层的头最小化。 |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出 |
-dd | 将匹配信息包的代码以c语言程序段的格式给出 |
-ddd | 将匹配信息包的代码以十进制的形式给出 |
-e | 在输出行打印出数据链路层的头部信息,包括源mac和目的mac,以及网络层的协议 |
-f | 将外部的Internet地址以数字的形式打印出来 |
-l | 使标准输出变为缓冲行形式 |
-n | 指定将每个监听到数据包中的域名转换成IP地址后显示,不把网络地址转换成名字 |
-nn | 指定将每个监听到的数据包中的域名转换成IP、端口从应用名称转换成端口号后显示 |
-t | 在输出的每一行不打印时间戳 |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息 |
-vv | 输出详细的报文信息 |
-c | 在收到指定的包的数目后,tcpdump就会停止 |
-F | 从指定的文件中读取表达式,忽略其它的表达式 |
-i | 指定监听的网络接口,后面跟数组“any”表示针对所有接口 |
-p | 将网卡设置为非混杂模式,不能与host或broadcast一起使用 |
-r | 从指定的文件中读取包(这些包一般通过-w选项产生) |
-w | 直接将包写入文件中,并不分析和打印出来 |
-s snaplen | 表示从一个包中截取的字节数。0表示包不截断,抓完整的数据包。默认的话 tcpdump 只显示68字节数据包 |
-T | 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单网络管理协议 |
-X | 告诉tcpdump命令,需要把协议头和包内容都原原本本的显示出来(tcpdump会以16进制和ASCII的形式显示),这在进行协议分析时是绝对的利器 |
3 tcpdump的主要过滤方式
下图列举了tcpdump如何按照某种方式去过滤,对于平时的开发,绝对是足够的,加上配合上面的选项。
4 个人平时开发常用的抓包命令
虽然很多人会按照第3点来讲解tcpdump的例子,但是这里我直接使用实战的抓包命令。
4.1 抓任意主机端口的包。
tcpdump -Ans 4096 -i any port 8889 //抓网卡任意,端口为8889的包,选项意思看上面。
4.2 抓取onvif协议想要得到GetProfiles的信息时,获取该接口的函数名字。
不过需要注意版本,不同版本的函数名不一样,当版本不一样时,我们就需要参考该版本的其它函数的名字,以此来确定该接口的名字。并且一般我们抓onvif的包,需要配合ONVIF Device Test Tool 15.06或者ONVIF Device Manager工具。
tcpdump -i em1 host 192.168.1.186 -w ./getProfiles.cap //-i 哪种网卡(使用ifconfig查看),host ip表示捕获哪个另一方的主机ip,-w表示保存文件的路径
4.3 抓取sip信令的包
4.3.1 环境在Linux下
- 1)首先,最基本的就是抓取该主机5060端口的包了。
tcpdump -i any host localhost and port 5060 -w ./1.cap //配合逻辑表达式抓包
- 2)不过需要注意,如果我们想要查看是否有国标交互成功后的视频数据包即RTP包,必须去掉指定sip的端口,因为invite成功后,每一路视频的传输都会各自开辟一个端口。
所以,想要查看sip信令的包和视频流rtp数据的包,必须去掉端口抓包,并且最好指定对应的网卡,一般是eth0或者docker0,需要自己根据ifconfig来查看并且确定(可以先选择任意一个网卡,抓包后看是否有数据,若无数据,该包大小一般是2kb~4kb,内部只包含了一些文件信息)。
因为如果不指定网卡,你的包不到1分钟可能就已经1G以上了,非常的大。
tcpdump -i eth0 host localhost -w ./1.cap //抓sip信令包和带视频数据的rtp包。
- 3)然后将上面抓的包保存下来,使用wireshark分析,不要在linux上分析,非常不方便观察。我们可以使用下面的方法过滤:
//只查看sip信令的包。
sip
//查看sip信令包中特定的设备编码的包,即某一路视频的sip包
sip contains 11000000041315001289
//根据国标的编码和流媒体码流的传输端口,查看上下级码流传输的过程,31232可从invite包获取,
//但是需要知道该视频流的国标通道编码,即11000000041315001289。invite的数据包可以通过过滤sdp快速查找。
//该过滤命令可以去掉后面的||
sip contains 11000000041315001289||udp.port==31232
//查看所有的rtp数据包
rtp
//查看某一路的rtp数据包,即视频流数据包。因为每一路的视频数据传输的端口都是一一对应的,所以可以通过端口来索引每一个视频。
rtp and udp.port==31232
注意:
抓国标时,不可以通过 "rtp + contains + 设备通道编码“ 来寻找每一路的rtp数据包,因为rtp包内不像sip包中包含通道编码,无法区分是哪一路,只能通过上面的端口确定。
rtp contains 11000000041315001289 //错误过滤方法,这样即使有数据包也会过滤成无数据。正确过滤应该是上面使用端口的过滤方法。
4.3.2 环境在Windows下
windows下抓包比较方便,可以直接使用wireshark抓包,不用像上面linux需要抓包然后保存下来,再拿到windows下分析。
sip and ip.src==192.168.2.38 or ip.src==192.168.1.204 //抓ip为38与204的sip协议包
rtp //抓rtp的包,主要是想查看rtp里面装的是什么内容,一般是PS流
windwos下分析国标的包,和上面的3)过程的一样的,它实际上也是在windwos下分析的,不再复述。
好了,关于tcpdump配合抓取sip+rtp包讲述完毕,其它关于tcpdump的使用,和上面差不多,大家按照实际开发来应用即可。