天天看點

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)

繼續閱讀