Tcpdump----学习笔记
Tcpdump----使用学习
一、tcpdump是什么
tcpdump可以将网络中传送的数据包完全截获下来提供分析。支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来去掉无用的信息。
二、安装tcpdump
linux系统一般默认安装tcpdump
redhat安装tcpdump
yum install -y tcpdump
三、使用tcpdump
a、查看帮助
1、简洁查询使用方法
tcpdump -h
2、详细查询使用方法
man tcpdump
b、数据包的写入与读取
一般情况下,进行网络故障排除时有效奥的方法就是抓包分析网络状况,从而找到网络故障。数据包需要保存起来用于多次分析或取证。
1、数据包的写入
tcpdump -i ens33 -c 4 -w data.pcap
参数:
-i:指定网卡;未指定的情况下,将从系统接口中搜寻编号最小的已配置好的接口(不包括loopback接口)
-c:指定抓包的个数
-w:指定抓包信息写入的文件名
2、数据包的读取
tcpdump -r data.pcap
参数:
-r:指定tcpdump读取的文件名
c、tcpdump显示解析
1、* packets captured
抓取数据包的数量
2、* packets received by filter
系统接收到数据包的数量
3、* packets dropped by kernel
丢弃的数据包数量
#由于tcpdump不能识别某些系统数据包,所以received by filter(系统接收的数量)大于抓取的数量(captured)!
d、指定网卡抓取
1、查看系统的网卡
tcpdump -D
2、指定网卡抓取
tcpdump -i eth0
#抓取eth0的数据包
tcpdump -i any
#抓取所有网卡的数据包
e、tcpdump输出格式
1、输出远端对应的IP地址和端口
tcpdump -i eth0 -nnn
2、指定抓取源IP或者目的IP的包
tcpdump -i eth0 host 172.10.1.16
3、指定数据包方向
流入in
tcpdump -i eth0 host 172.10.1.16 -n -Q in
流出out
tcpdump -i eth0 host 172.10.1.16 -n -Q out
流入流出inout
tcpdump -i eth0 host 172.10.1.16 -n -Q inout #默认情况下,抓取inout流入流出的流量
4、输出数据链路层头部信息
tcpdump -i eth0 host 172.10.1.16 -n -e
5、输出抓包的简易信息
tcpdump -i eth0 host 172.10.1.16 -nnn -e -q -Q in
6、输出包的头部信息
tcpdump -i eth0 host 172.10.1.16 -XX
#-X:打印头部数据
#-XX:打印头部数据,包括数据链路层的头部
7、输出详细信息
tcpdump -i eth0 host 172.10.1.16 -vvv
#-v:输出包的生存时间、标识、总长度、IP包的一些选项,以及包完整性检测。
#-vv:输出NFS回应包中额附加域、SMB数据包完全被解码
#-vvv:更加详细的信息。
tcpdump -i eth0 host 172.10.1.16 -xxx
f、tcpdump表达式
1、表达式是什么
表达式用于刷选输出哪些类型的数据包,没有表达式将输出所有包。
2、表达式语法结构
tcpdump [options] [not] protocol dir type
参数:
[options]:选项,见e中选项,如:-nnn\-vvv\-XX\-i\-c\e\Q等
[not]
protocol:协议,如tcp/udp/ip/icmp/arp等
dir:数据包抓取的方向,如src(源)、dst(目的)、src and dst和src or dst(默认)
type:抓取类型:如:host/net/port/portrange等
协议(protocol):
通过给定协议限定匹配的数据包类型
#tcpdump -i eth0 -nnn -vvv -c 2 icmp 抓取eth0上2个icmp包
源目(dir):
源目:src、dst
逻辑符:and、or
例如:src、dst、src and dst、src or dst
#tcpdump -v -n -i eth0 -c 4 dst 172.10.1.16 and icmp 抓取目的为172.10.1.16的icmp包
#tcpdump -v -n -i eth0 -c 4 src 172.10.1.16 and tcp 抓取源为172.10.1.16的tcp包
#tcpdump -v -n -i eth0 -c 4 src and dst 172.10.1.16 and icmp 抓取源和目的都为172.10.1.16的icmp包
#tcpdump -v -n -i eth0 -c 4 src or dst 172.10.1.16 and tcp 抓取源或目的为172.19.1.16的tcp包
类型(type):
host(主机IP地址)
#tcpdump -n -v -i eth0 -c 4 host 172.10.1.16 抓取主机为172.10.1.16的数据包4个
port(端口)
#tcpdump -nn -i eth0 -c 4 host 172.10.1.16 and port 80 抓取主机为172.10.1.16的80端口的数据包
portrange(端口范围)
#tcpdump -nn -i eth0 -c 4 host 172.10.1.16 and portrange 1-1014 抓取主机为172.10.1.16的1-1014端口的数据包
net(网络范围)
#tcpdump -nn -i eth0 -c net 172.10.0 抓取网段172.10.0/24范围的包
四、实例
监视指定主机的数据包
打印所有进入或离开master-2(主机名)的数据包。
tcpdump host master-2
也可以指定ip,例如截获所有192.168.139.98 的主机收到的和发出的所有的数据包。
tcpdump host 192.168.139.98
打印master-1与 master-2或者与master-3之间通信的数据包。
tcpdump host master-1 and \( master-2 or master-3 \)
截获主机192.168.139.99 和主机192.168.139.98 或192.168.139.97的通信
tcpdump host 192.168.139.99 and \ (192.168.139.98 or 192.168.139.97 \)
打印master-1与任何其他主机之间通信的IP 数据包,但不包括与master-3之间的数据包。
tcpdump ip host master-1 and not master-3
如果想要获取主机192.168.139.99除了和主机192.168.139.97之外所有主机通信的ip包,使用命令:
tcpdump ip host 192.168.139.99 and ! 192.168.139.97
打印截获主机master-1发送的所有数据
tcpdump -i eth0 src host master-1
打印监视所有送到主机master-1的数据包
tcpdump -i eth0 dst host master-1
监视指定主机和端口的数据包
打印获取主机192.168.139.99接收或发出的telnet包,使用如下命令
tcpdump tcp port 23 and host 192.168.139.99
对本机的udp 123 端口进行监视 123 为ntp的服务端口
tcpdump udp port 123
监视指定网络的数据包
打印本地主机与Berkeley网络上的主机之间的所有通信数据包(nt: ucb-ether, 此处可理解为'Berkeley网络'的网络地址,此表达式最原始的含义可表达为: 打印网络地址为ucb-ether的所有数据包)
tcpdump net ucb-ether
打印所有通过网关snup的ftp数据包(注意, 表达式被单引号括起来了, 这可以防止shell对其中的括号进行错误解析)
tcpdump 'gateway snup and (port ftp or ftp-data)'
打印所有源地址或目标地址是本地主机的IP数据包(如果本地网络通过网关连到了另一网络, 则另一网络并不能算作本地网络。(nt: 此句翻译曲折,需补充)。localnet 实际使用时要真正替换成本地网络的名字)
tcpdump ip and not net localnet
监视指定协议的数据包
打印TCP会话中的的开始和结束数据包, 并且数据包的源或目的不是本地网络上的主机.(nt: localnet, 实际使用时要真正替换成本地网络的名字))
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'
打印所有源或目的端口是80, 网络层协议为IPv4, 并且含有数据,而不是SYN,FIN以及ACK-only等不含数据的数据包。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
(nt: 可理解为, ip[2:2]表示整个ip数据包的长度, (ip[0]&0xf)<<2)表示ip数据包包头的长度(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2. (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) << 2,
即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度不为0, 这就意味着, ip数据包中确实是有数据.对于ipv6版本只需考虑ipv6头中的'Payload Length' 与 'tcp头的长度'的差值, 并且其中表达方式'ip[]'需换成'ip6[]'.)
打印长度超过576字节, 并且网关地址是snup的IP数据包
tcpdump 'gateway snup and ip[2:2] > 576'
打印所有IP层广播或多播的数据包, 但不是物理以太网层的广播或多播数据报
tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'
打印除'echo request'或者'echo reply'类型以外的ICMP数据包( 比如,需要打印所有非ping 程序产生的数据包时可用到此表达式.(nt: 'echo reuqest' 与 'echo reply' 这两种类型的ICMP数据包通常由ping程序产生))
tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'