TCPDUMP的MAN 手册(中文)
TCPDUMP的英文MAN手册,实在难看,发现中文手册,拿来和大家共享! 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) |