01-tcmpdump初级使用
tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。当然也可以将完整的抓取报文保存为文件,使用wireshark进行更加深入的分析。
tcpdump [ -nn ] [ -c count ] [ -i interface ] [ -w file ] [ -s snaplen ] [-v|vv|vvv] [ expression ]
常用的组合:
tcpdump -env -i interface
- -nn:将主机地址显示为ip,服务名显示为port
- -i:指定网卡设备interface,表示通过哪一个网卡抓包。一般有eth0,lo(回环接口),any(任意一块网卡)。默认为第一块网卡。如果想知道可以通过哪几个网卡抓包,可以使用tcpdump –D查看。
- -X:以十六进制和ASCII两种方式显示报文头部和内容
- -A:仅以ASCII码的形式显示报文头和内容
- -w:将抓取的包内容存储成文件(二进制),使用
tcpdump -r /var/tcp.cap查看或使用wireshark,例如:tcpdump -nn -i eth0 -s 0 host 192.168.5.242 and port 9001 -w /tmp/242.cap。 - -r:读取包文件,可以结合过滤器对抓包数据分析。例如
tcpdump –r google.cap http,这句命令的意思是让tcpdump读取google.cap文件,把其中http协议的数据包都给过滤出来。 - -c:指定抓包数量count
- -s snaplen:设置捕获数据包的长度,抓取数据包时,默认抓取长度为68字节。加上-s 0后可以抓到完整的数据包
tcpdump除了使用参数,还可以使用关键字。从最简单的开始,过滤器(BPF语言)主要由一个限定词和标志(可以理解为限定词的参数)组成,限定词(关键字)有三种:
第一种是关于类型的关键字,主要包括host,net,port,portrange :
host, 定义抓取哪个IP地址(也可以给它mac地址,格式是
00:00:00:00:00:00)的数据包,比如我想抓有关192.168.0.148这个IP地址的数据包,那么就写成tcpdump host 192.168.0.148, host是限定词,192.168.0.148就是标志。这条命令会抓取从发出或者向192.168.0.148发送的数据包。如果没有指定类型,缺省的类型是host.net, 定义抓取某个网络的数据包,给出网络号就行了,它根据给的网络号字节数是1,2,3来判断A类地址,B类地址或者C类地址,比如
tcpdump net 10.1.1,它就认为这是一个C类地址。port,指定端口,比如
tcpdump host and port 22, 这是抓端口为22的数据包,不管是TCP还是UDP的,这里我稍微早一点的给出了逻辑操作,and,如果只想抓TCP的,那么可以写tcpdump host 192.168.0.148 and tcp port 22。portrange,顾名思义,这个是指定端口范围的,用连字符”-”指定范围,比如
tcpdump port 1025-8080
第二种是关于传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,这些关键字指明了传输的方向。
src:如果指向抓从发出的数据包可以使用限定词src, 命令:tcpdump src host 192.168.0.148,
dst:反过来,想抓发向192.168.0.148的数据包,使用限定词dst,命令:tcpdump dst host 192.168.0.148。tcpdump dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则缺省是src or dst关键字。src和dst一般用于修饰第一类类型关键字,例如src host、dst port。
第三种是协议的关键字,主要包括ether,wlan,fddi,ip,arp,rarp,tcp,udp,icmp等类型。
fddi指明是在FDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。
其他的几个关键字就是指明了监听的包的协议内容。
如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast, less, greater
三种逻辑运算,可以用于修饰关键字或关键字的参数:
- 非 :
! or "not"(去掉双引号) - 且 :
&& or "and" - 或 :
|| or "or" - 括号(需要转义或者将整个规则放在引号中)
可以使用这些逻辑运算符将关键字组合起来构成强大的组合条件来满足人们的需要。默认逻辑运算符为and。
- 多个关键字如果要在同一条命令中使用就需要使用逻辑运算符来连接(注意连接的不是参数,而是关键字),例如
host 192.168.5.242 and port 9001。同等地位的关键字参数也可以用逻辑运算符连接。例如host 192.168.0.71 and 192.168.0.70 - 使用括号时,所有关键字语句都要放在引号中。或者对括号进行转义,例如:
tcpdump -nn -i eth0 -s 0 '(src host 192.168.5.242 and src port 9002 and dst host 192.168.5.68) or (src host 192.168.5.68 and dst host 192.168.5.242 and dst port 9002)'
# 抓取所有的数据包
tcpdump -nn
# 抓取100个包
tcpdump -nn -c 100
# 抓取eth0网卡上的包,100个
tcpdump -nn -i eth0 -c 100
# 设置捕获数据包的长度,抓取数据包时,默认抓取长度为68字节。加上-s0后可以抓到完整的数据包
tcpdump -nn -s0
#-w 将抓取的包内容存储成文件(二进制),使用tcpdump -r /var/tcp.cap查看。
tcpdump -nn -i eth0 -c 100 -w /var/tcp.cap
# 抓取的包描述信息(header,即tcpdump的默认输出信息)存储成文件,使用cat查看
tcpdump -nn -i eth0 -c 100 > /var/tcp.cap
# 抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据
tcpdump -nn -i eth1 host 192.168.1.1
# 指定源地址
tcpdump -nn -i eth1 src host 192.168.1.1
# 指定目的地址
tcpdump -nn -i eth1 dst host 192.168.1.1
# 抓取所有经过eth1,目的或源端口是25的网络数据
tcpdump -nn -i eth1 port 25
# 指定源端口
tcpdump -nn -i eth1 src port 25
# 指定目的端口
tcpdump -nn -i eth1 dst port 25
# 指定主机IP
tcpdump -nn -i eth1 host 192.168.0.100
# 指定源IP
tcpdump -nn -i eth1 src host 192.168.0.100
# 指定网络
tcpdump -nn -i eth1 net 192.168
# 指定源地址的网络
tcpdump -nn -i eth1 src net 192.168
# 指定目标地址的网络
tcpdump -nn -i eth1 dst net 192.168
tcpdump -i eth1 arp
tcpdump -i eth1 ip
tcpdump -i eth1 tcp
tcpdump -i eth1 udp
tcpdump -i eth1 icmp
tcpdump -i eth1 vrrpv2
tcpdump -i eth1 vlan 1 #抓vlan 1的包
# 抓取经过eno1677736端口的tcp协议,源端口和目标端口为80的包
tcpdump -nn -i eno16777736 tcp [and] port 80 #tcp和port之间省略了and
# 主机192.168.0.70与192.168.0.71之间的通信
tcpdump -nn -i eno16777736 host 192.168.0.71 and 192.168.0.70
# 抓取所有经过eth1,目的地址是192.168.1.254或192.168.1.200端口是80的TCP数据
tcpdump -i eth1 '((tcp) and (port 80) and ((dst host 192.168.1.254) or (dst host 192.168.1.200)))'
# 抓取所有经过eth1,目标MAC地址是00:01:02:03:04:05的ICMP数据
tcpdump -i eth1 '((icmp) and ((ether dst host 00:01:02:03:04:05)))'
# 抓取所有经过eth1,目的网络是192.168,但目的主机不是192.168.1.200的TCP数据
tcpdump -i eth1 '((tcp) and ((dst net 192.168) and (not dst host 192.168.1.200)))'
# 主机192.168.0.70与192.168.0.71或192.168.0.72之间的通信
tcpdump -nn -i eno16777736 host 192.168.0.71 and \(192.168.0.70 or 192.168.0.71\)
# 抓取192.168.5.68(浏览器)与192.168.5.242:9002之间的数据包:
tcpdump -nn -i eth0 -s 0 '(src host 192.168.5.242 and src port 9002 and dst host 192.168.5.68) or (src host 192.168.5.68 and dst host 192.168.5.242 and dst port 9002)'