天天看点

tcpdump(中文)手册 (上)

TCPDUMP的MAN 手册(中文)

TCPDUMP的英文MAN手册,实在难看,发现中文手册,拿来和大家共享!
tcpdump(中文)手册 (上)

NAME

tcpdump - 转储网络上的数据流  

总览 (SYNOPSIS)

tcpdump [ -adeflnNOpqStvx ] [ -c count ] [ -F file ]

         [ -i interface ] [ -r file ] [ -s snaplen ]

         [ -T type ] [ -w file ] [ expression ]

描述 (DESCRIPTION)

Tcpdump 显示 网络接口 上 符合 布尔表达式 expression 的 报头.

对于 SunOS 的 nit 或 bpf 界面: 要 运行 tcpdump , 你 必须 有 /dev/nit 或 /dev/bpf* 的 读访问 权限.

对于 Solaris 的 dlpi: 你 必须 有 网络仿真设备 (network pseudo device), 如 /dev/le 的 读访问 权限.

对于 HP-UX 的 dlpi: 你 必须 是 root, 或者 把它 安装成 root 的 setuid 程序. 对于 IRIX 的 snoop: 你 必须 是 root, 或者 把它 安装成 root 的 setuid 程序. 对于 Linux: 你 必须 是 root, 或者 把它 安装成 root 的 setuid 程序.

对于 Ultrix 和 Digital UNIX: 一旦 超级用户 用 pfconfig(8) 开放了 杂凑模式 (promiscuous-mode), 任何用户 都可以 运行 tcpdump.

对于 BSD: 你 必须 有 /dev/bpf* 的 读访问 权限.

选项 (OPTIONS)

-a

试着 把 网络和广播地址 转换成 名称.

-c

当 收到 count个 报文 后 退出.

-d

把 编译好的 报文匹配模板 (packet-matching code) 翻译成 可读形式, 传往 标准输出, 然后退出.

-dd

把 报文匹配模板 (packet-matching code) 以 C 程序片断 的 形式 输出.

-ddd

把 报文匹配模板 (packet-matching code) 以 十进制数 形式 输出 (前面 加上 总数).

-e

每行 都 显示 链路层报头.

-f

用 数字形式 显示 '外部的' 互联网地址, 而不是 字符形式 (这个 选项 用来绕开 脑壳坏掉的 SUN 黄页服务器 的 问题 --- 一般说来, 它 翻译 外部网络数字地址 的 时候 会 长期挂起).

-F

指定 文件 file 的 内容 为 过滤表达式. 忽略 命令行 上 的 表达式.

-i

监听 interface 接口. 如果 不指定 接口, tcpdump 在 系统 的 接口 清单 中, 寻找 号码最小, 已经 配置好的 接口 (loopback 除外). 选中的时候 会 中断 连接.

-l

行缓冲 标准输出. 可用于 捕捉 数据 的 同时 查看 数据. 例如,

``tcpdump -l | tee dat'' or ``tcpdump -l   > dat & tail -f dat''.

-n

不把 地址 转换成 名字 (如主机地址, 端口号等)

-N

不显示 主机名字 中的 域名 部分. 例如, 如果 使用 这个 选项, tcpdump 只显示 ``nic'', 而不是 ``nic.ddn.mil''.

-O

禁止运行 报文匹配模板 的 优化器. 当 怀疑 优化器 含有 bug 时, 这个选项 才有用.

-p

禁止 把 接口 置成 promiscuous 模式. 注意, 接口 有可能 因 其他原因而 处于 promiscuous 模式; 因此, '-p' 不能 作为 `ether host {local-hw-addr} 或 ether broadcast' 的 简写.

-q

快速输出. 显示 较少的 协议信息, 输出行 将 短一点点.

-r

从 file 中 读入 数据报 (文件 是用 -w 选项 创建的). 如果 file 是 ``-'', 就 读 标准输入.

-s

从每个 报文 中 截取 snaplen 字节的数据, 而不是 缺省的 68 (如果是 SunOS 的 NIT, 最小值是 96). 68 个字节 适用于 IP, ICMP, TCP 和 UDP, 但是 有可能 截掉 名字服务器 和 NFS 报文 的 协议 信息 (见下面). 输出时 如果指定 ``[|proto]'', tcpdump 可以 指出 那些 捕捉量过小的 数据报, 这里的 proto 是 截断发生处 的 协议层 名称. 注意, 采用 更大的 捕捉范围 既增加了处理 报文 的 时间, 又 相应的 减少了报文的 缓冲 数量, 可能 导致 报文的丢失. 你 应该 把 snaplen 设的尽量小, 只要能够 容纳 你 需要 的 协议信息 就可以了.

-T

把 通过 "expression" 挑选出来的 报文 解释成 指定的 type. 目前 已知 的 类型 有: rpc (远程过程调用 Remote Procedure Call), rtp (实时应用协议 Real-Time Applications protocol), rtcp (实时应用控制协议 Real-Time Applications control protocol), vat (可视音频工具 Visual Audio Tool), 和 wb (分布式白板 distributed White Board).

-S

显示 绝对的, 而不是 相对的 TCP 序列号.

-t

禁止 显示 时戳标志.

-tt

显示 未格式化的 时戳标志.

-v

(稍微多一点) 繁琐的输出. 例如, 显示 IP 数据报 中的 生存周期 和 服务类型.

-vv

更繁琐的输出. 例如, 显示 NFS 应答报文 的 附加域.

-w

把 原始报文 存进 file, 不分析 也 不显示. 它们 可以 以后 用 -r 选项 显示. 如果 file 是 ``-'', 就 写到 标准输出.

-x

以 十六进制数 形式 显示 每一个 报文 (去掉链路层报头后) . 可以 显示 较小的 完整 报文, 否则 只 显示 snaplen 个 字节 .

expression

用来 选择 要 转储 的 数据报. 如果 没有 指定 expression , 就 转储 网络的 全部 报文. 否则, 只转储 相对 expression 为 `true' 的 数据报.

expression 由 一个或多个 原语 (primitive) 组成. 原语 通常 由 一个 标识 (id, 名称或数字), 和 标识 前面的 一个或多个 修饰子(qualifier) 组成. 修饰子 有 三种 不同的类型:

type

类型修饰子 指出 标识名称 或 标识数字 代表 什么 类型的东西. 可以使用的 类型 有 host, net 和 port. 例如, `host foo', `net 128.3', `port 20'. 如果 不指定 类型修饰子, 就使用 缺省的 host .

dir

方向修饰子 指出 相对于 标识 的 传输方向 (数据是 传入还是传出 标识). 可以使用的 方向 有 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 修饰子 指定 所需的 传输方向.

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

它等价于:

ether proto /ip and host host

如果 host 是 拥有 多个 IP 地址 的 主机名, 它的 每个地址 都会 被查验.

ether dst ehost

如果 报文的 以太目的地址 是 ehost, 则 逻辑 为 真. Ehost 既可以是 名字 (/etc/ethers 里有), 也可以是 数字 (有关 数字格式 另见 ethers(3N) ).

ether src ehost

如果 报文的 以太源地址 是 ehost, 则 逻辑 为 真.

ether host ehost

如果 报文的 以太源地址 或 以太目的地址 是 ehost, 则 逻辑 为 真.

gateway host

如果 报文 把 host 当做 网关, 则 逻辑 为 真. 也就是说, 报文的以太源或目的地址 是 host, 但是 IP 的 源目地址都不是 host. host 必须 是个 主机名, 而且 必须 存在 /etc/hosts 和 /etc/ethers 中. (一个等价的表达式是

ether host ehost and not host host

对于 host / ehost, 它既可以是 名字, 也可以是 数字.)

dst net net

如果 报文的 IP 目的地址 属于 网络号 net, 则 逻辑 为 真. net 既可以 是 名字 (存在 /etc/networks 中), 也可以是 网络号. (详见 networks(4)).

src net net

如果 报文的 IP 源地址 属于 网络号 net, 则 逻辑 为 真.

net net

如果 报文的 IP 源地址 或 目的地址 属于 网络号 net, 则 逻辑 为 真.

net net mask mask

如果 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.

ip proto protocol

如果 报文 是 IP 数据报(参见 ip(4P)), 其 内容 的 协议类型 是 protocol, 则 逻辑 为 真. Protocol 可以是 数字, 也可以是 下列 名称 中的 一个: icmp, igrp, udp, nd, 或 tcp. 注意 这些 标识符 tcp, udp, 和 icmp 也同样是 关键字, 所以 必须 用 反斜杠(/) 转义, 在 C-shell 中 应该是 // .

ether broadcast

如果 报文 是 以太广播报文, 则 逻辑 为 真. 关键字 ether 是 可选的.

ip broadcast

如果 报文 是 IP广播报文, 则 逻辑 为 真. Tcpdump 检查 全0 和 全1 广播约定, 并且 检查 本地 的 子网掩码.

ether multicast

如果 报文 是 以太多目传送报文(multicast), 则 逻辑 为 真. 关键字 ether 是 可选的. 这实际上 是 `ether[0] & 1 != 0' 的简写.

ip multicast

如果 报文 是 IP多目传送报文, 则 逻辑 为 真.

ether proto protocol

如果 报文协议 属于 以太类型 的 protocol, 则 逻辑 为 真. Protocol 可以是 数字, 也可以是 名字, 如 ip, arp, 或 rarp. 注意 这些 标识符 也是 关键字, 所以 必须 用 反斜杠(/) 转义. [如果是 FDDI (例如, `fddi protocol arp'), 协议 标识 来自 802.2 逻辑链路控制(LLC)报头, 它 通常 位于 FDDI 报头 的 顶层. 当根据 协议标识过滤 报文 时, Tcpdump 假设 所有的 FDDI 报文 含有 LLC 报头, 而且 LLC 报头 使用 SNAP 格式.]

decnet src host

如果 DECNET 的 源地址 是 host, 则 逻辑 为 真, 该 主机地址 的 形式 可能 是 ``10.123'', 或者是 DECNET 主机名. [只有 配置成 运行 DECNET 的 Ultrix 系统 支持 DECNET 主机名.]

decnet dst host

如果 DECNET 的 目的地址 是 host, 则 逻辑 为 真.

decnet host host

如果 DECNET 的 源地址 或 目的地址 是 host, 则 逻辑 为 真.

ip, arp, rarp, decnet

是:

ether proto p

的 简写 形式, 其中 p 为 上述 协议 的 一种.

lat, moprc, mopdl

是:

ether proto p

的 简写 形式, 其中 p 为 上述 协议 的 一种. 注意 tcpdump 目前 不知道 如何 分析 这些 协议.

tcp, udp, icmp

是:

ip proto p

的 简写 形式, 其中 p 为 上述 协议 的 一种.

expr relop expr

如果 这个 关系 成立, 则 逻辑 为 真, 其中 relop 是 >, <, >=, <=, =, != 之一, expr 是 数学表达式, 由 常整数(标准C语法形式), 普通的 二进制运算符 [+, -, *, /, &, |], 一个长度运算符, 和 指定的 报文数据访问算符 组成. 要 访问 报文内 的 数据, 使用 下面的 语法:

proto [ expr : size ]

Proto 是 ether, fddi, ip, arp, rarp, tcp, udp, or icmp 之一, 同时 也指出了 下标 操作的协议层. expr 给出 字节单位 的 偏移量, 该 偏移量 相对于 指定的 协议层. Size 是 可选项, 指出 感兴趣的 字节数; 它可以 是 1, 2, 4, 缺省为 1 字节. 由 关键字 len 给出的 长度运算符 指明 报文 的 长度.

例如, `ether[0] & 1 != 0' 捕捉 所有的 多目传送 报文. 表达式 `ip[0] & 0xf != 5' 捕捉 所有 带 可选域 的 IP 报文. 表达式 `ip[6:2] & 0x1fff = 0' 只捕捉 未分片 和 片偏移为0 的数据报. 这种 检查 隐含在 tcp 和 udp 下标操作 中. 例如, tcp[0] 一定是 TCP 报头 的 第一个 字节, 而不是 其中某个 IP片 的 第一个 字节.

原语 可以 用 下述 方法 结合使用:

园括弧 括起来的 原语 和 操作符 (园括弧 在 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, 也可以 作为 复合参数, 后者 更方便 一些. 一般说来, 如果 表达式 包含 Shell 元字符(metacharacter), 传递 单个 括起来的 参数 要 容易 一些. 复合参数 在 被解析前 用 空格 联接 一起.

示例 (EXAMPLES)

显示 所有 进出 sundown 的 报文:

tcpdump host sundown

显示 helios 和 主机 hot, ace 之间 的 报文 传送:

tcpdump host helios and /( hot or ace /)

显示 ace 和 除了 helios 以外的 所有 主机 的 IP报文:

tcpdump ip host ace and not helios

显示 本地主机 和 Berkeley主机 之间 的 网络数据:

tcpdump net ucb-ether

显示 所有 通过 网关 snup 的 ftp 报文 (注意 这个 表达式 被 单引号 括起, 防止 shell 解释 园括弧):

tcpdump 'gateway snup and (port ftp or ftp-data)'

显示 既不是 来自 本地主机, 也不是 传往 本地主机 的 网络数据 (if you gateway to one other net, this stuff should never make it onto your local net).

tcpdump ip and not net localnet

显示 每个 TCP会话 的 起始 和 结束 报文 (SYN 和 FIN 报文), 而且 会话方 中有一个 远程主机.

tcpdump 'tcp[13] & 3 != 0 and not src and dst net localnet'

显示 经过 网关 snup 中 大于 576 字节的 IP 数据报:

tcpdump 'gateway snup and ip[2:2] > 576'

显示 IP 广播 或 多目传送 的 数据报, 这些 报文 不是 通过 以太网 的 广播 或 多目传送 形式 传送的:

tcpdump 'ether[0] & 1 = 0 and ip[16] >= 224'

显示 所有 不是 回响请求/应答 的 ICMP 报文 (也就是说, 不是 ping 报文):

tcpdump 'icmp[0] != 8 and icmp[0] != 0"

输出格式 (OUTPUT FORMAT)

tcpdump 的 输出格式 取决于 协议. 下面的 描述 给出 大多数 格式 的简要说明 和 范例.

链路层报头 (Link Level Headers)

如果 给出 '-e' 选项 就 显示 链路层报头. 在 以太网上, 显示 报文的 源目地址, 协议 和 报文长度.

在 FDDI 网络上, '-e' 选项 导致 tcpdump 显示出 `帧控制(frame control)' 域, 源目地址 和 报文长度. (`帧控制' 域 负责 解释 其余的 报文. 普通报文 (比如说 载有 IP数据报) 是 `异步' 报文, 优先级 介于 0 到 7; 例如, `async4'. 这些 被认为 载有 802.2 逻辑链路控制(LLC) 报文; 如果 它们 不是 ISO 数据报 或者 所谓的 SNAP 报文, 就显示出 LLC 报头.

(注意: 以下 描述中 假设 你 熟悉 RFC-1144 中说明的 SLIP 压缩算法.)

在 SLIP 链路上, tcpdump 显示出方向指示 (``I'' 指 inbound, ``O'' 指 outbound), 报文类型 和 压缩信息. 首先显示的 是 报文类型. 有三种 类型 ip, utcp 和 ctcp. 对于 ip 报文 不再 显示 更多的 链路信息. 对于 TCP 报文, 在 类型 后面 显示连接标识. 如果 报文 是 压缩过的, 就显示出 编码的报头. 特殊 情形 以 *S+n 和 *SA+n 的 形式 显示, 这里的 n 是顺序号 (或顺序号 及其 确认) 发生 的 改变 总和. 如果 不是 特殊 情形, 就显示 0 或 多少个 改变. 改变 由 U (urgent pointer), W (window), A (ack), S (sequence number) 和 I (packet ID) 指明, 后跟 一个 变化量(+n or -n), 或 另一个 值(=n). 最后显示 报文中 的 数据总和, 以及 压缩报头 的长度.

例如, 下面一行 显示了 一个 传出的 压缩的 TCP 报文, 有一个 隐含的 连接标识; 确认(ack)的 变化量是 6, 顺序号 是 49, 报文ID 是 6; 有三个字节的数据 和六个字节 的 压缩报头:

O ctcp * A+6 S+49 I+6 3 (6)

继续阅读