分类: LINUX
2008-07-30 11:44:50
打印信息包头。
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@ipaddr algo:secret,... ]
[ -y datalinktype ] [ -Z user ]
[ expression ]
tcpdump 命令打印从与布尔 Expression 参数相匹配的网络接口捕捉到的信息包头。如果没有给出Expression参数,所有网络上的信息包都将被转储。否则,仅当信息包的 Expression 参数为 True 时才会被转储。仅支持以太网、光纤分布式数据接口(FDDI)、令牌环和回送接口。访问权由 /dev/bpfO、1、2 和 3 之上的许可权控制。
对于SunOS的nit或bpf界面:要运行tcpdump,你必须有/dev/nit或/dev/bpf*的读访问权限.
对于Solaris的dlpi:你必须有网络仿真设备(networkpseudodevice),如/dev/le的读访问权限.
对于HP-UX的dlpi:你必须是root,或者把它安装成root的设置uid程序.对于IRIX的snoop:你必须是root,或者把它安装成root的设置uid程序.对于Linux:你必须是root,或者把它安装成root的设置uid程序.
对于Ultrix和DigitalUNIX:一旦超级用户使用pfconfig(8)开放了promiscuous操作模式(promiscuous-mode),任何用户都可以运行tcpdump.
对于BSD:你必须有/dev/bpf*的读访问权限.
Expression 参数包括一个或多个原语。 原语通常由前面有一个或多个限定符的一个 标识(名称或号码)组成。限定符分三种:
type | 指定标识名或号码所指的设备种类。可能的种类有 host、net 和 port。示例有 hostfoo、net 128.3、port 20。如果没有类型限定符,则采用 host。 |
dir | 指定一个到标识或从其出发的特定转移方向。可能的方向有 src、dst、src 或 dst 以及 src 与 dst。包含 dir 限定符的示例如下:src foo、dst net 128.3、src 或 dst port ftp-data。如果没有 dir 限定符,则采用 src 或 dst。 |
proto |
限制与特定协议的匹配。可能的 proto 限定符有:ether、ip、arp、rarp、tcp 和 udp。 示例: ether src foo、arp net 128.3、tcp port 21。如果没有 proto 限定符,采用与该类型一致的所有协议。例如:src foo 表示 ip 或 arp,net bar 表示 ip 或 arp 或 rarp net bar,而 port 53 表示 tcp 或 udp port 53。
另外,有一些特殊的原语关键字不遵循这种模式:broadcast、multicast、less、greater 和算术表达式。所有这些关键字描述如下: |
允许的原语如下所示:
dst host Host | 如果信息包的 IP(网际协议)目的地字段值与 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 时为真。 |
dst port Port | 当信息包为 TCP/IP(传输控制协议/网际协议)或 IP/UDP(网际协议/用户数据报协议)并且有一个目的地端口值 Port 时为真。此端口可以是一个数字或用在 /etc/services 中的名称。如果使用了名称,则端口号和协议都进行检测。如果使用了一个数字或不明确的名称,则只检测端口号(dst port 513 将打印 TCP/login 流量和 UDP/who 流量,而且 port domain 将打印 TCP/域和 UDP/域流量)。 |
src port Port | 当 Port 变量的值与源端口的值相同时为真。 |
port Port |
当信息包的源或目的地端口值为 Port 时为真。以上任意 port 表达式可以前置关键字 tcp 或 udp,如下所示:
tcp src port port 它只与 TCP 信息包相匹配。 |
less Length |
当信息包的长度小于或等于 Length 时为真。它相当于:
len < = Length. |
greater Length |
当信息包的长度大于或等于 Length 变量时为真。它相当于:
len > = Length |
ip proto Protocol |
当信息包为 Protocol 协议类型的 IP 信息包时为真。Protocol 可以是一个数字或以下名称:icmp、udp 或 tcp。
注:标识符 tcp、udp 和 icmp 也是关键字,必须通过 \ (反斜线符号)(在 korn-shell 中为 \\ (双反斜线符号))进行转义。 |
ip broadcast | 当信息包为 IP 广播信息包时为真。它检测所有的全 0 和全 1 广播约定,并查找本地子网掩码。 |
ip multicast | 当信息包为 IP 多点广播信息包时为真。 |
proto Protocol |
当信息包为 Protocol 类型时为真。Protocol 可以是一个数字或一个名称如 ip、arp 或 rarp。
注:这些标识符也是关键字,并且必须通过 \ (反斜杠)转义。 |
ip、arp、rarp |
缩略语:
proto p 其中 p 是上述协议之一。 |
tcp、udp、icmp |
缩略语:
ip proto p 其中 p 是上述协议之一。 |
简单关系:
expr replop expr
当 relop 为 >(大于), <(小于),>=(不等于), <= (小于或等于),= (等于), != (叹号与等号)之一时为真,而 expr 是由整常数(以标准 C 语法表示),常用二目运算符 +(加号),-(减号),* (乘号),/ (除号), & (与号), | (或号),长度运算符和特殊包数据附件组成的算术表达式。要存取信息包里的数据,请使用以下语法:
proto [ expr : size ]
Proto 是关键字 ip、arp、rarp、tcp 或 icmp 之一,并表示索引操作的协议层。与所指协议层相关的字节偏移量由 expr 给出。指示符 size 可选,它指示所感兴趣字段里的字节数;它可以是一个、两个或四个,缺省设为一个字节。由关键字 len 表示的长度操作符,给出了信息包的长度。
例如,表达式 ip[0] & 0xf != 5 仅捕捉非片断数据报和片断数据报的 0 片断。该检测暗指 tcp 和 udp 索引操作。例如:tcp[0] 通常意味着 TCP 报头的第一字节,而从不表示中间片断的第一个字节。
更复杂的过滤表达式的建立可以通过使用 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 完全相同。
通过使用括入括号的原语和操作符组(括号是 Shell 专用的,且必须转义)可以组合原语。
“非”具有最高优先顺序。“或”和“与”具有相同的优先顺序,并按由左向右的顺序执行。
如果给出了一个没有关键字的标识符,则采用最近使用的关键字。例如:
not host gil and devo
是
not host gil and host devo
的缩略语,不要与
not \(host gil or devo\) 相混淆。
表达式参数可作为单参数或多参数(两者中较方便的)传递给 tcpdump 命令。通常,如果表达式包含 Shell 元字符,将其作为单个的、加引号的参数来传递会更容易。多参数在分析之前以空格相连。
tcpdump 命令的输出随协议而定。下面是大多数输出格式的简要描述和示例。
TCP 信息包TCP 协议行的通用格式为:
src > dst: flags data-seqno ack win urg options
在下列字段列表中,src、dst 和 flags 一直存在。其它字段取决于信息包的 TCP 协议头的内容,并仅在适当的时候输出。
src | 指示源(主机)地址和端口。总是指定 src 字段。 |
dst | 指示目的地址和端口。dst字段总是被指定。 |
flags | 指定标志 S(SYN)、F(FIN)、P(PUSH)或 R(RST)的组合或单个.(句点)来指示没有标记。总是指定 flags 字段。 |
data-seqno | 描述该信息包中数据占据的序列空间部分(请参阅下面示例)。 |
ack | 指定(通过应答)在该连接的其它方向上预期的下一数据的序列号。 |
win | 指定该连接的其它方向上可用的接收缓冲空间的字节数。 |
urg | 指示该信息包中有紧急数据。 |
options | 指定在尖括号中的 TCP 选项(例如:< mss 1024>)。 |
rlogin 命令从主机 gil 到主机 devo 的开始部分为:
gil.1023 > devo.login:S 768512:768512(0) win 4096devo.login > gil.1023:S 947648:947648(0) ack 768513 win 4096 gil.1023 > devo.login: . ack 1 win 4096 gil.1023 > devo.login: P 1:2(1) ack 1 win 4096 devo.login > gil.1023: ack 2 win 4096 gil.1023 > devo.login: P 2:21(19) ack 1 win 4096 devo.login > gil.1023: P 1:2(1) ack 21 win 4077 devo.login > gil.1023: P 2:3(1) ack 21 win 4077 urg 1 devo.login > gil.1023: P 3:4(1) ack 21 win 4077 urg 1
第一行是指主机 gil 上的 TCP 端口 1023 向主机 devo 的登录端口发送一个信息包。这个 S 表明已经设置 SYN 标志。信息包的序列号为 768512,它不含数据。(标记“first:last(nbytes)”意味着“序列号 first 上限可达但不包含 last,即用户数据为 nbytes 字节”。)不含带外部关联的 ack 字段,可用接收字段 win 为 4096 字节,并且最大段大小(mss)选项要求 1024 字节的 mss。
主机 Devo 以一个类似的包答复,但该信息包内含有一个有外部关联 ack 字段,用于主机 gil的 SYN。然后,主机 gil 应答主机 devo 的 SYN。. (句点)表示没有设置标志。该信息包不含数据,所以也就没有数据序列号。
注:ack 字段序列号为一个小整数(1)。
当 tcpdump 第一次遇到 TCP 对话时,它从该信息包中打印序列号。在随后的对话信息包中,打印了当前信息包的序列号与该初始序列号的差异。这意味着第一个之后的序列号可以解释为对话数据流中的相对字节位置(每个方向的第一个数据字节为 1)。-S标记覆盖该特性,并导致输出原序列号。
在第六行,主机 gil 发送给主机 devo 19 字节的数据(在 gil-devo 对话侧的第 2 字节到第 20 字节)。在信息包内设置了 PUSH 标志。在第七行,主机 devo 声称它收到了主机 gil 发送的上限可达到但不包含第 21 字节的数据。因为 devo 的接收窗口收到较小的 19 字节,这一数据的大部分显然位于套接字缓冲区。主机 devo 还发送其信息包内的一个字节的数据给主机 gil。在第八、九行,主机 devo 发送两字节的 urgent PUSH 数据到主机 gil。
UDP 信息包该 rwho 命令信息包说明 UDP 格式:
devo.who > bevo.who: udp 84
该命令序列说明主机 devo 的端口 who 发送一个 udp 数据报给主机 bevo 的端口 who。该信息包内含有 84 字节的用户数据。
一些 UDP 服务(从源或目的地端口号)可被识别,并且打印出更高层的协议信息。尤其是域名服务请求(RFC-1034/1035)和到 NFS 的 Sun RPC 呼叫(RFC-1050)。
UDP 名称服务器请求名称服务器请求格式为:
src > dst: id op? flags qtype qclass name (len)
除了上述字段,UDP 名称服务器请求包含以下内容:
id | 指定查询的标识号。 |
op | 指定操作类型。缺省为查询操作。 |
qclass
name
(len)
下面是名称服务器的请求示例:
tnegev.1538 > tnubia.domain: 3+ A? austin.ibm.com. (37)
主机 tnegev 向 tnubia 上的域服务器询问与名称 austin.ibm.com 关联的地址记录( qtype=A)。查询 id 为 3。+(加号)表示已经设置递归要求标志。查询长度为 37 字节,不包含 UDP 和 IP 协议头。查询为标准操作 Query,所以省略 op 字段。如果 op 为其它值,它会在 3 和 + 之间打印出来。类似地,qclass 为一标准类( C_IN) 也被省略。任何其它 qclass 会直接在 A 之后打印出来。
会检查一些异常,这可能会使方括号内包含额外的字段。如果查询包含应答、名称服务器或权限段,则 ancount、nscount 或 arcount 打印为 na],[nn] 或 [nau],其中 n 为适当的计数。如果设置了任一响应位(AA,RA,或 rcode)或者设置了字节 2 和 3 的任意“必须为零”位,[b2&3=x] 会被打印出来,其中 x 是头字节 2 和 3 的十六进制值。
UDP 名称服务器响应名称服务器响应格式为:
src > dst: id op rcode flags a/n/au type class data (len)
除以上所述字段外,UDP 名称服务器响应包括以下内容:
rcode
data
下面是名称服务器响应的一个示例:
tnubia.domain > tnegev.1538: 3 3/3/7 A 129.100.3 tnubia.domain > tnegev.1537: 2 NXDomain* 0/1/0 (97)
在第一个示例中,tnubia 以 3 回答记录、3 名称服务器记录和 7 权限记录响应来自 tnegev 的查询 3。第一个回答记录为 A 类(地址),其数据为 internet 地址 129.100.100.3。响应共计 273 字节,不含 UDP 和 IP 头。与 A 记录的类(C_IN)的情形相似,省略了 op(Query)和响应代码(NoError)。
在第二个示例中,tnubia 以一个不存在的域的响应代码(NXDomain)和 0 回答记录,1 名称服务器记录和 0 权限记录响应查询 2。* (星号)表示设置了授权回答位。因为没有回答,所以不打印类型、类或数据。
其它可能显示的标志字符有 -(递归可用,RA,未设置)和 |(截断的消息,TC,已设置)。
注:名称服务器请求和响应可能很大,80 字节的缺省 snaplen 有可能不能捕捉足够的信息包以打印。如果需要调查大量的名称服务器流量,用 -s 标志来增加 snaplen。NFS 请求
Sun NFS(网络文件系统)请求与答复的格式为:
src.xid > dst.nfs: len op args src.nfs > dst.xid: reply stat len
除以上所述字段外,NFS 请求和响应包括以下这些字段:
args | 指定目录文件 $file handle$。 |
reply stat | 表示操作的响应状态。 |
下面是 NFS 请求与响应的一个示例:
L1.e2766 > L2.nfs: 136 readdir fh 6.5197 8192 bytes @ 0 L2.nfs > L1.e2766: reply ok 384 L1.e2767 > L2.nfs: 136 lookup fh 6.5197 `RCS'
在第一行,主机 L1 发送一个 id 为 e2766 的事务到 L2(注意,src 主机后面的数字是事务号,而非源端口)。请求为 136 字节,不含 UDP 和 IP 头。操作为在文件句柄(fh)6.5197 上的 readir(读目录)。开始于偏移量0,8192 字节被读取。L2 以 384 字节数据应答 ok。
在第三行,L1 要求 L2 在目录文件 6.5197 中查询名称“RCS”。注意:打印的数据取决于操作类型。
注:NFS 请求非常大,除非增加 snaplen,否则以上内容不会打印出来。用标记 -s 192 观察 NFS 流量。ARP/RARP 信息包
地址解析协议/反向地址解析协议(ARP/RARP)输出表示请求的类型和其参数。下面的示例显示了从主机 devo 到主机 bevo 的 rlogin 命令的启动:
arp who-has bevo tell devo arp reply bevo is-at 1d:2d:3d:4d:5d:6d
第一行是 devo 发送了一个 ARP 包,询问因特网主机 bevo 的以太网地址。在第二行,bevo 以它的以太网地址答复。
IP 片断片断因特网数据报打印如下:
(frag id:size@offset+) (frag id:size@offset)
第一个表单表明有更多的片断。第二个表明这是最后的片断。IP 片断有以下字段:
id | 标识片断。 |
size | 指定片断大小(按字节)包括 IP 头。 |
offset | 指定原数据报中的片断偏移量(按字节)。 |
片断信息按每一片断输出。第一片断包括较高层的协议报头而片断信息在协议信息之后打印。第一个之后的片断不包含更高层的协议头,而片断信息在源和目的地地址之后打印。例如一个 ping echo/reply 序列:
gil > devo: icmp: echo request ( frag 34111: 1480@0+) gil > devo: (frag 34111!28@1480) devo > gil: icmp: echo reply (frag 15314:148@0+)
一个带“请勿拆分” IP 标志的信息包以一个(DF)在结尾标记。
时间戳缺省情况下,所有输出行前置一个时间戳。时间戳为表单内的当前时钟时间。
hh:mm:ss.frac
并且与内核的时钟一样精确。时间戳反映了内核第一次发现包的时间。没有尝试去说明以太网接口从线上除去信息包到内核服务新信息包中断之间的时间迟延。
-c | 在收到 Count 包后退出。 |
-d | 转储编译过的信息包匹配代码至标准输出,然后停止。 |
-e | 在每一转储行打印链接层头。如果指定了-e 标记,则打印出链接层头。在以太网和令牌环网上,源地址和目的地地址、协议、信息包长度被打印出来。 |
-f | 以数字而非符号方式打印外部网际网地址。 |
-F | 将 File 用作过滤表达式的输入。-F 标记忽略命令行上给出的任何附加的表达式。 |
-i | 在 Interface 上侦听。如果未指定,tcpdump 命令在系统接口列表中查找已经在工作的最低计数和已配置的接口。该搜索排除了回送接口。 |
-I | (大写字母 i)指定直接信息包捕捉方式。-l 标记不等待缓冲区填充。 |
-l |
(小写字母 L)缓冲标准输出行(stdout)。该标记用于在捕捉数据时查看数据。例如:
tcpdump -l : tee dat 或 tcpdump -l > dat & tail -f dat |
-n | 省略地址到名称的转换。 |
-N | 省略打印主机名的域名资格。例如,-N 标记打印 gil 而不是 gil.austin.ibm.com。 |
-O | 省略运行信息包匹配代码优化器。这仅在怀疑优化器中存在故障时有用。 |
-p |
指定接口不在混杂方式下运行。
注:接口可能因其它原因而处于混杂方式;因此,-p 不可被用作“ether host {localhost}”或“broadcast”的缩写。 |
-q | 静默输出。-q 标记打印较少的协议信息,所以输出行较短。 |
-r | 从 File 中读取包(它是用 -w 选项创建的)。当 File 为“-”时使用标准输入。 |
-s |
从每一信息包捕捉 Snaplen 字节的数据而非缺省的 80。80 字节对 IP、ICMP、TCP 和 UDP 而言已足够,但有可能截断名称服务器和 NFS 信息包的协议信息(参见下面)。信息包因为有限的快照以“[|proto]”表示在输出中而被截断,其中 proto 是发生截断的协议层的名称。
注:获取更大的快照会增加它处理信息包的时间,并因此减少包缓冲的量。这可能会造成信息包的丢失。应限制捕捉所感兴趣的协议信息的 Snaplen 到最小字节数。 |
-S | 打印绝对而非相对的 TCP 序列号。 |
-t | 省略在每一转储行打印一个时间戳。 |
-tt | 在每一转储行打印一个未格式化的时间戳。 |
-v | 指定稍微详细些的输出。例如,打印 IP 信息包的生存时间和服务信息的类型。 |
-w | 将原始的信息包写入 File 而不是分析和打印它们。它们可以在以后用 -r 标志打印出来。如果 File 为“-”,则使用标准输出。 |
-x | 以十六制打印每一个包(减去其链接层头)。将打印出整个包或 Snaplen 字节中的较小者。 |
tcpdump host devo
tcpdump ip host gil and \(devo bevo\)
tcpdump ip host bevo and bevo gil
tcpdump net 192.100.192
tcpdump ip and not net localnet
tcpdump \(tcp[13] \& 3 !=0 and not src and dst net localnet\)
tcpdump \(icmp[0] !=8 and icmp[0] !=0\)
tcpdump -I
tcpdump -i tr0
tcpdump -w TraceInfo