用途
在網絡上轉儲流量
語法
tcpdump [ -a ] [ -A ] [ -B buffer_size ] [ -d ] [ -D ] [ -e ] [ -f ] [ -l ] [ -K ] [ -L ] [ -M secret ] [ -r file ]][ -n ] [ -N ] [ -O ] [ -p ][ -q ] [ -Q [ -V ] ] [ -R ] [ -S ] [ -t ] [ -T ][ -u ] [ -U ] [ -v ] [ -x ] [ -X ] [ -c count ][ -C file_size ] [ -F file ] [ -G rotate_seconds ] [ -i interface ] [ -s snaplen ] [ -w file ][ -E addr ] [ -y datalinktype ] [-z command ] [-Z user ] [ expression ]
描述
tcpdump 命令將打印網絡接口上與布爾表達式相匹配的信息包的頭部分。可以在運行此命令時附帶 -w 標志以將信息包數據保存在文件中,以便進一步進行分析。還可以在運行此命令時附帶 -r 標志,以從所保存的信息包文件中讀取數據,而不是從網絡接口中讀取信息包。在所有情況下,tcpdump 命令將只處理與表達式相匹配的信息包。
如果運行此命令時未帶 -c 標志,那么 tcpdump 將繼續捕獲信息包,直到它被 SIGINT 信號(通常為 control-C)或者 SIGTERM 信號(通常為 kill(1) 命令)中斷為止。如果運行 tcpdump 時帶有-c 標志,那么它將捕獲信息包,直到它被 SIGINT 或 SIGTERM 信號中斷,或者直到已經處理了指定數目的信息包為止。
- “過濾器接收”的信息包
- 對所有信息包進行計數,而不管是否通過過濾表達式對其進行匹配。
- “內核刪除”的信息包
- 由於缺乏緩沖區空間而刪除的信息包數。
允許的原語
- dst host host
- 如果信息包的 IPv4/v6 目標字段為 host(它可以為地址或者名稱),那么為 True。
- src host host
- 如果信息包的 IPv4/v6 源字段為 host,那么為 True。
- host host
-
如果信息包的 IPv4/v6 源或目標為 host,那么為 True。以上任何 host 表達式可前置關鍵字 ip、arp、rarp 或 ip6,如在 ip host host 中所示,ip host host 等同於以下內容:
ether proto \ip and host host
如果 host 是帶有多個 IP 地址的名稱,那么會檢查每個地址是否相匹配。
- ether dst ehost
- 如果以太網目標地址為 ehost,那么為 True。Ehost 可以為 /etc/ethers 的一個名稱,也可以為一個數字(請參閱 ethers(3N) 以了解數字格式)。
- ether src ehost
- 如果以太網源地址為 ehost,那么為 True。
- ether host ehost
- 如果以太網源地址或目標地址為 ehost,那么為 True。
- gateway host
- 如果信息包使用 host 作為網關,那么為 True。例如,以太網源地址或目標地址為 host,但是 IP 源和 IP 目標都不是 host。host 必須為名稱,並且機器的 host-name-to-IP-address 解析機制(主機名文件、DNS 和 NIS 等)和機器的 host-name-to-Ethernet-address 解析機制(/etc/ethers 等)都必須找到它。等效的表達式為 ether host ehost,而不是可以結合 host/ehost 的名稱或數字使用的 host host。此時在支持 IPv6 的配置中語法不起作用。
- dst net net
- 如果信息包的 IPv4/v6 目標地址有一個網絡號 net,那么為 True。
- src net net
- 如果信息包的 IPv4/v6 源地址有一個網絡號 net,那么為 True。
- net net
- 如果信息包的 IPv4/v6 源地址或目標地址有一個網絡號 net,那么為 True。
- net net mask netmask
- 如果 IP 地址與帶有特定網絡掩碼的 net 相匹配,那么為 True。這可能受到 src 或 dst 限定。此語法對於 IPv6 網絡無效。
- net net/len
- 如果 IPv4/v6 地址與帶有網絡掩碼長度位范圍的 net 相匹配,那么為 True。可能受到 src 或 dst 限定。
- dst port port
- 如果信息包為 ip/tcp、ip/udp、ip6/tcp 或 ip6/udp,並具有目標端口值 port,那么為 True。port 可以為 /etc/services 中使用的數字或名稱(請參閱 tcp(4P) 和 udp(4P))。如果使用了名稱,那么檢查端口號和協議。如果使用了數字或者有歧義的名稱,那么將只檢查端口號(例如,dst port 513 將同時顯示 tcp/login 流量和 udp/who 流量,並且端口域將同時顯示 tcp/domain 和 udp/domain 流量)。
- src port port
- 如果信息包具有源端口值 port,那么為 True。
- port port
- 如果信息包的源或目標端口為 port,那么為 True。以上任何 port 表達式都可以前置關鍵字 tcp 或 udp,如 tcp src port port 中所示,tcp src port port 僅與源端口為 port 的 tcp 信息包相匹配。
- less length
- 如果信息包的長度小於或等於 length,那么為 True。這等價於 len <= length。
- greater length
- 如果信息包的長度大於或等於 length,那么為 True。這等價於:len >= length。
- ip proto protocol
- 如果信息包為 protocol 類型協議的 IP 信息包,那么為 True。protocol 可以為一個數字或以下名稱之一:icmp、icmp6、igmp、igrp、pim、ah、esp、vrrp、udp 或 tcp。請注意,標識 tcp、udp 和 icmp 還是關鍵字,必須通過反斜杠(\)(在 C-shell 中為 \\)進行轉義。請注意,此原語不追蹤協議標題鏈。
- ip6 proto protocol
- 如果信息包為 protocol 類型協議的 IPv6 信息包,那么為 True。請注意,此原語不追蹤協議標題鏈。
- ip6 protochain protocol
- 如果信息包為 IPv6 信息包,並包含協議標題(在其協議標題鏈中帶有類型協議),那么為 True。例如,ip6 protochain 6 與任何 IPv6 信息包(在協議標題鏈中帶有 TCP 協議標題)都相匹配。在 IPv6 標題和 TCP 標題之間,信息包可能包含這幾個標題,例如,認證標題、路由標題或逐跳點選項標題。此原語發射的伯克利數據包過濾器 (BPF) 代碼很復雜, tcpdump中的 BPF 優化器代碼無法對其進行優化,所以它速度有些慢。
- ip protochain protocol
- 等價於 ip6 protochain protocol。但是,此項用於 IPv4。
- ether broadcast
- 如果信息包是以太網廣播信息包,那么為 True。ether 關鍵字為可選。
- ip broadcast
-
如果信息包是 IPv4 廣播信息包,那么為 True。它檢查全 0 和全 1 的廣播約定,並查找已在其上完成捕獲的接口上的子網掩碼。
如果已在其中完成了捕獲的接口的子網掩碼不可用,例如,因為已在其中完成了捕獲的接口沒有網絡掩碼,那么無法正確執行此檢查。
- ether multicast
- 如果信息包是以太網多點廣播信息包,那么為 True。ether 關鍵字為可選。它是 ether[0] & 1 != 0 的縮略語。
- ip multicast
- 如果信息包是 IP 多點廣播信息包,那么為 True。
- ip6 multicast
- 如果信息包是 IPv6 多點廣播信息包,那么為 True。
- ether proto protocol
-
如果信息包為 ether 類型協議,那么為 True。protocol 可以為數字或以下名稱之一:ip、ip6、arp、rarp、atalk、aarp、decnet、sca、lat、mopdl、moprc、iso、stp、ipx 或 netbeui。請注意,這些標識也是關鍵字,並且必須通過反斜杠(\)進行轉義。
[在 FDDI(例如,“fddi protocol arp”)、令牌環(例如,“tr protocol arp”)和 IEEE 802.11 無線 LAN(例如,“wlan protocol arp”)的情況下,對於大部分這些協議,協議標識來源於 802.2 邏輯鏈路控制(LLC)標題,此標題通常位於 FDDI、令牌環或 802.11 標題的頂層。為 FDDI、令牌環或 802.11 上的大多數協議標識進行過濾時,對於封裝的以太網,tcpdump 僅檢查 LLC 標題的協議標識字段是否是帶有組織單元標識(OUI)0x000000 的所謂 SNAP 格式;它不檢查信息包是否是帶有 OUI 0x000000 的 SNAP 格式。異常如下:
- iso
- tcpdump 檢查 LLC 標題的 DSAP(目標服務訪問點)和 SSAP(源服務訪問點)字段。
- stp and netbeui
- tcpdump 檢查 LLC 標題的 DSAP。
- atalk
- tcpdump 檢查帶有 OUI 0x080007 和 AppleTalk etype 的 SNAP 格式的信息包。
- iso、sap 和 netbeui
- tcpdump 將檢查 802.3 框架,然后檢查 LLC 標題,這些操作與對 FDDI、令牌環和 802.11 的操作相同。
- atalk
- tcpdump 將檢查以太網框架中的 AppleTalk etype 和 SNAP 格式的信息包,這些操作與對 FDDI、令牌環和 802.11 的操作相同。
- aarp
- tcpdump 將要么檢查以太網框架中的 AppleTalk ARP etype,要么檢查帶有 OUI 0x000000 的 802.2 SNAP 框架中的 AppleTalk ARP etype;
- ipx
- tcpdump 將檢查以太網框架中的 IPX etype、LLC 標題中的 IPX DSAP、IPX 的不帶 LLC 標題的 802.3 封裝以及 SNAP 框架中的 IPX etype。
- decnet src host
- 如果 DECNET 源地址為 host,它可能是格式 10.123 的地址,也可能是 DECNET 主機名。[DECNET 主機名支持只在經過配置以運行 DECNET 的 Ultrix 系統上可用。]
- decnet dst host
- 如果 DECNET 目標地址為 host,那么為 True。
- decnet host host
- 如果 DECNET 源地址或目標地址為 host,那么為 True。
- ifname interface
- 如果信息包記錄為來自指定接口,那么為 True。
- on interface
- 與 ifname 修飾符同義。
- rnr num
- 如果信息包記錄為與指定 PF 規則號碼相匹配,那么為 True(僅適用於 OpenBSD 的 pf(4) 記錄的信息包)。
- rulenum num
- 與 rnr 修飾符同義。
- reason code
- 如果用指定 PF 原因碼來記錄信息包,那么為 True。已知的代碼為:match、bad-offset、fragment、short、normalize 和 memory(僅適用於 OpenBSD 的 pf(4) 記錄的信息包)。
- action act
- 如果在記錄信息包時 PF 采取指定操作,那么為 True。已知的操作為:傳輸和阻塞(僅適用於 OpenBSD 的 pf(4) 記錄的信息包)
- netbeui
-
ip、ip6、arp、rarp、atalk、aarp、decnet、iso、stp 和 ipx。
縮略語:
ether proto p
其中 p 是上述協議之一。
lat、moprc 和 mopdl
- vlan [ vlan_id]
- 如果包是 IEEE 802.1Q VLAN 包,那么為 True。如果指定了 vlan_id,那么僅具有所指定 vlan_id 的包才為 True。請注意,如果假定包是 VLAN 包,在表達式中遇到的第一個 vlan 關鍵字更改了表達式其余部分的譯碼偏移量。
- tcp、udp 和 icmp
-
縮略語:
ip proto p or ip6 proto p
其中 p 是上述協議之一。
- iso proto protocol
- 如果信息包是 protocol 類型協議的 OSI 信息包,那么為 True。protocol 可以為數字或以下名稱之一:clnp、esis 或 isis。
- clnp、esis 和 isis
-
縮略語:
- iso proto p
- l1、l2、iih、lsp、snp、csnp 和 psnp
- IS-IS PDU 類型的縮略語。
- vpi n
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並帶有虛路徑標識 n,那么為 True。
- vci n
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並帶有虛擬信道標識 n,那么為 True。
- lane
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且是 ATM LANE 信息包,那么為 True。請注意,如果假定信息包是 LANE 模擬以太網信息包,或者是 LANE LE Control 信息包,那么在表達式中遇到的第一個 lane 關鍵字更改了在表達式其余部分中完成的測試。如果未指定 lane,那么在假定信息包是封裝 LLC 的信息包的情況下完成測試。
- llc
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且是封裝 LLC 的信息包,那么為 True。
- oamf4s
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且是段 OAM F4 流單元(VPI=0 和 VCI=3),那么為 True。
- oamf4e
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且是端到端 OAM F4 流單元(VPI=0 和 VCI=4),那么為 True。
- oamf4
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且是段或端到端 OAM F4 流單元(VPI=0 和(VCI=3 | VCI=4)),那么為 True。
- oam
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且是段或端到端 OAM F4 流單元(VPI=0 和(VCI=3 | VCI=4)),那么為 True。
- metac
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且位於元信令環路(VPI=0 和 VCI=1)上,那么為 True。
- bcc
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且位於廣播信令環路(VPI=0 和 VCI=2)上,那么為 True。
- sc
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且位於信令環路(VPI=0 和 VCI=5)上,那么為 True。
- ilmic
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並且位於 ILMI 環路(VPI=0 和 VCI=16)上,那么為 True。
- connectmsg
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並位於信令環路,而且是 Q.2931 設置、呼叫進程、連接、連接 ACK、發布或發布完成消息,那么為 True。
- metaconnect
- 如果信息包是用於 Solaris 上 SunATM 的 ATM 信息包,並位於元信令環路,而且是 Q.2931 設置、呼叫進程、連接、發布或發布完成消息,那么為 True。
- expr relop expr
-
如果關系成立,其中 relop 是 >、<、>=、<=、= 和 != 中的一個,expr 是算術表達式,此算術表達式由整數常量(用標准 C 語法表示)、常規二目運算符 [+、-、*、/、& 和 |]、長度運算符和特殊信息包數據存取器組成,那么為 true。要訪問信息包里的數據,請使用以下語法:
proto [ expr : size ]
Proto 是 ether、fddi、tr、wlan、ppp、slip、link、ip、arp、rarp、tcp、udp、icmp 或 ip6 其中之一,並且表明索引操作的協議層。(ether、fddi、wlan、tr、ppp、slip 和 link 都稱為鏈接層。)請注意,tcp、udp 和其他上層協議類型僅適用於 IPv4,而不是 IPv6(以后將對其進行修訂)。與表明的協議層相關的字節偏移量由 expr 給定。size 為可選,它表明興趣字段里的字節數;它可以為 1、2 或 4,缺省值為 1。由關鍵字 len 表示的長度運算符給定信息包的長度。
例如,ether[0] & 1 != 0 捕獲所有多點廣播流量。表達式 ip[0] & 0xf !=5 捕獲帶有選項的所有 IP 信息包。表達式 ip[6:2] & 0x1fff = 0 僅捕獲未分段的信息包和分段信息包的片段零。此檢查隱式適用於 tcp 和 udp 索引操作。例如,tcp[0] 始終表示 TCP 標題的第一個字節,而從不表示插入片段的第一個字節。
某些偏移量和字段值可以表達為名稱而不是數字值。以下協議標題字段偏移量可用:icmptype(ICMP 類型字段)、icmpcode(ICMP 代碼字段)和 tcpflags(TCP 標志字段)。
以下 ICMP 類型字段值可用:icmp-echoreply、icmp-unreach、icmp-sourcequench、icmp-redirect、icmp-echo、icmp-routeradvert、 icmp-routersolicit、icmp-timxceed、icmp-paramprob、icmp-tstamp、icmp-tstampreply、icmp-ireq、icmp-ireqreply、icmp-maskreq 和 icmp-maskreply。
以下 TCP 標志字段值可用:tcp-fin、tcp-syn、tcp-rst、tcp-push、tcp-ack 和 tcp-urg。
組合原語
非(“!”或“not”)。
並置(“&&”或“and”)。
或(“||”或“or”)。

如果給出了不帶關鍵字的標識,那么假定使用最新的關鍵字。例如,not host vs and ace 是 not host vs and host ace 的縮略語,不應與 not ( host vs or ace ) 混淆。
表達式自變量可作為單自變量或多自變量(選擇兩者中較方便的一種)傳遞給 tcpdump。通常,如果表達式包含 Shell 元字符,將其作為單個的、加引號的自變量來傳遞會更容易。多自變量在語法分析之前以空格並置。
標志
參數
- expressions
-
選擇要轉儲的信息包。如果提供了表達式,那么只會對表達式為
true 的信息包進行轉儲;否則,將轉儲網絡中的所有信息包。
表達式由一個或多個原語構成。原語通常由前面帶有一個或多個限定符的標識(名稱或數字)構成。存在三種不同的限定符:
- type 限定符顯示標識名稱或數字所指的原語類型。可能的類型為 host、net 和 port。例如,“host foo”、“net 128.3”和“port 20”。如果沒有類型限定符,那么將采用 host。
- dir 限定符指定到標識和/或來自標識的特定傳輸方向。可能的方向為 src、dst、src 或 dst 和 src 以及 dst。如果沒有 dir 限定符,那么將采用 src 或 dst。對於某些鏈接層(例如,SLIP)和某些其他設備類型,入站和出站限定符可以用來指定希望的方向。
- proto 限定符限制與特定協議相匹配。可能的協議為 fddi、tr、wlan、ip、ip6、arp、rarp、decnet、tcp 和 udp。如果沒有 proto 限定符,那么將采用與該類型一致的所有協議。
fddi 是 ether 的別名。解析器將其理解為:“在指定網絡接口上使用的數據鏈路級”。FDDI 頭部分包含類似以太網的源地址和目標地址,並經常包含類似以太網的信息包類型,因此可以在這些 FDDI 字段上進行過濾,此操作與對類似以太網字段的操作相同。FDDI 頭部分還包含其他字段,但是無法在過濾表達式中對其進行命名。
與 fddi 類似,tr 和 wlan 是 ether 的別名。上一段有關 FDDI 頭部分的論述還適用於令牌環和 802.11 無線 LAN 頭部分。對於 802.11 頭部分,目標地址為 DA 字段,源地址為 SA 字段;不測試 BSSID、RA 和 TA 字段。
除以上所述之外,還有一些特殊的“原語”關鍵字不遵循這種模式:網關、廣播、小於、大於和算術表達式。所有這些關鍵字描述如下。
通過使用單詞 and、or 和 not 組合原語來構建更復雜的過濾表達式。
環境變量
退出狀態
項目 | 描述 |
---|---|
0 | 成功。 |
非零 | 錯誤。 |
安全性
從網絡接口讀取信息包需要對 /dev/bpf* 的讀訪問權,通常僅限於 root 用戶。從文件讀取信息包除了文件讀許可權之外,不需要任何特殊權限。
示例
- 要顯示從日落起到達或出發的所有包,請輸入:
tcpdump host sundown
- 要顯示 helios 與 hot 或 ace 之間的流量,請輸入:
tcpdump host helios and \( hot or ace \)
- 要顯示 ace 與除了 helios 之外任何主機之間的所有 IP 包,請輸入:
tcpdump ip host ace and not helios
- 要顯示本地主機與伯克利的主機之間的所有流量,請輸入:
tcpdump net ucb-ether
- 要顯示通過因特網網關 snup 的所有 ftp 流量,請輸入:
tcpdump 'gateway snup and (port ftp or ftp-data)'
注:將表達式用引號引起來,以防止 shell 誤解括號。 - 要顯示既不是來自本地主機也不是導向本地主機的流量(如果您的網關指向其他網絡,該網絡決不能連到您的本地網絡上),請輸入:
tcpdump ip and not net localnet
- 要顯示涉及到非本地主機的每個 TCP 對話的開始和結束包(SYN 和 FIN 包),請輸入:
tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and d 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[icmptype] != icmp-echo and icmp[icmptype] != icmp-e choreply'
標准錯誤
所有的錯誤和警告都發送到 stderr。
限制
跟蹤信息包時,如果跨越了夏令時變更,那么提供的時間戳記會有偏差(將忽略時間變更)。
在除了令牌環頭部分中的那些字段之外的字段中的過濾表達式會錯誤地處理源路由令牌環信息包。
在 802.11 頭部分中的那些字段之外的字段中的過濾表達式會錯誤地處理帶有 To DS 和 From DS 集合的 802.11 數據包。
ip6 proto 應該追蹤標題鏈,但在此時它未進行此操作。為此工作情況提供了 ip6 protochain。
傳輸層頭部分的算術表達式類似於 tcp[0],對 IPv6 信息包不起作用。它僅查看 IPv4 信息包。
包跟蹤在 WPAR 環境中不起作用,因為底層 BPF 驅動程序無法識別 WPAR。
文件
項目 | 描述 |
---|---|
/usr/sbin/tcpdump | tcpdump 命令的位置。 |
/usr/lib/libpcap.a | |
/dev/bpf* | |
/opt/freeware/lib/libcrypto.a(libcrypto.so) | 可選 |