linux的tcpdump命令主要用于网络问题的调试中,通过抓取传输过程的数据包进行分析和调试。而wireshark则是一款功能强大,使用方便的数据包分析工具,tcpdump+wireshark组合使用,完美,perfect,让网络问题无处遁形。
目录
1 tcpdump及wireshark基本介绍
1.1 tcpdump
1.2 wireshark
2 tcpdump抓包
2.1 常用命令
2.1.1 默认启动
2.1.2 监视指定网络接口的数据包
2.1.3 监视指定主机的数据包
2.1.4 指定抓包数量
2.1.5 抓包精简显示
2.1.6 按照协议类型抓包
2.1.7 指定主机和端口号进行抓包
2.1.8 抓包并保存
2.2 tcpdump详细参数
3 wireshark导入数据包进行分析
tcpdump是基于Unix系统的命令行式的数据包嗅探工具,可以抓取流动在网卡上的数据包。默认情况下,tcpdump不会抓取本机内部通讯的报文。根据网络协议栈的规定,对于报文,即使是目的地是本机,也需要经过本机的网络协议层,所以本机通讯肯定是通过API进入了内核,并且完成了路由选择。
linux抓包原理:
Linux抓包是通过注册一种虚拟的底层网络协议来完成对网络报文(准确的说是网络设备)消息的处理权。当网卡接收到一个网络报文之后,它会遍历系统中所有已经注册的网络协议,例如以太网协议、x25协议处理模块来尝试进行报文的解析处理,这一点和一些文件系统的挂载相似,就是让系统中所有的已经注册的文件系统来进行尝试挂载,如果哪一个认为自己可以处理,那么就完成挂载。当抓包模块把自己伪装成一个网络协议的时候,系统在收到报文的时候就会给这个伪协议一次机会,让它来对网卡收到的报文进行一次处理,此时该模块就会趁机对报文进行窥探,也就是把这个报文完完整整的复制一份,假装是自己接收到的报文,汇报给抓包模块。
wireshark是一种数据包分析工具,在各种网络应用中,比如通过思博伦的Spirent_TestCenter(TC)、Ixia测试仪抓取接口报文或者利用本文介绍的linux自带的tcpdump监听抓包工具,抓包后导出报文再导入wireshark工具中进行图形化分析。
tcpdump
普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。但是由于linux默认网卡的问题,可能出现下面报错:
tcpdump: packet printing is not supported for link type NFLOG: use -w
此时,可以通过ifconfig或者ip address命令查看网卡信息,并通过指定网口进行数据抓包
tcpdump -i ens33
指定通过网口ens33, 并且进出口IP地址为10.193.12.119的数据包
tcpdump -i ens33 host 10.193.12.119
指定通过网口ens33, 并且主机10.193.12.12 和主机10.193.17.4 或10.193.12.119之间的通信
tcpdump -i ens33 -n host 10.193.12.12 and \( 10.193.17.4 or 10.193.12.119 \)
指定通过网口ens33, 并且主机10.193.12.12 和非主机10.193.17.4之间的通信
tcpdump -i ens33 -n host 10.193.12.12 and ! 10.193.17.4
指定通过网口ens33, 并且由主机10.193.12.12发送的所有数据
tcpdump -i ens33 -n src 10.193.12.12
指定通过网口ens33, 并且由主机10.193.12.12接收的所有数据
tcpdump -i ens33 -n dst 10.193.12.12
指定通过网口ens33, 并且由主机10.193.12.12接收的连续5个数据包
tcpdump -i ens33 -n dst 10.193.12.12 -c 5
tcpdump -i ens33 -n dst 10.193.12.12 -c 5 -q
指定通过网口ens33, 并且由主机10.193.12.12接收的连续5个数据包,并采用精简显示,可与上图进行对比
以ping为例,我们知道ping的协议类型为icmp,我们可以指定icmp协议类型进行抓包
tcpdump -i ens33 -n icmp
指定网卡ens33,端口号为55555并且ip地址为10.193.12.12的连续10个数据包
抓包并保存package.cap文件,可导出后再导入wireshark进行包分析
tcpdump -i ens33 -n port 55555 and host 10.193.12.12 -c 10 -w package.cap
- -a 尝试将网络和广播地址转换成名称。
- -c<数据包数目> 收到指定的数据包数目后,就停止进行倾倒操作。
- -d 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出。
- -dd 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出。
- -ddd 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出。
- -e 在每列倾倒资料上显示连接层级的文件头。
- -f 用数字显示网际网络地址。
- -F<表达文件> 指定内含表达方式的文件。
- -i<网络界面> 使用指定的网络截面送出数据包。
- -l 使用标准输出列的缓冲区。
- -n 不把主机的网络地址转换成名字。
- -N 不列出域名。
- -O 不将数据包编码最佳化。
- -p 不让网络界面进入混杂模式。
- -q 快速输出,仅列出少数的传输协议信息。
- -r<数据包文件> 从指定的文件读取数据包数据。
- -s<数据包大小> 设置每个数据包的大小。
- -S 用绝对而非相对数值列出TCP关联数。
- -t 在每列倾倒资料上不显示时间戳记。
- -tt 在每列倾倒资料上显示未经格式化的时间戳记。
- -T<数据包类型> 强制将表达方式所指定的数据包转译成设置的数据包类型。
- -v 详细显示指令执行过程。
- -vv 更详细显示指令执行过程。
- -x 用十六进制字码列出数据包资料。
- -w<数据包文件> 把数据包数据写入指定的文件。