01-----tcpdump抓包命令

一 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如何按照某种方式去过滤,对于平时的开发,绝对是足够的,加上配合上面的选项。
01-----tcpdump抓包命令_第1张图片

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的使用,和上面差不多,大家按照实际开发来应用即可。

你可能感兴趣的:(01-----tcpdump抓包命令)