Tcpdump使用详解

 

这个帖子发表在学校的清水河畔BBS上,转载过来和大家分享。

 

-----------------华丽的分割线--------------------------------------------

 

Tcpdump 使用详解

相信做网络编程的童鞋对这个瑞士军刀一定不陌生,没用过也至少听过吧。侯捷云“源码面前了无秘密”, geekard云“tcpdump面前TCP/IP了无秘密”。这个帖子总结了tcpdump的常用选项以及使用示例,一方面向大家介绍它的使用方法,另一方面对有基础的童鞋是一个很好的参考手册。

SYNOPSIS(概要)
tcpdump [ -ADeflnNqtvx ] [ -c count ] [ -i interface ] [ -r file ] [ -s snaplen] 
         [ -T type ] [ -w file ] [ expression ] 
选项 (OPTIONS)
-A 
Print each packet (minus its link level header) in ASCII.  Handy forcapturing web pages
[
应用] 在网关服务器中输入:tcpdump–A src host 192.168.x.y
[摘取]17:10:56.934040IP 192.168.x.y.icp > by2msg1231711.mixer.edge.messenger.live.com.msnp: . ack4165501895 win 64719
E..(..@...qF.......+.X.G...v.H..P....]........
[分析]以ASCII格式打印除链路层的头部信息的包,这个选项更有益与web页面的抓取.上面是我对源192.168.x.y包的抓取,一看就知道,它现在连接到MSN。
-e 
每行都显示链路层报头.
[应用] tcpdump -e src host 192.168.x.y
[摘取]17:19:57.71846600:14:22:d2:9e:d0 (oui Unknown) > 00:c0:9f:40:29:6a (oui Unknown), ethertypeIPv4 (0x0800), length 60: 192.168.x.y.acp-conduit > 65.54.167.59.http: R2561727994:2561727994(0) ack 425901151 win 0
[分析]这是针对链路层包分析,看看是不是你想要的呢?
-c 
当收到count个报文后 退出.
[应用] tcpdump -e -c 2 src host 192.168.x.y
[摘取]
listening on eth0,link-type EN10MB (Ethernet), capture size 96 bytes
13:54:15.963937 IP192.168.x.y.ridgeway2 > 218.93.16.107.http: F 1728282061:1728282061(0) ack2139349129 win 65004
13:54:15.965416 IP192.168.x.y.gwen-sonya > 218.93.16.107.http: S 3089588305:3089588305(0) win65535 <mss 1460,nop,nop,sackOK>
2 packets captured
7 packets receivedby filter
0 packets droppedby kernel
[分析看到没有,我只要抓取两个匹配包,就OK了。
 
-D
Print the list ofthe network interfaces available on the system and on which tcpdump can  capture packets.  For each networkinterface, a number and an interface  name, possibly followed  by  a text description of the interface, is printed. The interface name or the number can be supplied to the -i flag to specify aninterface on which to capture
[
应用] tcpdump -D
[摘取]
1.eth0
2.eth1
3.eth2
4.any(Pseudo-device that captures on all interfaces)
5.lo
[分析]打印可以被tcpdump抓取的接口名称。可以提供给-i参数,EX:tcpdump –i eth1
-i 
监听interface接口. 如果不指定接口, tcpdump在系统的接口清单中, 寻找号码最小, 已经配置好的接口(loopback 除外). 选中的时候会中断连接.
[应用] tcpdump –i eth0 ip src 192.168.x.y
[摘取]
14:01:15.700262 IP218.83.12.11.32785 > ns-pd.online.sh.cn.domain:  29083+ PTR?20.152.83.218.in-addr.arpa. (44)
[分析]抓取eth0接口的数据包
-f 
用数字形式显示 '外部的' 互联网地址, 而不是字符形式 (如:tcpdump-f -i eth0 -c 4 src host 192.168.x.y)
[应用]tcpdump -i eth1 –f
[摘取] 14:03:25.655826 IP207.46.124.244.msnp > 218.83.12.11.kpop: P 259:847(588) ack 1 win 64158
[分析]与前一个应用对比,你能发现在摘取中的互联网地址都会以IP显示,而不在有域名啦。。。
-l 
行缓冲标准输出. 可用于捕捉数据的同时查看数据. 例如,
[应用] tcpdump -i eth1 -f-l|tee tcpdump.log
[摘取]
tcpdump: verboseoutput suppressed, use -v or -vv for full protocol decode
listening on eth1,link-type EN10MB (Ethernet), capture size 96 bytes
14:11:57.582718
14:11:58.058394802.1d config 81b6.00:1e:14:9f:f7:00.801a root 8000.00:04:80:78:c0:dd pathcost19 age 1 max 20 hello 2 fdelay 15
[分析]结合系统命令,使抓取分析数据更加灵活与强大,我爱这个功能…
-n 
不把地址转换成名字 (如主机地址, 端口号等)
[应用] tcpdump -i eth0src host 192.168.x.y -n
[摘取]14:17:30.686094IP 192.168.x.y.10778 > 121.62.99.137.14808: UDP, length 1050
[
分析]抓取的数据包不会将数字地址转换成名字
-N
不显示主机名字中的域名部分
[应用] tcpdump -i eth0src host 192.168.x.y -n
[摘取]14:16:45.824513IP 192.168.x.y.alias > by1msg3145607.msnp: . ack 1894015094 win 64827
[分析抓取的数据包中不会将域名的部分显示,看by1msg3145607.msnp,典型是省略了很长一段的域名部分(msn的)
-q 
快速输出. 显示较少的协议信息, 输出行将短一点点.
[应用] tcpdump -i eth0src host 192.168.x.y -q
[摘取]14:21:48.669851IP 192.168.x.y.tgp > by1msg4082316.phx.gbl.msnp: tcp 0
[
分析]打印较短的协议,用与快速分析。
-w 
把原始报文存进file, 不分析也不显示. 它们可以以后用 -r 选项显示. 如果 file 是 “-'', 就写到标准输出.(如:tcpdump -e src host 192.168.x.y -w /tmp/tcpdump.log)
-r 
从file中读入数据报 (文件是用 -w 选项创建的). 如果 file 是“-'', 就读标准输入. (如:tcpdump -e src host 192.168.x.y -r/tmp/tcpdump.log)
[分析]以上-w,-r,的作用是相反的,一个是将抓取的包写入到指定文件,一个是根据上次写入的文件来读取分析。没有上次的-w操作,-r是无法使用的,除非用”-”,不过如果你用more,cat是无法读通这个文件的,不像用”|”,借助tee 可以为以后方便
-s
Tcpdumpm默认捕获并识别数据包的前96字节(头部,非数据部分),如果你想让其看到的更多,则可以使用-s number选项。如果number为0,则表示嗅探的长度为无限大。
-S
改变tcpdump显示序列号(sequence number)由相对到绝对。
-t 
禁止显示时戳标志.
[应用] tcpdump -i eth0src host 192.168.x.y  -t
[摘要]
IP192.168.x.y.sonardata > 218.93.16.107.http: . ack 1225435221 win 65535
IP192.168.x.y.sonardata > 218.93.16.107.http: P 0:907(907) ack 1 win 65535
IP192.168.x.y.sonardata > 218.93.16.107.http: . ack 208 win 65328
[分析]看下面
-tt 
显示未格式化的时戳标志.
[应用] tcpdump -i eth0src host 192.168.x.y -tt
[摘要]
1247207645.823506IP 192.168.x.y.isis > 61.172.205.8.msnp: . ack 53 win 64309
1247207645.840496IP 192.168.x.y.isis > 61.172.205.8.msnp: P 70:74(4) ack 123 win 64239
1247207645.881594IP 192.168.x.y.isis > 61.172.205.8.msnp: P 74:122(48) ack 123 win 64239
[分析]-t与-tt对比,一看就很清楚了,是时间显示控制和时间格式控制
-v 
(稍微多一点) 繁琐的输出. 例如, 显示IP数据报中的生存周期和服务类型.
-vv 
更繁琐的输出. 例如, 显示NFS应答报文的附加域. 
-x 
以十六进制数形式显示每一个报文 (去掉链路层报头后) . 可以显示较小的完整报文
-X
同上,但是包括链路层报头
-XX
[分析]-v,-vv,-x通过上面的叙述,我想大家试一下,一定就会很明白了,至与那个选项更适合大家,那就是看应用了,我想这些选项也够大家用了吧!~反正够我用了,呵呵!~
 
expression (表达式)
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被dump。如果没有给出任何条件,则网络上所有的信息包将会被截获。

express语法:
 
[类型] [方向] [协议] ] 标识
 
expression由一个或多个原语 (primitive) 组成. 原语通常由一个标识(id,名称或数字)和标识前面的一个或多个修饰字(qualifier) 组成. 修饰字有三种不同的类型: 
(1)type 
类型修饰字指出标识名称或标识数字代表什么类型的东西. 可以使用的类型有host, net 和 port. 例如,`host foo', `net 128.3', `port 20'. 如果不指定类型修饰字, 就使用缺省的 host
(2)Direction 
方向修饰字指出相对于标识的传输方向 (数据是传入还是传出标识). 可以使用的方向有 src, dst, src or dst 和 src and dst. 例如, `src foo', `dst net128.3', `src or dst port ftp-data'. 如果不指定方向修饰字, 就使用缺省的src or dst . 对于 `null' 链路层 (就是说 象 slip 之类的 点到点 协议), 用 inbound和outbound修饰字指定所需的传输方向. 
(3)proto
协议修饰字要求匹配指定的协议. 可以使用的协议有: ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp. 例如,ether src foo', `arp net 128.3',`tcp port 21'. 如果不指定协议修饰字, 就使用所有符合类型的协议. 例如,`src foo' 指 `(ip or arp or rarp) src foo', `net bar' 指 `(ip or arp or rarp) net bar', `port 53' 指`(tcp or udp) port 53'. 
[`fddi' 实际上 是 `ether' 的 别名; 分析器把它们视为 ``用在指定网络接口上的数据链路层.'' FDDI 报头包含类似于以太协议的源目地址, 而且通常包含 类似于以太协议的报文类型, 因此你可以分析 FDDI 域, 就象分析以太协议一样.FDDI报头也包含其他域, 但是你不能在过滤器表达式里显式描述.]

作为上述的补充, 有一些特殊的 `原语' 关键字, 它们不同于上面的模式:gateway, broadcast, less, greater和数学表达式. 这些在后面有叙述. 

更复杂的过滤器表达式 可以通过 and, or 和 not 连接原语来组建. 例如,`host foo and not port ftp and not port ftp-data'. 为了少敲点键, 可以忽略相同的修饰子. 例如,`tcp dst port ftp or ftp-data or domain' 实际上 就是 `tcpdst port ftp or tcp dst port ftp-data or tcp dst port domain'. 

允许的 原语 有: 
dst host host 
如果报文中IP的目的地址域是 host, 则逻辑为真. host既可以是地址, 也可以是主机名. 
src host host 
如果报文中IP的源地址域 是 host, 则 逻辑为 真. 
host host 
如果报文中 IP的源地址域者目的地址域是host, 则逻辑为真. 上面所有的 host 表达式 都可以加上 ip, arp, 或 rarp 关键字做前缀, 就象: 
ip host host 
如果host是拥有多个IP地址的主机名, 它的每个地址都会被查验. 

dst net net 
如果报文的IP目的地址属于网络号net, 则逻辑为真. 
src net net 
如果 报文的 IP 源地址 属于 网络号 net, 则逻辑为真. 
net net 
如果报文的IP源地址目的地址属于网络号 net, 则逻辑为真. 
net net mask netmask (如net192.168.1.0 mask 255.255.255.128)
如果IP地址匹配指定网络掩码(netmask)的net, 则 逻辑为真. 本原语可以用src或 dst 修饰. 
net net/len 
如果IP地址匹配指定网络掩码的net, 则逻辑为真, 掩码的有效位宽为len. 本原语可以用src或dst修饰. 
dst port port 
如果报文是ip/tcp或ip/udp, 并且目的端口是port, 则逻辑为真. port是一个数字, 也可以是 /etc/services 中 说明过的名字(参看tcp(4P)和udp(4P)).如果使用名字, 则检查端口号和协议. 如果使用数字, 或者有二义的名字, 则只检查端口号(例如, dst port 513 将显示 tcp/login的数据 和 udp/who 的数据, 而 port domain 将显示 tcp/domain 和 udp/domain 的数据). 
src port port 
如果 报文 的 源端口号 是 port, 则 逻辑 为 真. 
port port 
如果报文的源端口或目的端口是port, 则逻辑为真. 上述的任意一个端口表达式都可以用关键字tcp或udp做前缀,就象: 
tcp src port port
它只匹配源端口是port的 TCP 报文. 

less length 
如果 报文 的 长度 小于等于 length, 则 逻辑 为 真. 它等同于: 
len <= length.

greater length 
如果报文的长度大于等于 length, 则逻辑为真. 它等同于: 
len >= length.

原语可以用下述方法结合使用: 
圆括弧括起来的原语和操作符(园括弧在Shell中有特定含义, 所以必须转义). 
取反操作 (`!' or `not'). 
连结操作 (`&&' or `and'). 
或操作 (`||' or `or'). 
取反操作有最高优先级. 或操作和连结操作有相同的优先级, 运算时从左到右结合. 注意连结操作需要显式的and算符, 而不是并列放置. 

如果给出标识符, 但没给修饰符, 那么暗指最近使用的修饰符. 例如, 
not host vs and ace作为 not host vs and host ace的简写形式, 不应该和 not ( host vs or ace )混淆. 
 
 
tcpdump 的输出结果介绍(OUTPUT FORMAT)
下面我们介绍几种典型的tcpdump命令的输出信息
(1) 数据链路层头信息
使用命令#tcpdump -e host ice
ice 是一台装有linux的主机,她的MAC地址是00:90:27:58:AF:1A
H219是一台装有SOLARIC的SUN工作站,它的MAC地址是08:00:20:79:5B:46;
上一条命令的输出结果如下所示:
21:50:12.847509 eth0 > 08:00:20:79:5b:4600:90:27:58:af:1a ip 60: h219.33357 > ice.
telnet 0:0(0) ack 22535 win 8760 (DF)
分析:21:50:12是显示的时间, 847509是ID号, eth0 >表示从网络接口设备发送数据包(eth0  ice.telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 22535表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760.
 
(2) ARP包的TCPDUMP输出信息
使用命令#tcpdump arp
得到的输出结果是:
22:32:42.802509 eth0 > arp who-has h10tell ice (0:90:27:58:af:1a)
22:32:42.802902 eth0 表明从主机发出该数据包, arp表明是
ARP请求包, who-has h10 tell ice表明是主机ICE请求主机h10的MAC地址。 0:90:27:5
8:af:1a是主机ICE的MAC地址。
 
(3) TCP包的输出信息
用TCPDUMP捕获的TCP包的一般输出信息是:
src > dst: flags data-seqno ack windowurgent options
分析:
src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,如:S 是SYN标志, F (F
IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
Options是选项.
 
(4) UDP包的输出信息
用TCPDUMP捕获的UDP包的一般输出信息是:
H10.port1 > ice.port2: udp lenth
UDP十分简单,上面的输出行表明从主机h10的port1端口发出的一个UDP数据包到主机
ICE的port2端口,类型是UDP, 包的长度是lenth
 
example:
 
如果想要获取主机61.151.247.124接收或发出的telnet包,使用如下命令
tcpdump tcp port 23 and host 61.151.247.124
tcpdump -n tcp port 23 and src host218.83.152.2
tcpdump -n -w /etc/tcpdump.log tcp port 23and src host 218.83.152.2
tcpdump -r /etc/tcpdump.log
tcpdump -i eth0 -w tcpdump.log
tcpdump -r tcpdump.log

显示 所有 进出 sundown 的 报文: 
tcpdump host sundown


显示helios和hot|ace之间的报文传送: 
tcpdump host helios and \( hot or ace \)

显示ace和除了helios 以外的所有主机的IP报文: 
tcpdump ip host ace and not helios 
posted @ 2012-10-04 11:09  geekard  阅读(966)  评论(0编辑  收藏  举报