|
作者:李国莉 来源:http://www.eviloctal.com/forum/ ! l& h) E- v1 _6 s* p
& E/ D4 {! G/ X8 ?! P5 e7 E
tcpdump采用命令行方式,它的命令格式为:
! V7 @8 c8 d. c2 u1 u& W) s/ K tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
, G) B3 m3 W0 _8 a [ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]: N$ m4 d+ m. v! k8 ?* P0 ?3 B
[ -T 类型 ] [ -w 文件名 ] [表达式 ] 1 A& a; ]6 u* ^, i
1. tcpdump的选项介绍
I* l; ~) s2 M0 P! C* N& \ -a 将网络地址和广播地址转变成名字;* |0 M& x5 k6 R; K3 v+ J" ^ ]: H
-d 将匹配信息包的代码以人们能够理解的汇编格式给出;
- s/ c0 P$ s( h2 t$ R0 g -dd 将匹配信息包的代码以c语言程序段的格式给出;1 v, @* `$ m3 I; e7 y
-ddd 将匹配信息包的代码以十进制的形式给出;$ x$ m, A5 ^' P% Z
-e 在输出行打印出数据链路层的头部信息;* V6 Z* W/ n V! f& e
-f 将外部的Internet地址以数字的形式打印出来;4 k: M* z/ v- i& m; o x1 e
-l 使标准输出变为缓冲行形式;0 e) c( X4 _7 p. Q& w4 {
-n 不把网络地址转换成名字;5 |- u5 n+ l }0 e* k! o: D( g: T
-t 在输出的每一行不打印时间戳;9 w; \1 E: D+ K* C
-v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
4 D" B. o' h* s# M8 ~ -vv 输出详细的报文信息;
: x/ v2 X. n Z& C& h+ g8 U/ k -c 在收到指定的包的数目后,tcpdump就会停止;% W1 P6 _" R# ^) p
-F 从指定的文件中读取表达式,忽略其它的表达式;( J3 X; D! Y. e. v
-i 指定监听的网络接口;
7 u& `" j8 O! X- c0 O% K -r 从指定的文件中读取包(这些包一般通过-w选项产生);7 u/ C/ G- \6 x
-w 直接将包写入文件中,并不分析和打印出来;4 p# n* F' ^4 C }; H/ u
-T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程: Q3 \% Y8 g* b+ {2 Y
调用)和snmp(简单 网络管理协议;) $ r+ I, y) C! y' Z+ E B# d- m4 H
2. tcpdump的表达式介绍6 T6 D$ L, ?) [
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表% u7 V# M1 W r- i! b6 k
达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会
# X0 z- Z" {7 G( e1 A4 q8 w8 U被截获。, w) n* l' \& |; h) I: l/ v9 K' u
在表达式中一般如下几种类型的关键字,一种是关于类型的关键字,主要包括host,3 H8 y" t7 r& `1 C% m: g8 a: p% m
net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一台主机,net 202.0.0.0 指明' ?- H- L/ H, z% Y3 g# K4 g4 K& F
202.0.0.0是一个网络地址,port 23 指明端口号是23。如果没有指定类型,缺省的类型是0 F* S8 p2 {- z0 C
host.0 j6 Z- _6 Z* Q( \- \2 U0 p- ]
第二种是确定传输方向的关键字,主要包括src , dst ,dst or src, dst and src ,
" Q1 M6 h3 g: Y1 j% u这些关键字指明了传输的方向。举例说明,src 210.27.48.2 ,指明ip包中源地址是210.27.
6 c& t* X* g) |48.2 , dst net 202.0.0.0 指明目的网络地址是202.0.0.0 。如果没有指明方向关键字,则
3 {- {0 l6 S4 Y4 E: b0 s Z# v" _缺省是src or dst关键字。$ V# p7 v9 I) A) b: Q+ _" N
第三种是协议的关键字,主要包括fddi,ip ,arp,rarp,tcp,udp等类型。Fddi指明是在
& d& Z# _! p$ j$ Y( f+ o! \3 CFDDI(分布式光纤数据接口网络)上的特定的网络协议,实际上它是"ether"的别名,fddi和e
& b& P! p& b' M& B7 Z0 o" r- Pther具有类似的源地址和目的地址,所以可以将fddi协议包当作ether的包进行处理和分析。" Z4 @2 t0 {. E$ e8 h
其他的几个关键字就是指明了监听的包的协议内容。如果没有指定任何协议,则tcpdump将会
( J$ G7 K# E* f6 `* c8 G" _监听所有协议的信息包。$ S! b/ Y# g2 w/ V+ y
除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,$ ?! z7 h" E( B
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
* N5 ]$ \6 ?! S' q, i" n3 Zr' ,'||';
2 Q+ N; Z) g3 I) }" O& D 这些关键字可以组合起来构成强大的组合条件来满足人们的需要,下面举几个例子来
% N x1 j" U2 J1 R) i1 f说明。* @% L! W" m+ P7 j! T0 j
(1)想要截获所有210.27.48.1 的主机收到的和发出的所有的数据包:
8 i7 J# i1 v# x7 }* ~! S #tcpdump host 210.27.48.1 1 q* s( _' P) }' o1 v0 f
(2) 想要截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信,使用命令2 J5 q( y4 N6 B3 b. ?; U; H
:(在命令行中适用 括号时,一定要
, t' t' l- E6 L" }' r7 S. i #tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) 4 h- q2 g+ `. i( W9 L3 Y
(3) 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包6 x7 D0 Z! `! p6 q4 g" i
,使用命令:
9 Y5 C" h1 H5 k: W #tcpdump ip host 210.27.48.1 and ! 210.27.48.2! i+ W0 t+ K" D: x) S% Q
(4)如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令:
" V y- v# V+ X& L: Z" x #tcpdump tcp port 23 host 210.27.48.1
$ y& t4 G( O' j! X% ?6 G1 I 3. tcpdump 的输出结果介绍% I1 M' Q/ E. `8 S7 l8 N/ r" d
下面我们介绍几种典型的tcpdump命令的输出信息0 _; e5 C: i: x, S/ C) V
(1) 数据链路层头信息2 i ` I5 u# h6 y- w
使用命令#tcpdump --e host ice/ Y4 \! ^1 Z+ g2 m; r) P) Z
ice 是一台装有linux的主机,她的MAC地址是0:90:27:58:AF:1A
1 T8 I3 [ p6 n: ~! c8 S/ t% T H219是一台装有SOLARIC的SUN工作站,它的MAC地址是8:0:20:79:5B:46;上一条2 ^7 d5 ]- v- S" z. M: e
命令的输出结果如下所示:
; j. ~) Q" l6 {, B# t2 t: q21:50:12.847509 eth0 < 8:0:20:79:5b:46 0:90:27:58:af:1a ip 60: h219.33357 > ice.
5 T+ p6 P$ b6 ]6 ttelne* V! v( @7 O% W& z
t 0:0(0) ack 22535 win 8760 (DF)8 E% M6 {' d# T7 n9 D
分析:21:50:12是显示的时间, 847509是ID号,eth0 <表示从网络接口eth0 接受该
. O; K/ K: T/ l, @' X H7 [5 j数据包,eth0 >表示从网络接口设备发送数据包, 8:0:20:79:5b:46是主机H219的MAC地址,它9 N* _( @: B9 d7 \
表明是从源地址H219发来的数据包. 0:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的
" v9 G% ?3 b! u' O7 |* W; d9 Y) R目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > ice.& L/ b8 U; G( ?4 B" H2 d7 |4 y
telnet 表明该数据包是从主机H219的33357端口发往主机ICE的TELNET(23)端口. ack 225359 I! h% o* ?" b1 m
表明对序列号是222535的包进行响应. win 8760表明发送窗口的大小是8760. 8 I( ~& @2 V- z
(2) ARP包的TCPDUMP输出信息: U+ @ }- _( o( @
使用命令#tcpdump arp Q, ^$ `* ]- e" J! `; Q
得到的输出结果是:
! g- h, r1 J( D2 { l X0 J 22:32:42.802509 eth0 > arp who-has route tell ice (0:90:27:58:af:1a)
* p2 w4 |! P: ?% q7 W: P 22:32:42.802902 eth0 < arp reply route is-at 0:90:27:12:10:66 (0:90:27:58:af
! H- J0 C. O" e3 r6 V:1a)
$ T9 o" V# X; U2 G- R* {) C 分析: 22:32:42是时间戳, 802509是ID号, eth0 >表明从主机发出该数据包, arp表明是
/ [4 d/ I7 S2 m4 |. s6 mARP请求包, who-has route tell ice表明是主机ICE请求主机ROUTE的MAC地址。 0:90:27:54 }% C+ l; U4 N% e( n2 A& L
8:af:1a是主机ICE的MAC地址。
$ T' O) W/ p- {- U! s( }2 i; g (3) TCP包的输出信息* w3 {8 M- ^$ p# X7 Q
用TCPDUMP捕获的TCP包的一般输出信息是:( `) _' @2 I1 j$ m1 Q
src > dst: flags data-seqno ack window urgent options) I# V O4 k' X+ E8 J
src > dst:表明从源地址到目的地址, flags是TCP包中的标志信息,S 是SYN标志, F (F0 ]9 @" @9 J' B1 R! v
IN), P (PUSH) , R (RST) "." (没有标记); data-seqno是数据包中的数据的顺序号, ack是
0 w J/ p- u9 Q# P下次期望的顺序号, window是接收缓存的窗口大小, urgent表明数据包中是否有紧急指针.
4 l- |; N% \( V: J- I' R: O; ]Options是选项.
; J1 m8 r4 O, R (4) UDP包的输出信息 z! O9 z+ H5 m6 n
用TCPDUMP捕获的UDP包的一般输出信息是:2 A5 ~2 W" G5 y6 L
route.port1 > ice.port2: udp lenth
+ x9 q9 f8 a! _: C7 h* { B UDP十分简单,上面的输出行表明从主机ROUTE的port1端口发出的一个UDP数据包到主机
' F: |* p9 Y; [3 F$ c+ u. SICE的port2端口,类型是UDP, 包的长度是lenth1 {2 k( d/ |+ j. d) ~! k
" a0 j% R+ t9 f ?7 h/ ^4 Z
4 F# r$ \8 }! z0 w
$ v) X! G: q+ b5 V3 N4 }% r
|