TCPdump抓包工具介绍
TCPdump,全称dump the traffic on anetwork,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具。
tcpdump_3">tcpdump可以支持的功能:
1、在Linux平台将网络中传输的数据包全部捕获过来进行分析
2、支持网络层、传输层协议等协议捕获过滤
3、数据发送和接收的主机、网卡和端口等各种过滤捕获数据规则
4、提供and、or、not等语句进行逻辑组合捕获数据包或去掉不用的信息
5、结合wireshark工具分析捕获的报文
要灵活使用 tcpdump 工具必须要有两个必备的知识基础:
第一、Linux 操作系统:
因为这是一款基于 Linux 系统下命令行的抓包工具,所以需要对 Linux 的基本操作和常用命令有一定的基础;
第二、网络知识:
因为 tcpdump 是将网络中传送的数据包完整的截获下来然后进行分析,所以想要分析捕获到的报文,需要了解 OSI 七层网络模型,以及常用网络协议等。
TCPdump抓包工具使用环境和初体验
默认输入 tcpdump 这个命令,回车操作之后,它将监视第一个网络接口上所有流过的数据包,一般是eth0,如下图所示
20:44:54.485275 IP 115.205.231.25.54845 > iZj6cac8jcykj0pe92w66iZ.ssh: Flags [.], ack 46944, win 510, options [nop,nop,TS val 671165587 ecr 471333], length 0
20:44:54.485301 IP iZj6cac8jcykj0pe92w66iZ.ssh > 115.205.231.25.54845: Flags [P.], seq 59304:59516, ack 1, win 259, options [nop,nop,TS val 471428 ecr 671165587], length 212
以上输出的信息来看,可以总结出:
第一列:时分秒 20:33:22.957272
第二列:网络协议ip
第三列:发送方的ip地址+端口号,115.205.231.25是ip,而54845的端口号 / iZj6cac8jcykj0pe92w66iZ是主机, ssh是协议 表示端口号 22
第四列:箭头 > , 表示数据流向
第五列:接收方的ip地址+端口号,接收方是本机,所以翻译成了iZj6cac8jcykj0pe92w66iZ
第六列:数据包内容,包括Flags 标识符,seg 号,ack号,win 窗口,数据长度 length,其中 [P.]表示 PUSH 标志位为1,更多标识符需要了解TCP协议的标志位。
TCP协议
TCP(Transmission Control Protocol)传输控制协议,顾名思义,就是要对数据的传输进行一定的控制。
SYN:连接请求或者接受连接请求
FIN:连接结束,断开链接
RST:重置链接
ACK:确认标记位
PSH:催促标志位,将接受缓冲区内数据向上交付给应用程序,而不是等待缓冲区满后再交付。
URG:紧急标志位,将紧急数据排在普通数据的前面;
序号:每个数据包都对应着一个序列号
确认号:每发送一个数据包都需要收到对应的确认包,确认号=序号+1
窗口:滑动窗口 ------ 可靠性+提高报文发送效率
[S]
: SYN(开始连接)
[P]
: PSH(推送数据)
[F]
: FIN(结束连接)
[R]
: RST(重置连接)
[.]
: 没有Flag(意思是除上面四种类型外的其他情况,有可能是ACK也有可能是URG)
TCPdump抓包工具常规过滤
基于IP地址进行过滤: host
案例1: 截获特定主机-220.181.38.148的主机收到的和发出的所有的数据包
tcpdump host
220.181.38.148
解释:host 220.181.38.148
,指明 220.181.38.148 是一台主机,如果你非常明确关心的是哪个主机的收发报文,那么就可以直接过滤这个主机的数据包。host后面加主机的IP地址,就可以只抓取这个主机的所有数据包,其他主机的数据包就会被过滤掉。
案例2:获取目的地址是220.181.38.148 的报文
tcpdump dst
220.181.38.148
解释:dst 指的是目的地址;这个是确定传输方向的关键字,src源;dst 目的
src 是获得原地址的请求报文
dst是获得目标地址的请求报文
**基于IP地址进行过滤: port **
案例3:获取特定端口-比如http的包,使用如下命令:
tcpdump tcp port 80
解释:port 80
指明端口80,只会抓取这个80端口的数据包;加上具体某个协议的某个端口,就可以更加精确的捕获对应的业务的数据报文了。如上,就会只抓取 TCP 协议的 80 端口的数据报,也就是 http 协议的数据报文。
tcpdump src port 80/tcpdump dst port 80
如果你想要同时指定两个端口你可以这样写:tcpdump port 80 or port 22、tcpdump port 80 or 22 ;
如果你的想抓取的不再是一两个端口,而是一个范围,一个一个指定就非常麻烦了,此时你可以这样指定一个端口段。
tcpdump portrange 8000-8080
tcpdump src portrange 8000-8080
tcpdump dst portrange 8000-8080
对于一些常见协议的默认端口,我们还可以直接使用协议名,而不用具体的端口号:比如 http =80,https = 443 等
tcpdump tcp port http
基于协议进行过滤:protocal
案例4:获取ICMP协议的报文
tcpdump icmp
解释:标明要抓取的协议报文,一般常用的比如ip ,ip6 ,arp,icmp,tcp,udp
等
注意:http,dns,https,ssh 等这些应用层
的协议,不能直接这样写,想要写成:
tcpdump port http
或者 tcpdump port 53 (DNS的端口号是53)
tcpdump_103">tcpdump的常用参数
tcpdump -h ——查看所有参数
-i # 指定监听网络接口
tcpdump -i eth0
默认监听在第一块网卡上,监听所有经过此网卡通过的数据包;但是我们可能关心的数据并不是 eth0 的接口,这时就需要指定端口进行数据包的捕获。
在 tcpdump 后面加一个 -i的参数,后面跟具体需要捕获的接口名称,就可以抓取经过这个具体接口的所有数据包。tcpdump -i any
监听所有的网卡接口、用来查看是否有网络流量
-w #将捕获到的信息保存到文件中,且不分析和打印在屏幕
tcpdump -i eth0 -w tt
报文打印在shel里会太多且不方便查看,我们可以保存成文件;然后通过xftp导出到本地,可以详细查看
扩展:导出的文件可以设置为cap
或者pcap
的格式
,可以直接用wireshark工具打开;
可以用wireshark工具分析报文具体信息!
-r # 从文件中读取数据,读取后,照样可以使用上述的过滤器语法进行过滤分析。
tcpdump -r tt.pcap
-n: 不把ip转化成域名,直接显示ip,避免执行DNS lookups的过程,速度会快很多
-nn : 不把协议和端口号转化成名字,速度也会快很多。
-N : 不打印出host的域名部分,比如,如果设置了此选项,tcpdump将会打印’nic’ 而不是’nic.ddn.mil’ 。
-t :在每行的输出中不输出时间
-tt : 在每行的输出中会输出时间戳
-ttt: 输出每两行打印的时间间隔(以毫秒为单位)
-tttt:在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观)
-v:产生详细的输出.比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开些附加的包完整性检测,比如对IP或ICMP包头部的校验和。
-vv:产生比-v更详细的输出.比如NFS回应包中的附加域将会被打印,SMB数据包也会被完全解码。
-vv:产生比-vv更详细的输出。比如 telent 时所使用的SB,SE选项将会被打印,如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来
-c #指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump,停止抓包
tcpdump -c 20 -w tt.pcap
解释:抓满20个报文之后,就停止tcpdump抓包。
-C #与 -w FILE 选项配合使用。该选项使得 tcpdump 在把原始数据包直接保存到文件中之前,检查此文件大小是否超过 file-size。如果超过了,将关闭此文件,另创一个文件继续保存原始数据包。新创建的文件名与 -w 选项指定的文件名一致,但文件名后多了一个数字,该数字会从1开始随着新创建文件的增
多而增加。file-size的单位是百万字节(这里指1,000,000个字节,并非1,048,576个字节)
tcpdump -C 1 -W 3 -w abc
指定一个单位后(1MB)就换文件,最多写3个文件,名字是abc0,abc1.abc2
选择是入方向还是出方向的数据包,可选项有:in,也可以使用–direction=[direction]
tcpdump -Q in
tcpdump -Q out
tcpdump -Q inout
-q:简洁地打印输出。即打印很少的协议相关信息,从而输出行都比较简短.
-D:显示所有可用网络接口的列表
-L: 列出网络接口的已知数据链路。
7、 -s #指定每个包捕获的长度、单位是 byte,而不是默认的262144bytes;
如果超过了设定的大小限制,包就会被阶段,而在打印行出现[|proto]这种标识,这个proto就是被截断的报文的协议名字。但是抓取len越长,包的处理时间越长,并且会减少tcpdump可缓存的数据包的数量,从而会导致数据包的丢失,所以在能抓取我们想要的包的前提下,抓取长度越小越好(-s0使用默认长度262144)。
注意:不同的tcpdump版本,这个默认抓取的报文的长度不一样
帮助文档的指令 : man tcpdump
8、 -A : #以ASCII 格式打印出所有的分组并且读取此文件,这样可以使读取更加简单,方便使用 grep 等工具解析输出内容
--- tcpdump -A -r tt2
--- tcpdump -A | grep baidu
-X表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。这-X和-A两个参数不能一起使用
--- tcpdump -X -r tt2
9、-e #在输出行打印出数据链路层的头部信息。默认情况下 tcpdump 不会显示数据链路层信息,使用 -e选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息。例如:
--- tcpdump -e -r tt2
10、-F指定使用哪个文件的过滤表达式抓包。此时命令行上的输入规则将被忽略
tcpdump -F filter_rule -c 10
这种情况适用于将表达式放置在文件中长期维护
11、-l #对标准输出进行行缓冲,在需要同时观察抓包打印以及保存抓包记录的时候很有用。比如,可通过以下命令组合来达到此抓包时保存到文件的同时查看包的内容。
-- tcpdump -l | tee dat
dat是文件的名字
这命令是使用tee来把tcpdump 的输出同时放到文件dat和标准输出中
tee 功能说明:读取标准输入的数据,并将其内容输出成文件
-- tcpdump -l > dat & tail -f dat
这个命令是通过重定向操作 ‘>’ 把数据写入对应的文件中
逻辑运算
逻辑运算符:and or not
and:所有的条件都需要满足,也可以表示为 &&
or:只要有一个条件满足就可以,也可以表示为
not:取反,也可以使用!
and例子:抓一个来自100.100.30.26主机,80端口的包 – tcpdump src 100.100.30.26 and port 80
or例子:抓取UDP 53端口或者TCP 53端口的包(DNS协议的报文) – tcpdump tcp port 53 or udp port 53
not例子:抓取不是22端口的报文 – tcpdump not tcp port 22
多个过滤器进行组合:需要用到括号,而括号在 shell 中是特殊符号,因为需要使用引号
将其包含: --and 优先级高于 or
tcpdump “src 10.0.2.4 and (dst port 3389 or 22)"
实际案例 :监听主机192.168.56.1和192.168.56.210之间ip协议的80端口的且排除www.baidu.com通信的所有数据包:
tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host ! www.baidu.com
tcpdump ip dst 192.168.56.1 and src 192.168.56.210 and port 80 and host not www.baidu.com
即not和!都是相同的取反的意思
高级过滤
1、基于包大小进行过滤:查看指定大小的数据包
案例:抓取包大小小于32bytes的数据包
– tcpdump less 32
案例:抓取包大小大于100bytes的数据包
tcpdump greater 300
tcpdump___244">tcpdump 总结图
WireShark
按IP地址过滤
想看源ip为xxx的包
ip.src
==192.168.40.1
想看目标ip为xx的包
ip.dst
==239.255.255.250
想看源或目标ip为xx的包
ip.addr
==192.168.18.128
按MAC地址过滤
想看源MAC为xx的包
eth.src
==76-6C-80-82-D7-13
想看目标MAC为xx的包
eth.dst
==76-6C-80-82-D7-13
想看源或目标MAC为xx的包
eth.addr
==76-6C-80-82-D7-13
按端口号过滤
过滤tcp端口为4694的包
tcp.port
==4694
过滤源端口为4694的包
tcp.srcport
==4694
过滤目标端口为4694的包
tcp.dstport
==4694
按协议类型过滤
常见的协议
arp
dhcp
https
规则组合
and
查看dhcp,tcp 包,并且只想查看某台电脑的dhcp包和tcp包
tcp and
dhcp and
eth.addr ==76-6C-80-82-D7-13
tcp and dhcp
or
查看dhcp 或者 arp
tcp or dhcp
通过icmp报文排查网络故障
icmp 测试网络连通性
通,告知延迟
不通,告知原因,用icmp包里的type +code ,两个数字的组合,代表故障原因
常见的错误及原因
1.没配网关 传输失败,常见故障
2.配了网关,但是找不到网关。 来自本机(可能是主机的IP地址)的回复,无法访问目标主机 自己发arp寻找网关mac,失败
3.配了网关,也能找到网关。 来自网关的回复,无法访问目标网络。 网络设备缺少路由
4.配了网关,也能找到网关,网关也有目标路由。但是后面的设备缺路由。
4.1 后面的设备,有回包的路由,没有目的地的路由。 报错:来自缺路由的设备,无法访问目标网络。
4.2 后面的设备,没有回包的路由,没有目的地的路由。 超时
B机器 ping A 机器
A机器 ping B机器
数据包都是有去有回,如果不通那就是防火墙
的问题
不通的那个机器 将 防火墙 禁ping了
windows防火墙特性
出站连接,默认放行
入站连接,默认禁止。需要允许通,防火墙要设置放行
icmp协议
Internet控制消息协议ICMP(Internet Control Message Protocol)是IP协议的辅助协议
ICMP协议用来在网络设备间传递各种差错和控制信息,对于收集各种网络信息、诊断和排除各种网络故障等方面起着至关重要的作用。
ICMP报文
icmp 中 Type+Code的请求含义
Type | Code | 描述 |
---|---|---|
0 | 0 | Echo Reply(请求的响应) |
3 | 0 | 网络不可达 |
3 | 1 | 主机不可达 |
3 | 2 | 协议不可达 |
3 | 3 | 端口不可达 |
5 | 0 | 重定向 |
8 | 0 | Echo Request(请求) |
11 | 0 | TTL值没了,丢包了 |
8+0 Echo Request(请求)
0+0 Echo Reply(请求的响应)
3+0 网络不可达
缺路由(路由没配)
3+1 主机不可达
不缺路由,缺arp (根据路由表里的直连路由查询arp,没查到对应的mac)
3 + 3 端口不可达
传输层端口, 目标主机,没开放相关的端口
(33440端口没开)
3+2协议不可达
协议号和端口号的区别?
协议号:ip头部里的字段
,标识这个数据包是tcp(6),还是udp(17),还是icmp(1),还是gre(50),还是ospf(89)还是vrrp(112)
端口号:tcp,udp头部里的字段,标识这个数据包是http(80),还是dns(53),还是ftp(21),tftp( 69),smtp(25)
什么是gre?
两台路由器,想建立gre的 联系
路由器A配置好了 路由器B没配置
A寻找B,建立gre连接 B回一个消息,协议不可达
DNS的协议号和端口号
HTTP的协议号和端口号
11+0 TTL没了,丢包了
常见的网络协议工作过程
DNS
提供了主机名字和IP地址之间的相互转换
DNS系统的模式
采用客户端/服务器模式
FTP
FTP协·议是互联网上广泛使用的文件传输协议
客户端/服务端模式,基于TCP
FTP采用双TCP连接方式
TFTP
TFTP(简单文件传输协议)也是采用客户机/服务器模式的文件传输协议
TFTP适用于客户端和服务器之间不需要复杂交互的环境
TFTP承载在UDP之上,端口号69
TFTP仅提供简单的文件传输功能(上传、下载)
TFTP没有存取授权与认证机制,不提供目录列表功能
TFTP协议传输是由客户端发起的
Telnet
远程管理网络设备
测试端口可达性
利用Wireshark 获取用户密码
客户端登录网页,抓取请求