1. 简述
tcpdump 是一款广泛使用的命令行网络分析工具,它能够捕获和分析网络上的数据包。这个强大的工具对于网络故障排查、安全监控和网络流量分析非常有用。
值得注意的是,通过tcpdump抓取的数据还可以通过保存为*.pcap文件,然后使用wireshark进行更深层次的可视化分析。
2. 基本语法
tcpdump 的基本语法如下:
tcpdump [options] ... [expression]
其中,
options:用于指定如何捕获和显示数据包的各种参数。
expression:用于过滤捕获的数据包。
3. 常用选项
****-i <interface>:****指定网络接口,如 eth0。
****-nn:****不要解析网络名称(例如,不要将IP地址转换为主机名)。
****-X 或 -XX:****显示十六进制和 ASCII 编码的数据。如下所示,除第一行以外,数据域用HEX形式进行打印输出,同时也伴有ASCII输出。
****-A:****将接收到的数据以ASCII码的形式打印出来,如下所示,除第一行外,数据域都是ASCII码。
****-w <file>:****将捕获的数据包写入文件,用于后续分析。
****-r <file>:****从文件中读取数据包。
****-c <count>:****捕获指定数量的数据包后停止。
除以上常用的选项以外,还有如下,可灵活使用。
****-C:****在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
****-d:****将匹配信息包的代码以人们能够理解的汇编格式给出。
****-dd:****将匹配信息包的代码以c语言程序段的格式给出。
****-ddd:****将匹配信息包的代码以十进制的形式给出。
****-D:****打印出系统中所有可以用tcpdump截包的网络接口。
****-e:****在输出行打印出数据链路层的头部信息。
****-E:****用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
****-f:****将外部的Internet地址以数字的形式打印出来。
****-F:****从指定的文件中读取表达式,忽略命令行中给出的表达式。
****-l:****使标准输出变为缓冲行形式,可以把数据导出到文件。
****-L:****列出网络接口的已知数据链路。
****-m:****从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
****-M:****如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
****-b:****在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
****-n:****不把网络地址转换成名字。
****-N:****不输出主机名中的域名部分。例如,'nic.ddn.mil'只输出'nic'。
****-t:****在输出的每一行不打印时间戳。
****-O:****不运行分组分组匹配(packet-matching)代码优化程序。
****-P:****不将网络接口设置成混杂模式。
****-q:****快速输出。只输出较少的协议信息。
****-S:****将tcp的序列号以绝对值形式输出,而不是相对值。
****-s:****从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
****-T:****将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
****-t:****不在每一行中输出时间戳。
****-tt:****在每一行中输出非格式化的时间戳。
****-ttt:****输出本行和前面一行之间的时间差。
****-tttt:****在每一行中输出由date处理的默认格式的时间戳。
****-u:****输出未解码的NFS句柄。
****-v:****输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
****-vv:****输出详细的报文信息。
4. 过滤表达式
host <hostname>:只捕获与指定主机名或IP地址相关的数据包。
port <port>:只捕获特定端口的数据包。
src <address>:只捕获源地址为指定地址的数据包。
dst <address>:只捕获目的地址为指定地址的数据包。
and、or、not:逻辑运算符,用于组合多个过滤条件。
5. 示例
(1)捕获所有经过eth0接口的TCP数据包:
tcpdump -i eth0 tcp
(2)捕获指定接口的所有数据包,并写入文件:
tcpdump -i eth0 -w capture.pcap
(3)从文件中读取数据包:
tcpdump -r capture.pcap
(4)只捕获源地址为192.168.1.100的数据包:
tcpdump src 192.168.1.100
(5)只捕获目的端口为80的数据包:
tcpdump 'dst port 80'
(6)同时根据源地址和目的端口过滤数据包:
tcpdump 'src 192.168.1.100 and dst port 80'
(7)实时显示数据包的十六进制和ASCII编码:
tcpdump -X -nn -i eth0
(8)捕获特定数量的数据包:
tcpdump -c 100 -i eth0
(9)使用复杂过滤表达式:
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst 192.168.1.0/24'
6. 高级用法
使用 tcpdump 进行实时监控:
tcpdump -i any 'tcp port 22' -l -n -vvv -s 0 -w ssh_traffic.pcap
这个命令实时捕获所有进入22端口的TCP数据包,不解析主机名,不限制源和目的端口,不使用任何捕获长度限制,并将结果写入 ssh_traffic.pcap 文件。
分析 tcpdump 捕获的数据包: 使用 -nnX 选项可以显示更详细的信息,包括每个数据包的十六进制和ASCII编码,这对于深入分析数据包内容非常有用。
7. 使用wireshark分析
(1)写入本地
使用tcpdump进行抓包时,通过"-w"选项,将抓到的数据包写入本地,参考如下。
tcpdump -i eth0 -w capture.pcap
(2)wireshark导入
在 Wireshark 中,选择 "File"(文件)> "Open"(打开),然后浏览到你保存 tcpdump 捕获数据的 .pcap 文件。选择文件并点击 "Open"(打开)。
(3)过滤分析
通过wireshark的过滤功能,协议分析功能以及图像化显示功能,分析当前数据包,并可将分析结果写入本地。
8. 注意事项
(1)使用 tcpdump 可能需要管理员权限,尤其是在捕获经过网络接口的数据包时。
(2)过滤表达式需要仔细设计,以确保只捕获所需的数据包。
(3)分析 tcpdump 的输出需要一定的网络协议知识。
(4)tcpdump 是网络管理员和安全专家的重要工具,通过掌握其使用,可以更有效地监控和分析网络流