linux tcpdump使用詳解

2021-08-28 19:49:27 字數 4121 閱讀 3934

簡介

用簡單的話來定義tcpdump,就是:dump the traffic on a network,

根據使用者的定義對網路上的資料報進行截獲的包分析工具。 

tcpdump可以將網路中傳送的資料報的「頭」完全截獲下來提供分析。

它支援針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的資訊。

一、實用命令例項

1. 預設啟動

# tcpdump

普通情況下,直接啟動tcpdump將監視第乙個網路介面上所有流過的資料報。

2. 監視指定網路介面的資料報

# tcpdump -i eth1

如果不指定網絡卡,預設tcpdump只會監視第乙個網路介面,一般是eth0,下面的例子都沒有指定網路介面。 

3. 監視指定主機的資料報

列印所有進入或離開sundown的資料報.

# tcpdump host sundown

也可以指定ip,例如截獲所有210.27.48.1 的主機收到的和發出的所有的資料報

# tcpdump host 210.27.48.1 

列印helios 與 hot 或者與 ace 之間通訊的資料報

# tcpdump host helios and hotoracehotorace

截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊

# tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \) 

列印ace與任何其他主機之間通訊的ip 資料報, 但不包括與helios之間的資料報.

# tcpdump ip host ace and not helios

如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通訊的ip包,使用命令:

#tcpdump ip host 210.27.48.1 and ! 210.27.48.2

截獲主機hostname傳送的所有資料

# tcpdump -i eth0 src host hostname

監視所有送到主機hostname的資料報

# tcpdump -i eth0 dst host hostname

3. 監視指定主機和埠的資料報

如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令

# tcpdump tcp port 23 host 210.27.48.1

對本機的udp 123 埠進行監視 123 為ntp的服務埠

# tcpdump udp port 123 

4. 監視指定網路的資料報

列印本地主機與berkeley網路上的主機之間的所有通訊資料報(nt: ucb-ether, 

此處可理解為'berkeley網路'的網路位址,此表示式最原始的含義可表達為: 列印網路位址為ucb-ether的所有資料報)

# tcpdump net ucb-ether

列印所有通過閘道器snup的ftp資料報(注意, 表示式被單引號括起來了, 這可以防止shell對其中的括號進行錯誤解析)

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

列印所有源位址或目標位址是本地主機的ip資料報

(如果本地網路通過閘道器連到了另一網路, 則另一網路並不能算作本地網路.

(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網路的名字)

# tcpdump ip and not net localnet

5. 監視指定協議的資料報

列印tcp會話中的的開始和結束資料報, 並且資料報的源或目的不是本地網路上的主機.

(nt: localnet, 實際使用時要真正替換成本地網路的名字))

# tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0 and not src and dst net localnet'

列印所有源或目的埠是80, 網路層協議為ipv4, 

並且含有資料,而不是syn,fin以及ack-only等不含資料的資料報.(ipv6的版本的表示式可做練習)

# tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

(nt: 可理解為, ip[2:2]表示整個ip資料報的長度, 

(ip[0]&0xf)<<2)表示ip資料報包頭的長度(ip[0]&0xf代表包中的ihl域, 而此域的單位為32bit, 

要換算成位元組數需要乘以4, 即左移2. 

(tcp[12]&0xf0)>>4 表示tcp頭的長度, 此域的單位也是32bit, 換算成位元數為 ((tcp[12]&0xf0) >> 4) << 2, 

即 ((tcp[12]&0xf0)>>2). ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0 表示: 

整個ip資料報的長度減去ip頭的長度,再減去tcp頭的長度不為0, 

這就意味著, ip資料報中確實是有資料.對於ipv6版本只需考慮ipv6頭中的'payload length' 與 'tcp頭的長度'的差值, 

並且其中表達方式'ip'需換成'ip6'.)

列印長度超過576位元組, 並且閘道器位址是snup的ip資料報

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

列印所有ip層廣播或多播的資料報, 但不是物理乙太網層的廣播或多播資料報

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

列印除'echo request'或者'echo reply'型別以外的icmp資料報

( 比如,需要列印所有非ping 程式產生的資料報時可用到此表示式 .

(nt: 'echo reuqest' 與 'echo reply' 這兩種型別的icmp資料報通常由ping程式產生))

# tcpdump 'icmp[icmptype] != icmp-echo and icmp[icmptype] != icmp-echoreply'

6. tcpdump 與wireshark

wireshark(以前是ethereal)是windows下非常簡單易用的抓包工具。

但在linux下很難找到乙個好用的圖形化抓包工具。還好有tcpdump。

我們可以用tcpdump + wireshark 的完美組合實現:在 linux 裡抓包,然後在windows 裡分析包。

​#tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap

(1)tcp: ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第乙個引數的位置,用來過濾資料報的型別

(2)-i eth1 : 只抓經過介面eth1的包

(3)-t : 不顯示時間戳

(4)-s 0 : 抓取資料報時預設抓取長度為68位元組。加上-s 0 後可以抓到完整的資料報

(5)-c 100 : 只抓取100個資料報

(6)dst port ! 22 : 不抓取目標埠是22的資料報

(7)src net 192.168.1.0/24 : 資料報的源網路位址為192.168.1.0/24

(8)-w ./target.cap : 儲存成cap檔案,方便用ethereal(即wireshark)分析

7. 使用tcpdump抓取http包

#tcpdump  -xvvennss 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854

0x4745 為"get"前兩個字母"ge",0x4854 為"http"前兩個字母"ht"。

tcpdump 對截獲的資料並沒有進行徹底解碼,資料報內的大部分內容是使用十六進製制的形式直接列印輸出的。

顯然這不利於分析網路故障,通常的解決辦法是先使用帶-w引數的tcpdump 截獲資料並儲存到檔案中,

然後再使用其他程式(如wireshark)進行解碼分析。

當然也應該定義過濾規則,以避免捕獲的資料報填滿整個硬碟。

Linux tcpdump 命令使用詳解

在日常工作中,我們總是能遇上各種各樣奇怪的網路問題,比如我這台機器怎麼 ping 不通了,我的 ssh 怎麼又連不上了,這個控制台怎麼又訪問不了了等等各種網路問題,當然有時候可以通過 ping telnet arp 這些命令和工具來排查和解決,但這些都比不上去抓個包來得實在,也就是下面要分享的 tc...

linux tcpdump命令詳解

tcpdump,就是 dump the traffic on a network,根據使用者的定義對網路上的資料報進行截獲的包分析工具。tcpdump可以將網路中傳送的資料報的 頭 完全截獲下來提供分析。它支援針對網路層 協議 主機 網路或埠的過濾,並提供and or not等邏輯語句來幫助你去掉無...

Linux tcpdump命令詳解

1 命令 tcpdump 2 命令引數 a 將網路位址和廣播位址轉變成名字 d 將匹配資訊包的 以人們能夠理解的彙編格式給出 dd 將匹配資訊包的 以c語言程式段的格式給出 ddd 將匹配資訊包的 以十進位制的形式給出 e 在輸出行列印出資料鏈路層的頭部資訊 f 將外部的internet位址以數字的...