学习tcpdump
作者:kongjianjun at gmail.com">孔建军
1. tcpdump介绍
tcpdump 是一款开源的网络数据截取分析工具,具有强大的功能和灵活的截取策略,用在网络维护、入侵检测等方面。它支持针对网络层、协议、主机、网络或端口的过滤,正则表达式的灵活应用能帮你准确获取有用信息。tcpdump 具备开源软件的优势,接口公开,具有较强的可扩展性。运行此命令必须有root权限,它通过将网络接口设置为混杂模式,绕过标准TCP/IP堆栈,进行工作。出于安全等问题考虑,FreeBSD里通过内核取消对伪设备bpfilter的支持,来屏蔽tcpdump之类的网络分析工具。在linux下可采用软件包或编译源代码的方式安装。
tcpdump官方网站:http://www.tcpdump.org/">http://www.tcpdump.org/>
2. 运行效果:
kongove at ubuntu:~/Desktop$ sudo tcpdump -i eth0
07:27:47.755975 arp who-has 172.17.35.153 tell 172.17.35.153
3. 基本使用:
tcpdump [ -AdDeflLnNOpqRStuUvxX ] [ -c count ] [ -C file_size ] [ -F file ] [ -i interface ] [ -m module ] [ -M secret ][ -r file ] [ -s snaplen ] [ -T type ] [ -w file ] [ -W filecount ][ -E spi at ipaddr algo:secret,... ] [ -y datalinktype ] [ -Z user ] [ expression ]
通过对 tcpdump 选项、参数、表达式的组合应用,从大流量的网络数据当中,过滤出真正有用的信息,从而缩小分析范围。
3.1 tcpdump 选项:
选项 | 含义 |
---|---|
-A | 以ASCII格式打印出所有分组,并将链路层的头最小化。 |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出; |
-D | 打印出系统中所有可以用tcpdump截包的网络接口; |
-ddd | 将匹配信息包的代码以十进制的形式输出; |
-e | 在输出行打印出数据链路层的头部信息; |
-f | 将外部的Internet地址以数字的形式打印出来; |
-l | 使标准输出变为缓冲行形式; |
-L | 列出网络接口的已知数据链路; |
-n | 不把网络地址转换成名字; |
-N | 不输出主机名中的域名部分,如“kongove.ubuntu.cn”只输出“kongove”; |
-O | 不运行分组分组匹配(packet-matching)代码优化程序; |
-p | 不将网络接口设置成混杂模式; |
-q | 快速输出,只输出较少的协议信息; |
-S | 将tcp的序列号以绝对值形式输出,而不是相对值; |
-t | 在输出的每一行不打印时间戳; |
-u | 输出未解码的NFS句柄; |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; |
-vv | 输出详细的报文信息; |
-c count | 指定监听数据包数量,当收到指定的包的数目后,tcpdump就会停止; |
-C file_size | 限定数据包写入文件大小; |
-F file | 从指定的文件中读取表达式,忽略其它的表达式; |
-i interface | 指定监听网络接口; |
-m module | 打开指定的SMI MIB组件; |
-M secret | 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详见RFC 2385); |
-r file | 从指定的文件中读取包(这些包一般通过-w选项产生); |
-s snaplen | 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节; |
-T type | 将截取的数据包直接解释为指定类型的报文,常见类型有rpc(远程过程调用)和snmp(简单网络管理协议),还包括aodv、cnfp、rpc、rtp、rtcp、snmp、tftp、vat、wb等; |
-w file | 指定将监听到的数据包写入文件,直接将包写入文件中,并不分析和打印出来; |
-W filecount | 限定数据包写入文件数量; |
-E spi at ipaddr algo:secret,... | 用spi at ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组; |
expression | 综合参数表达式。 |
3.2 tcpdump的表达式介绍
tcpdump利用正则表达式作为过滤报文的条件,如果数据包满足表达式的条件,则会被捕获。如果没有给出任何条件,则网络上所有的数据包将会被截获。表达式中常用关键字如下:
第一种是指定参数类型的关键字,主要包括host,net,port等,如果没有指定类型,缺省的类型是host;
如:tcpdump host 222.24.20.86 截获ip为222.24.20.86的主机收发的所有的数据包
第二种是指定数据报文传输方向的关键字,主要包括src , dst ,dst or src, dst and src,缺省为src or dst。
如:tcpdump src net 222.24.20.1 截取源网络地址为 222.24.20.1 的数据包
第三种是指定协议的关键字,主要包括fddi,ip,arp,rarp,tcp,udp等类型,默认监听所有协议的数据包;
如:tucpdump arp 截获arp协议的数据包
其他重要的关键字还有,gateway,broadcast,less,greater,三种逻辑运算(取非运算是 'not ','! '; 与运算是 'and ','&& ';或运算 是'or ','|| ')等。这些关键字的巧妙组合,能灵活构造过滤条件,从而满足用户需要。
3.3 tcpdump的输出信息
tcpdump命令四种典型的输出信息:
- 1) 数据链路层头信息
- 2) ARP包的TCPDUMP输出信息
- 3) TCP包的输出信息
- 4) UDP包的输出信息
使用命令:tcpdump -e host host1
输出结果:11:15:12.247009 eth0 < 88:0:0:7:2b:26 0:90:27:58:af:1a ip 60: host2.25258 > host1.telnet 0:0(0) ack 22552 win 7890 (DF)
分析:“11:15:12”是显示的时间,“247009”是ID号,“eth0 <”表示从网络接口eth0接受该数据包,“88:0:0:7:2b:26”为发送数据主机的MAC地址,“ ip”是表明该数据包是IP类型数据包,“60”是数据包的长度,“ host2.25258 > host1.telnet”表明该数据包是从主机host2的25258端口发往主机host1的TELNET(23)端口。“ack 22552”表明对序列号是22552的包进行响应。“ win 7890”表明发送窗口的大小是7890。
使用命令:tcpdump arp
输出结果:22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
分析:“eth0 >”表示从网络接口eth0发送数据包。
输出信息:
src > dst: flags data-seqno ack window urgent options
分析:“src > dst:”表明从源地址到目的地址, flags是TCP包中的标志信息(S是SYN标志,F(FIN),P(PUSH),R(RST),"."(没有标记));data-seqno是数据包中的数据的顺序号,ack是下次期望的顺序号,window是接收缓存的窗口大小,urgent表明数据包中是否有紧急指针,Options是选项。
输出信息:
host.p1 > linux.p2: udp lenth
分析:从主机host的p1端口发出的一个udp类型数据包到主机linux的p2端口,包的长度是lenth。
4. 功能扩展
tcpdump还可以结合tcpshow、管道、重定向使用,从而扩展其功能。
5. 总结
6. 参考资料
man手册
http://www.tcpdump.org/">tcpdump官方网站帮助文档