[TOC]
描述:tcpdump 命令是一款sniffer工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用-w选项 test.pcap 将数据包保存到文件中,方便wireshark以后分析,同时它也是一个学习网络通信协议必备;
#基础语法与选项
tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
#参数
-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<数据包文件>:把数据包数据写入指定的文件。
1)第一种是关于类型的关键字:
主要包括:host,net,port #如果没有指定类型,缺省的类型是host.
例如:host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明 202.0.0.0是一个网络地址,port 23 指明端口号是23。
2)第二种是确定传输方向的关键字:
主要包括:src(源地址), dst(目的地址),dst or src, dst and src #这些关键字指明了传输的方向
例如:src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 ,如果没有指明方向关键字,则缺省是src or dst关键字。
3)第三种是协议的关键字:
主要包括:fddi,ip,arp,rarp,tcp,udp # 类型
Fddi指明是在FDDI(分布式光纤数据接口网络)上的特定 的网络协议,实际上它是"ether"的别名,fddi和ether具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。其他的几个关键字就是指明了监听的包的协议内容,如果没有指定任何协议,则tcpdump将会监听所有协议的信息包。
补充类型:gateway, broadcast,less,greater
4)还有三种逻辑运算,
取非运算是 'not ' '! ',
与运算是'and','&&'
或运算 是'or' ,'||',
实际案例:
#示例0. 直接启动tcpdump将监视第一个网络接口上所有流过的数据包
tcpdump
tcpdump -i lo #抓取回环网口的包 ICMP->64bit数据
# ping 127.0.0.1 -c 3
# PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
# 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.018 ms
# 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.047 ms
10:46:14.721374 IP localhost > localhost: ICMP echo request, id 6085, seq 1, length 64
10:46:14.721379 IP localhost > localhost: ICMP echo reply, id 6085, seq 1, length 64
10:46:15.721181 IP localhost > localhost: ICMP echo request, id 6085, seq 2, length 64
10:46:15.721189 IP localhost > localhost: ICMP echo reply, id 6085, seq 2, length 64
10:46:16.721137 IP localhost > localhost: ICMP echo request, id 6085, seq 3, length 64
10:46:16.721145 IP localhost > localhost: ICMP echo reply, id 6085, seq 3, length 64
#示例1.指定网卡与端口抓包病并写入文件
tcpdump -i eth0 -nnX port 21 #指定端口抓包
tcpdump -i eth0 -nnX port 21 -c 12 -vv -w test.pcap #写入到test.pcap文件
tcpdump tcp port 23 host 210.27.48.1 # 监视指定主机和端口的数据包,接收或发出的telnet包
#示例2.读取之前产生的 tcpdump 文件
$ tcpdump -r packets_file.pcap
#示例3.要获取整个网络的数据包
tcpdump -i ens192 net 10.10.107.0/24
# 10:53:24.804535 IP 10.20.172.108.51147 > localhost.localdomain.ssh: Flags [.], ack 1872256, win 16425, length 0
# 10:53:24.804537 IP localhost.localdomain.ssh > 10.20.172.108.51147: Flags [P.], seq 1872256:1872384, ack 3505, win 343, length 128
#示例4.根据IP地址查看报文,不管是作为源地址还是目的地址
$ tcpdump host 192.168.1.100
$ tcpdump -i eth0 src host hostname #只对机器名为hostname的主机的通信数据包进行监视,主机名可以是本地主机,也可以是网络上的任何一台计算机。
#要指定 IP 地址是源地址或是目的地址则使用:
$ tcpdump src 192.168.1.100
$ tcpdump dst 192.168.1.100
tcpdump -i ens192 src 10.20.172.108 -vv -nnX #十六进制展示
# tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
# 10:56:00.410729 IP (tos 0x0, ttl 127, id 29668, offset 0, flags [DF], proto TCP (6), length 40)
# 10.20.172.108.51147 > localhost.localdomain.ssh: Flags [.], cksum 0x097b (correct), seq 362959904, ack 1096206029, win 16425, length 0
#示例5.指定协议查询
tcpdump arp -i ens192 -vv -nnX
# tcpdump: listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
# 11:07:37.543934 ARP, Ethernet (len 6), IPv4 (len 4), Request who-has 10.10.107.222 tell 192.168.3.1, length 46
# 0x0000: 0001 0800 0604 0001 d4a1 48a4 5e07 c0a8 ..........H.^...
# 0x0010: 0301 0000 0000 0000 0a0a 6bde 0000 0000 ..........k.....
#示例7.关键字可以组合起来构成强大的组合条件
tcpdump host helios and \( hot or ace \) # 打印helios 与 hot 或者与 ace 之间通信的数据包
tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) #截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信
tcpdump ip host ace and not helios # 打印ace与任何其他主机之间通信的IP 数据包, 但不包括与helios之间的数据包.
tcpdump ip host 210.27.48.1 and ! 210.27.48.2 #获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包
#示例8.指定端口范围的数据包
$ tcpdump tcp portrange 22-125 -nnX -i ens192 #要捕获某个端口或一个范围的数据包
$ tcpdump udp portrange 22-125 -nnX -i ens192 #要捕获某个端口或一个范围的数据包
# 1 packet captured == 捕获的封包数量
# 29 packets received by filter == 被过滤过的总封包个数
# 137 packets dropped by kernel == 被核心所丟棄的封包
#示例9.检查监视通过指定网关的数据,以及到指定端口的TCP或UDP数据包:
tcpdump -i eth0 gateway Gatewayname
tcpdump -i eth0 host hostname and port 80
#示例10.高级网络
# 注意:表达式被单引号括起来了,这可以防止shell对其中的括号进行错误解析
tcpdump net ucb-ether # 打印本地主机与Berkeley网络上的主机之间的所有通信数据包
tcpdump 'gateway snup and (port ftp or ftp-data)' # 打印所有通过网关snup的ftp数据包
tcpdump ip and not net localnet # 打印所有源地址或目标地址是本地主机的IP数据包
#如果本地网络通过网关连到了另一网络,则另一网络并不能算作本地网络。
#示例11:如果使用 VMkernel 接口 vmk0 和位于 10.11.12.13 的 NTP 服务器:
tcpdump-uw -c 5 -n -i network_interface host ntp_server_ip_address and port 123
tcpdump-uw -c 5 -n -i vmk0 host 10.11.12.13 and port 123
WeiyiGeek.示例5
WeiyiGeek.案例7