网络协议分析仪tcpdump和wireshark使用

Posted 锦衣admin

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了网络协议分析仪tcpdump和wireshark使用相关的知识,希望对你有一定的参考价值。

网络协议分析仪介绍

网络协议分析仪的作用:

网络协议抓包工具主要用于对网络协议的数据进行捕获,对捕获后的数据的结构及其封装内容进行分析查看,以便了解数据在网络传输时的状态。

  • 对网络协议的数据进行捕获
  • 对捕获的网络协议数据进行分析

网络协议分析仪所处位置:

  • 对于服务器之间的通信数据包抓包,可以选择在网络接口卡上操作
  • 如果需要捕获局域网数据包,需要网络设备的配合,例如使用集线器或交换机(需要完成端口镜像配置)

网络协议分析仪工具分类:

根据抓包工具应用环境的不同,抓包工具可以分为:

  • 命令行抓包工具
  • 图形界面抓包工具

命令行抓包工具:tcpdump

tcpdump特点:

相当于复制了一份网络数据信息,tcpdump并没有拦截数据的发送

工作在网络接口位置,可以直接在终端使用

可以对数据报文进行筛选,且只能抓取流经本机的数据报文

tcpdump工具使用

安装:

# yum provides *bin/tcpdump		=>	查看系统哪个文件提供tcpdump命令
# yum install -y tcpdump	=>	安装tcpdump工具

抓包选项使用:

-i interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口
			(不包括loopback接口,要抓取loopback接口需要使用 tcpdump -i lo),一旦找到第一个符合条件的接口,搜寻马上结束。
			 可以使用"any"关键字表示网络接口

	# tcpdump -i ens33


-c:指定要抓取的包数量。注意:是最终要获取这么多个包。
	例如:指定"-c 10" 将获取10个包,但可能已经处理了100个包,只不过只有10个包是满足条件的包

	# tcpdump -i ens33 -c 10


-n:对地址以数字方式显示,否则显示主机名,也就是说"-n"选项不做主机名解析

	# tcpdump -i ens33 -n


-nn:除了-n的作用外,还把端口显示为数值,否则显示端口服务名

	# tcpdump -i ens33 -nn


-N:不打印出host的域名部分。例如tcpdump将会打印"nic"而不"nic.ddn.mil"

	# tcpdump -i ens33 -N


-P:(大写)指定要抓取的包是流入还是流出的包。可以给定值为"in""out""inout",默认为"inout"即流入流出的包都抓取

	# tcpdump -i ens33 -P in


-s len:设置tcpdump的数据包抓取长度为len,如果不设置默认将会是65535字节。对于要抓取的数据包较大时,
	len设置不够可能会产生截断,若出现包截断,输出行中会出现"[|proto]"的标志(proto实际会显示为协议名)。
	但是抓取len越长,包处理时间越长,并且会减少tcpdump可缓存的数据包的数量,从而导致数据包的丢失,
	所以在能抓取我们想要的包的前提下,抓取长度越小越好

输出选项使用:

-e:输出的每行中都将包含数据链路层头部信息,例如源mac和目标mac地址

	# tcpdump -i ens33 -e


-q:快速打印输出,即打印很少的协议相关信息,从而输出行都比较简短

	# tcpdump -i ens33 -q


-X:(大写)输出包的头部数据,会以16进制和ascii码两种方式同时输出

	# tcpdump -i ens33 -X


-XX:(大写)输出包的头部数据,会以16进制和ascii码两种方式同时输出,更详细

	# tcpdump -i ens33 -XX


-v:当分析和打印的时候,产生更详细的输出

	# tcpdump -i ens33 -v


-vv:产生比-v更详细的输出

	# tcpdump -i ens33 -vv


-vvv:产生比-vv更详细的输出	

	# tcpdump -i ens33 -vvv

其他功能选项:

-D:列出可用于抓包的接口。将会列出接口的数值编号和接口号,他们都可以用于"-i"# tcpdump -i ens33 -D


-F:从文件中读取抓包的表达式。若使用该选项,则命令行中给定的其他表达式都将失效

		# tcpdump -r 数据包文件
		# tcpdump -r /home/file2.tcpdump
		=>	或者直接在wireshark上打开,更加直观


-w:将抓包数据输出到文件中而不是标准输出。可以同时配合"-G time"选项使得输出文件每time秒
	就自动切换到另一个文件。可通过"-r"选项载入这些文件以进行分析和打印

	# tcpdump -i ens33 -nn -c 10 -w /home/file1.tcpdump	=>	将抓到的数据包输出保存到文件中


-r:从给定的数据包文件中读取数据。使用"-"表示从标准输入中读取

		# tcpdump -nn -vvv -e -r /home/file1.tcpdump	=>	读取抓包数据文件

tcpdump表达式

表达式作用:

表达式用于筛选输出哪些类型的数据包,如果给定表达式,只输出表达式为true的包。否则所有数据包都将输出。在表达式中出现的shell元字符建议使用单引号包围

表达式格式:

tupdump的表达式由一个或多个"单元"组成,每个单元一般包含ID的修饰符和一个ID(数字或名称)。
有三种修饰符:

type:指定ID类型

可以给定的值有host/net/port/portrange。例如:“host foo”,“net 128.3(网段)”,“port 20”,“portrange 6000-6008”。默认的type为host

dir:指定ID方向
可以给定的值包括src/dst or dst/src and dst,默认为src or dst。例如:"src foo"表示源主机为foo的数据包,"dst net 128.3"表示目标网络(网段)为128.3的数据包,"src or dst port22"表示源或目的端口为22的数据包

proto:通过给定协议限定匹配的数据包类型
常用的协议有tcp/udp/arp/ip/ether/icmp等,若未给定协议类型,则匹配所有可能的类型。
例如:“tcp port 21”,“udp portrange 7000-70009”

所以一个基本的表达式单元格式为"proto dir type ID"
在这里插入图片描述
操作符:[not]

  • 表达式单元之间可以使用操作符" and / && “、” or / ||"、 " not / ! "进行连接,从而组成复杂的条件表达式。

  • 如"host foo and not port ftp and not port ftp-data"。表示筛选的数据包要满足"主机为foo且端口不是ftp(端口21)和ftp-data(端口20)的包"

  • 常用端口和名字的对应关系可在linux系统中的/etc/service文件中找到

优先级:()

  • 使用括号"()“可以改变表达式的优先级,但需要注意的是括号会被shell解释,所以应该使用反斜线”“转义为”()",在需要的时候,还需要包围在引号中

修饰符可省略:

  • 如"tcp dst port ftp or ftp-data or domain“与”tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意义相同,都表示包的协议为tcp且目的端口为ftp或ftp-data或domain(端口53)。

除了使用修饰符和ID组成的表达式单元,还有关键字表达式单元:gateway,broadcast,less,greater以及算术表达式。

tcpdump应用示例

应用准备:
配置三台主机:

主机名主机ip写法
node110.1.1.10主机A
node210.1.1.11主机B
node310.1.1.12主机C

设置主机名机主机名解析:

# vim /etc/hosts	=>	在node1上的主机hosts文件配置ip与主机名快速解析
	10.1.1.10 node1
	10.1.1.11 node2
	10.1.1.12 node3

通过rsync命令快速复制到其他主机:
	# rsync -av /etc/hosts node2:/etc/hosts

	# rsync -av /etc/hosts node3:/etc/hosts

案例:抓取离开或进入主机的数据包(在node1)

命令格式:
	# tcpdump -i ens33 host 主机B的主机名

命令演示:
	# tcpdump -i ens33 host node2		=>	只抓取进出node2主机的数据包
	# tcpdump -i ens33 -nn host node2 	=>	只抓取进出node2主机的数据包

	打开node1另外一个终端去ping 主机B

案例:抓取当前主机与指定主机之间的通信数据包(在node1)

命令格式:
	# tcpdump -i ens33 -nn host 当前主机名 and 主机B
	# tcpdump -i ens33 -nn host 当前主机名 and \\(主机B or 主机C\\)


命令演示:
	当前主机与一台主机:
		# tcpdump -i ens33 -nn host node1 and node2
			=>	只抓取当前主机node1与node2之间的数据包通信


	当前主机与多台主机:
		# tcpdump -i ens33 -nn host node1 and \\(node2 or node3\\)	
			=>	抓取当前主机node1与node2和node3两台主机之间的数据包
			=>	注意:括号会被shell解释,需要在()前需要添加" \\ "进行转

案例:抓取当前主机(A)与其它主机通信IP数据包,但不包含主机node3(在node1)

命令格式:
	# tcpdump -i ens33 ip host 当前主机名 and not 主机C


命令演示:
	# tcpdump -i ens33 -nn ip host node1 and not node3
		=>	不抓取当前主机node1和node3之间的通信
		=>	注意:加入了type类型:"ip"

案例: 抓取当前主机发送的所有数据包(在node1)

命令格式:
	# tcpdump -i ens33 -nn src host 当前主机名


命令演示:
	# tcpdump -i ens33 -nn src host node1
		=>	只抓取当前主机node1发送出去的所有数据包
		=>	注意:加入了dir类型:"src"代表源主机为node1发送出去的请求数据包
		=>	抓取的是node1发送的请求包


	假设在node1上抓取node2发送的数据包
		# tcpdump -i ens33 -nn src host node2
			=>	只抓取node2发送出去的所有数据包
			=>	如果1ping2,在node1上tcpdump抓取的是node2返回的数据包
			=>	看指定的"src"源主机是哪一台

案例: 抓取当前主机(指定主机名)接受的所有数据包(在node1)

命令格式:
	# tcpdump -i ens33 -nn dst host 当前主机名


命令演示:
	# tcpdump -i ens33 -nn dst host node1
		=>	只抓取当前主机node1接受到的数据包
		=>	注意:加入了dir类型:"dst"代表目的主机为node1接受到的数据包
		=>	假设1ping2,在node1上tcpdump抓取的是node2返回的数据包


	假设在node1上抓取目的主机node2接受的数据包
		# tcpdump -i ens33 -nn dst host node2
			=>	只抓取node2接受的所有数据包
			=>	如果1ping2,在node1上tcpdump抓取的是node1请求的数据包
			=>	看指定的"dst"目的主机是哪一台

案例:抓取当前主机与指定主机之间指定协议、指定端口的数据包(在node1)

命令格式:
	# tcpdump -i ens33 -nn tcp port 22 and host 主机B
		=>	捕获流经ens33接口当前主机与主机B及其tcp 22端口的所有数据


命令演示:
	# tcpdump -i ens33 -nn tcp port 22 [and host node1]		=>	[]内可加可不加,相当于抓取本地主机协议端口的数据包
		=>	在当前主机node1上可以不写"and host node1"选项,因为前面"tcp port 22"捕获的就是node1上流经tcp:22端口上的数据包
		=>	语句代表捕获当前主机node1上所有与其他主机tcp:22端口之间的数据包


	假设需要捕获当前主机node1和主机node2之间ssh的数据包:
		# tcpdump -i ens33 -nn tcp port 22 and host node2
			=>	捕获当前主机node1与node2上tcp:22端口之间的所有数据包
			=>	不管是在noed1 ssh node2或是node2 ssh node1,都可以捕获到它们之间的数据包
			=>	注意:但是node1或者node2与其他主机ssh连接,就不能捕获到


	假设需要捕获当前主机node1和主机node2、主机node3之间ssh的数据包:
		# tcpdump -i ens33 -nn tcp port 22 and host \\(node2 or node3\\)
			=>	代表捕获当前主机node1与node2/node3之间的ssh数据包
			=>	注意:如果node2和node3之间相互ssh,在当前主机node1上是捕获不到的

案例:抓取本地主机指定协议、指定端口的数据包(在node1)

命令格式:
	# tcpdump -i ens33 -nn PROTO [DIR] TYPE 


命令演示:
	# tcpdump -i ens33 -nn udp port 123  
		=>	只抓取当前主机udp协议:123端口与其他主机之间的数据包

案例:抓取指定当前主机与某一网段(例如:192.168)通信的数据包,仅抓取10个(在node1)

命令格式:
	# tcpdump -i ens33 -nn -c 10  net 网段


命令演示:
	# tcpdump -i ens33 -nn -c 10 net 10.1
		=>	捕获10个当前主机node1与10.1.0.0/16网段通信的数据包
		=>	注意:如果当前主机noed1 ping 其他网段,也会抓取。因为node1的地址属于10.1网段

	
	当指定dir类型:指定源或目方向时候:
		# tcpdump -i ens33 -nn -c 10 src net 10.1# tcpdump -i ens33 -nn -c 10 dst net 10.1
			=> 上面语句捕获当前主机node1与源为10.1网段或目的为10.1网段之间的数据包

		# tcpdump -i enss -nn -c 10  src net 192.168# tcpdump -i enss -nn -c 10  dst net 192.168
			=>	上面语句捕获当前主机node1与源为192.168网段或目的为192.168网段之间的数据包

案例:基于协议抓取ping包(在node1上)

命令格式:
	# tcpdump -i ens33 -c 10 -nn 协议名
		=>	注意:icmp是网络层协议,tcp、udp是传输层协议,"不能直接抓取应用层协议"


命令演示:
	# tcpdump -i ens33 -nn  -c 10 icmp
		=>	捕获当前主机node1与其他主机之间的icmp协议之间的数据包

案例:基于协议抓取来自于某一主机的ping包(在node1上)

命令格式:
	# tcpdump -i ens33 -c 10 -nn icmp and src 某一主机名或IP
	

命令演示:
	# tcpdump -i ens33 -c 10 -nn icmp and src noed2[10.1.1.11]
		=>	捕获当前主机node1与node2之间的icmp协议数据包
		=>	注意:捕获的是源为node2的数据包
		=>	如果不加src 需要加host,相当于"host" = "src or dst"

案例:基于端口 抓取到某主机某一端口的数据包(在node1上)

命令格式:
	# tcpdump -i ens33 -nn -c 10  PROTO DIR TYPE


命令演示:
	# tcpdump -i ens33 -nn -c 10  tcp dst port 22
		=>	捕获当前主机node1与其他主机目的端口为tcp:22的数据包
		=>	不管是当前主机ssh其他主机或者是其他主机ssh当前主机
		=>	注意:dir类型:dst可改为src,说明捕获的是源端口为tcp:22的数据包

案例:解析被抓取数据包(在node1上)

命令演示:
	# tcpdump -i ens33 -c 2 -q -XX -vvv -nn tcp dst port 22
		=>	解析流经ens33接口,方向为dst,tcp 22端口的数据。取2个,简短显示,并输出包头部信息。

案例:抓取数据包保存至指定名称文件和解析文件中的数据包(在node2上)

命令格式:
	# tcpdump -i ens33 -nn -w 保存路径 [表达式]


命令演示:
	# tcpdump -i enss33 -nn -w /home/file1.tcpdump
		=>	捕获流经ens33接口所有数据,写入file.cap文件中


	# tcpdump -i ens33 -nn -w /home/file2.tcpdump host 10.1.1.11 and tcp port 80
		=>	node2上安装了apache软件
		=>	捕获当前主机node2(host 10.1.1.11) tcp 80端口通信数据,使用-w 选项指定将监听到的数据包写入文件中保存
		=>	当其他主机访问node2主机上的80网页时就会捕获数据包


	#l 查看捕获到的数据包文件
		# tcpdump -r 数据包文件
		# tcpdump -r /home/file2.tcpdump
		=>	或者直接在wireshark上打开,更加直观

案例: 通过文件指定条件进行数据捕获(在node1上)

把表达式写入文件,通过文件的条件去捕获数据包:
	# vim condition.txt
		host 10.1.1.10 and tcp port 22		

命令演示:
	# tcpdump -i ens33 -w /home/file.tcpdump -F condition.txt
		=>	"-F" 从文件中读取抓包的表达式
		=>	"-w" 将捕获的数据包保存下来 
		=>	以上命令是捕获当前主机node1上tcp:22端口相关的数据包

图形界面网络分析仪:wireshark

工作在网络接口位置,可以对数据报文进行筛选,捕获的数据包结构分层清晰易于对数据包进行分析

必须有图形界面配合使用

wireshark工具使用

安装:

# yum install wireshark* -y		=>	加*号可以安装的东西多一点

使用方法:

# wireshark		=>	直接在终端使用命令打开,但是关闭终端wireshark也随之关闭


#l 所以建议直接在应用程序的internet中打开

直接在应用程序中打开:在这里插入图片描述

wireshark权限不足解决方法

wireshark捕获数据分析

Wireshark官方用户指南

wireshark窗口介绍

在这里插入图片描述
数据包详细信息介绍:

第一个:在这里插入图片描述
第二个
在这里插入图片描述
第三个
在这里插入图片描述
第四个
在这里插入图片描述
第五个和第六个
在这里插入图片描述

wireshark过滤规则

  • Filter过滤工具栏中填写,Apply应用(或者直接回车应用), Clear清除过滤,

过滤主机IP:

命令格式:
	# ip.src eq ip		=>	过滤源ip,eq是"等于"的意思
	# ip.dst eq ip		=>	过滤目的ip
	
	# ip.src eq ip1 or ip.dst eq ip2	=>	过滤源ip1或者目的ip2的数据包,注意:or和and是不同的
	# ip.addr eq ip		=>	源ip或者是目的ip数据,都可以筛选出来

过滤端口:

命令格式:
	# tcp.port eq 80	=>	找出tcp协议且是80端口的数据包,"eq"等价于"==(比较)"
	#tcp.port == 80		

	# tcp.port eq 80 or udp.port eq 80		=>	过滤tcp:80和udp:80的数据包

	# tcp.srcport eq 80		=>	过滤源端口为tcp:80的数据包
	# tcp.dstport eq 80		=>	过滤目端口为tcp:80的数据包

	# tcp.port >= 1 and tcp.port <= 80		=>	表示搜索tcp:1~80的端口数据包

过滤协议:

命令格式:
	# tcp		=>	直接输入协议名称筛选
	# udp
	# arp

	#l !arp		=>	两者等价,筛选不属于arp协议的其他协议数据包
	# not arp

http过滤:

命令格式:
	# http.request.method eq "GET"		=>	筛选HTTP协议"GET"请求的数据包
	# http.request.method eq "POST"		=>	筛选HTTP协议"POST"请求的数据包
	
	# http.request.uri eq "/index.html"		=>	筛选HTTP协议中访问"/index.html"的数据包

	# http.host eq ip		=>	查看HTTP协议中存在这个ip的数据包

tcp过滤:

命令格式:
	# tcp.flags		=>	显示包含TCP标志的数据包
	# tcp.flags.syn eq 0x02		=>	显示包含TCP SYN标志的数据包

过滤mac地址:

命令格式:
	# eth.src eq mac地址	=>	筛选源Mac地址的数据包
	# eth.dst eq mac地址	=>	筛选目的Mac地址的数据包

	# eth.addr eq mac地址	=>	不管是源还是目的mac地址,存在都筛选出来

以上是关于网络协议分析仪tcpdump和wireshark使用的主要内容,如果未能解决你的问题,请参考以下文章

tcpdump VS tshark用法(转)

tcpdump抓包和Wireshark解包

Linux tcpdump命令详解与Wireshark

网络报文抓包分析——ARP

网络报文抓包分析——ARP

wireshark数据包分析实战 第一章