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 for capturing web pages
[
应用]
在网关服务器中输入:tcpdump –A src host 192.168.x.y
[
摘取
]17:10:56.934040 IP 192.168.x.y.icp > by2msg1231711.mixer.edge.messenger.live.com.msnp: . ack 4165501895 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.718466 00:14:22:d2:9e:d0 (oui Unknown) > 00:c0:9f:40:29:6a (oui Unknown), ethertype IPv4 (0x0800), length 60: 192.168.x.y.acp-conduit > 65.54.167.59.http: R 2561727994: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 IP 192.168.x.y.ridgeway2 > 218.93.16.107.http: F 1728282061:1728282061(0) ack 2139349129 win 65004
13:54:15.965416 IP 192.168.x.y.gwen-sonya > 218.93.16.107.http: S 3089588305:3089588305(0) win 65535 <mss 1460,nop,nop,sackOK>
2 packets captured
7 packets received by filter
0 packets dropped by kernel
[
分析
]
看到没有,我只要抓取两个匹配包,就OK了。
-D Print the list of the network interfaces available on the system and on which tcpdump can
capture packets. For each network interface, 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 an interface 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 IP 218.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 IP 207.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: verbose output 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.058394 802.1d config 81b6.00:1e:14:9f:f7:00.801a root 8000.00:04:80:78:c0:dd pathcost 19 age 1 max 20 hello 2 fdelay 15
[
分析
]
结合系统命令,使抓取分析数据更加灵活与强大,我爱这个功能…
-n
不把地址转换成名字 (如主机地址, 端口号等)
[
应用
]
tcpdump -i eth0 src host 192.168.x.y -n
[
摘取
]14:17:30.686094 IP 192.168.x.y.10778 > 121.62.99.137.14808: UDP, length 1050
[
分析
]
抓取的数据包不会将数字地址转换成名字
-N
不显示主机名字中的域名部分
[
应用
]
tcpdump -i eth0 src host 192.168.x.y -n
[
摘取
]14:16:45.824513 IP 192.168.x.y.alias > by1msg3145607.msnp: . ack 1894015094 win 64827
[
分析
]
抓取的数据包中不会将域名的部分显示,看by1msg3145607.msnp,典型是省略了很长一段的域名部分(msn的)
-q
快速输出. 显示较少的协议信息, 输出行将短一点点.
[
应用
]
tcpdump -i eth0 src host 192.168.x.y -q
[
摘取
]14:21:48.669851 IP 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 可以为以后方便
-t
禁止显示时戳标志.
[
应用
]
tcpdump -i eth0 src host 192.168.x.y -t
[
摘要
]
IP 192.168.x.y.sonardata > 218.93.16.107.http: . ack 1225435221 win 65535
IP 192.168.x.y.sonardata > 218.93.16.107.http: P 0:907(907) ack 1 win 65535
IP 192.168.x.y.sonardata > 218.93.16.107.http: . ack 208 win 65328
[
分析
]
看下面
-tt
显示未格式化的时戳标志.
[
应用
]
tcpdump -i eth0 src host 192.168.x.y -tt
[
摘要
]
1247207645.823506 IP 192.168.x.y.isis > 61.172.205.8.msnp: . ack 53 win 64309
1247207645.840496 IP 192.168.x.y.isis > 61.172.205.8.msnp: P 70:74(4) ack 123 win 64239
1247207645.881594 IP 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
以十六进制数形式显示每一个报文 (去掉链路层报头后) . 可以显示较小的完整报文
[
分析
]-v,-vv,-x
通过上面的叙述,我想大家试一下,一定就会很明白了,至与那个选项更适合大家,那就是看应用了,我想这些选项也够大家用了吧!~反正够我用了,呵呵!~
expression (
表达式)
表达式是一个正则表达式,tcpdump利用它作为过滤报文的条件,如果一个报文满足表达式的条件,则这个报文将会被捕获。如果没有给出任何条件,则网络上所有的信息包将会被截获。
v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);}
图:Expression的构造
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 net 128.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' 实际上 就是 `tcp dst 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 (如net 192.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:46 00: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 <
表示从网络接口
eth0
接受该数据包
), 08:00:20:79:5b:46是主机H219的MAC地址,
它表明是从源地址H219发来的数据包. 00:90:27:58:af:1a是主机ICE的MAC地址,表示该数据包的目的地址是ICE . ip 是表明该数据包是IP数据包,60 是数据包的长度, h219.33357 > 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 h10 tell ice (0:90:27:58:af:1a)
22:32:42.802902 eth0 < arp reply h10 is-at 0:90:27:12:10:66 (0:90:27:58:af:1a)
分析: 22:32:42是时间戳, 802509是ID号, 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 window urgent 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 host 218.83.152.2
tcpdump -n -w /etc/tcpdump.log tcp port 23 and 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
本文出自 “坏男孩” 博客,请务必保留此出处http://5ydycm.blog.51cto.com/115934/176151