目录
一、概述
本文主要介绍tcpdump工具的使用参数详解,通过实例方便读者快速掌握。
tcpdump,全称dump the traffic on a network,它使用 libpcap 库来抓取网络数据包,是一个运行在linux平台可以根据使用者需求对网络上传输的数据包进行捕获的抓包工具,windows平台有sniffer、wireshark等工具,tcpdump可以将网络中传输的数据包的“包头”全部捕获过来进程分析,其支持网络层、特定的传输协议、数据发送和接收的主机、网卡和端口的过滤,并提供and、or、not等语句进行逻辑组合捕获数据包或筛选不用的信息。
二、参数解析
参数 | 解析 |
---|---|
-a | 将网络地址和广播地址转变成名字 |
-A | 以ASCII格式打印出所有分组,并将链路层的头最小化 |
-b | 数据链路层上选择协议,包括ip/arp/rarp/ipx都在这一层 |
-c | 指定收取数据包的次数,即在收到指定数量的数据包后退出tcpdump |
-d | 将匹配信息包的代码以人们能够理解的汇编格式输出 |
-dd | 将匹配信息包的代码以c语言程序段的格式输出 |
-ddd | 将匹配信息包的代码以十进制的形式输出 |
-D | 打印系统中所有可以监控的网络接口 |
-e | 在输出行打印出数据链路层的头部信息 |
-f | 将外部的Internet地址以数字的形式打印出来,即不显示主机名 |
-F | 从指定的文件中读取表达式,忽略其他的表达式 |
-i | 指定监听网络接口 |
-l | 使标准输出变为缓冲形式,可以数据导出到文件 |
-L | 列出网络接口已知的数据链路 |
-n | 不把网络地址转换为名字 |
-N | 不输出主机名中的域名部分,例如www.baidu.com只输出www |
-nn | 不进行端口名称的转换 |
-P | 不将网络接口设置为混杂模式 |
-q | 快速输出,即只输出较少的协议信息 |
-r | 从指定的文件中读取数据,一般是-w保存的文件 |
-w | 将捕获到的信息保存到文件中,且不分析和打印在屏幕 |
-s | 从每个组中读取在开始的snaplen个字节,而不是默认的68个字节 |
-S | 将tcp的序列号以绝对值形式输出,而不是相对值 |
-T | 将监听到的包直接解析为指定的类型的报文,常见的类型有rpc(远程过程调用)和snmp(简单网络管理协议) |
-t | 在输出的每一行不打印时间戳 |
-tt | 在每一行中输出非格式化的时间戳 |
-ttt | 输出本行和前面以后之间的时间差 |
-tttt | 在每一行中输出data处理的默认格式的时间戳 |
-u | 输出未解码的NFS句柄 |
-v | 输出稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息 |
-vv | 输出相信的保报文信息 |
三、实例讲解
3.1 常规抓包参数
[root@localhost /]# tcpdump -i eth0 -nn -s0 -v port 80
-i : 选择要捕获的接口,通常是以太网卡或无线网卡,也可以是 vlan 或其他特殊接口。如果该系统上只有一个网络接口,则无需指定。
-nn : 单个 n 表示不解析域名,直接显示 IP;两个 n 表示不解析域名和端口。这样不仅方便查看 IP 和端口号,而且在抓取大量数据时非常高效,因为域名解析会降低抓取速度。
-s0 : tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。
-v : 使用 -v,-vv 和 -vvv 来显示更多的详细信息,通常会显示更多与特定协议相关的信息。
port 80 : 这是一个常见的端口过滤器,表示仅抓取 80 端口上的流量,通常是 HTTP。
额外再介绍几个常用参数:
-p : 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。如果设备接入的交换机开启了混杂模式,使用 -p 选项可以有效地过滤噪声。
-e : 显示数据链路层信息。默认情况下 tcpdump 不会显示数据链路层信息,使用 -e 选项可以显示源和目的 MAC 地址,以及 VLAN tag 信息。
3.2 显示 ASCII 字符串
-A 表示使用 ASCII 字符串打印报文的全部数据,这样可以使读取更加简单,方便使用 grep 等工具解析输出内容。-X 表示同时使用十六进制和 ASCII 字符串打印报文的全部数据。这两个参数不能一起使用。例如:
[root@localhost /]# tcpdump -A -s0 port 80
3.3 抓取特定协议的数据
后面可以跟上协议名称来过滤特定协议的流量,以 UDP 为例,可以加上参数 udp 或 protocol 17,这两个命令意思相同。
[root@localhost /]# tcpdump -i eth0 udp
[root@localhost /]# tcpdump -i eth0 proto 17
同理,tcp 与 protocol 6 意思相同。
3.4 抓取特定主机的数据
使用过滤器 host 可以抓取特定目的地和源 IP 地址的流量。
[root@localhost /]# tcpdump -i eth0 host 10.10.1.1
也可以使用 src 或 dst 只抓取源或目的地:
[root@localhost /]# tcpdump -i eth0 dst 10.10.1.20
tcpdump udp port 53 #监听本机udp的53端口的数据包,udp是dns协议的端口,这也是一个dns域名解析的完整过程
3.5 将抓取的数据写入文件
使用 tcpdump 截取数据报文的时候,默认会打印到屏幕的默认输出,你会看到按照顺序和格式,很多的数据一行行快速闪过,根本来不及看清楚所有的内容。不过,tcpdump 提供了把截取的数据保存到文件的功能,以便后面使用其他图形工具(比如 wireshark,Snort)来分析。
-w 选项用来把数据报文输出到文件:
[root@localhost /]# tcpdump -i eth0 -s0 -w test.pcap
[root@localhost /]# yum install wireshark
[root@localhost /]# wireshark -r test.pcap
3.6 多条命令结合使用
[root@localhost /]# tcp port 22 and host 192.168.22.254