Linux tcpdump 命令使用詳解

2021-10-19 22:46:07 字數 4823 閱讀 3017

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

tcpdump 是 linux 系統中最有效的網路工具之一,凡是有網路問題十有**都可以用它快速定位。它執行在使用者態,本質是通過呼叫 libpcap 庫的各種 api 來實現資料報的抓取功能。tcpdump 是非常強大的,並且相較其他的 linux 命令和工具而且要稍微複雜一些,我們沒必要完全掌握它,關鍵是靈活運用,能解決實際問題就好了。

1、監聽網絡卡 eth0,這個方式最簡單了,但是用處不多,因為基本上只能看到資料報的資訊刷屏,壓根看不清,可以使用 ctrl+c 中斷退出,如果真有需求,可以將輸出內容重定向到乙個檔案,這樣也更方便檢視。

[root@benarchen ~]

# tcpdump -i eth0 #如果直接使用 tcpdump 一般是抓取除 lo 外的第一張網絡卡

2、監聽指定的主機的流量,抓包時指定 -nn 選項,不解析主機和埠名。這個引數很關鍵,會影響抓包的效能,一般抓包時都需要指定該選項。

[root@benarchen ~]

# tcpdump -i eth0 -nn 'host 192.168.1.231'

這樣的話,192.168.1.231 這台主機接收到的包和傳送的包都會被抓取。

[root@benarchen ~]

# tcpdump -i eth0 -nn 'src host 192.168.1.231'

這樣只有 192.168.1.231 這台主機傳送的包才會被抓取。

[root@benarchen ~]

# tcpdump -i eth0 -nn 'dst host 192.168.1.231'

這樣只有 192.168.1.231 這台主機接收到的包才會被抓取。

3、監聽指定埠,用來監聽主機的 80 埠收到和傳送的所有資料報,結合 -a (以 ascii 的方式顯示資料報)引數,在 web 開發中,真是非常有用。

[root@benarchen ~]

# tcpdump -i eth0 -nna 'port 80'

4、監聽指定主機和埠

[root@benarchen ~]

# tcpdump -i eth0 -nna 'port 80 and src host 192.168.1.231'

#多個條件可以用 and,or 連線。上例表示監聽 192.168.1.231 主機通過 80 埠傳送的資料報。

5、監聽除某個埠外的其它埠

[root@benarchen ~]

# tcpdump -i eth0 -nna '!port 22'

#如果需要排除某個埠或者主機,可以使用 「!」 符號,上例表示監聽非 22 埠的資料報。

6、抓取指定埠範圍的流量

[root@benarchen ~]

# tcpdump -ni eth0 portrange 80-9000

7、抓取指定網段的流量

[root@benarchen ~]

# tcpdump -ni eth0 net 192.168.1.0/24

8、監聽指定協議的資料,這個是用來監聽 icmp 協議的資料,類似的,如果要監聽 tcp或者是 udp 協議,只需要例中的 icmp 就可以了。

[root@benarchen ~]

# tcpdump -i eth0 -nn 'icmp'

9、將資料輸出到乙個指定的檔案

[root@benarchen ~]

# tcpdump -i eth0 -nn port 8000 -w ***.pcap

這裡我說的高階用法,其實也就是基礎用法通過靈活組合的方式以達到解決問題的效果,這也正是 tcpdump 的強大之處。

1、抓取指定客戶端訪問 ssh 的資料報

[root@benarchen ~]

# tcpdump -ni eth0 src 113.88.13.223 and dst port 22

# 也可以反過來,抓取本機 22 埠傳送給指定客戶端的資料報

[root@benarchen ~]

# tcpdump -ni eth0 src port 22 and dst 113.88.13.223

2、抓取從某個網段來,到某個網段去的流量

[root@benarchen ~]

# tcpdump -nn src net 113.88.13.223/32 and dst net 10.0.0.0/24 or 172.17.0.0/16

3、抓取來自某個主機,發往非 ssh 埠的流量

[root@benarchen ~]

# tcpdump -nni eth0 src 113.88.13.223 and not dst port 22

4、在某些複雜查詢的時候需要使用引號、單引號告訴 tcpdump 忽略特定的特殊字元,這裡的 () 就是特殊符號,如果不用引號的話,就需要使用轉義字元

[root@benarchen ~]

# tcpdump -ni eth0 'src 113.88.13.223 and (dst port 3389 or 22)'

# 或者也可以使用轉義

[root@benarchen ~]

# tcpdump -ni eth0 src 113.88.13.223 and \(dst port 3389 or 22\)

5、還可以基於包大小進行篩選,如果你正在檢視特定的包大小,可以使用這個引數

# 小於等於 48 位元組

[root@benarchen ~]

# tcpdump -ni less 48

# 等於 48 位元組

[root@benarchen ~]

# tcpdump -ni eth0 length == 48

# 大於等於 48 位元組

[root@benarchen ~]

# tcpdump -ni eth0 greater 48

6、過濾 tcp 特殊標記的資料報,可以幫助快速定位到網路問題

# 抓取某主機傳送的 rst 資料報

[root@benarchen ~]

# tcpdump -ni eth0 src host 113.88.13.223 and 'tcp[tcpflags] & (tcp-rst) != 0'

# 抓取某主機傳送的 syn 資料報

[root@benarchen ~]

# tcpdump -ni eth0 src host 113.88.13.223 and 'tcp[tcpflags] & (tcp-syn) != 0'

# 抓取某主機傳送的 fin 資料報

[root@benarchen ~]

# tcpdump -ni eth0 src host 113.88.13.223 and 'tcp[tcpflags] & (tcp-fin) != 0'

# 抓取 tcp 連線中的 syn 或 fin 包

[root@benarchen ~]

# tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'

7、抓取埠是 80,網路層協議為 ipv4, 並且含有資料,而不是 syn、fin 以及 ack 等不含資料的資料報

[root@benarchen ~]

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

# 整個 ip 資料報長度減去 ip 頭長度,再減去 tcp 頭的長度,結果不為 0,就表示資料報有 data

1、常規引數

# 基礎引數

-i:指定網路介面

-d:列出可用於抓包的介面

-s:指定資料報抓取的長度

-c:指定要抓取的資料報的數量

-w:將抓包資料儲存在檔案中

-r:從檔案中讀取資料

-c:指定檔案大小,與 -w 配合使用

-f:從檔案中讀取抓包的表示式

-n:不解析主機和埠號,這個引數很重要,一般都需要加上

-p:指定要抓取的包是流入還是流出的包,可以指定的值in、out、inout

# 輸出引數

-e:輸出資訊中包含資料鏈路層頭部資訊

-t:顯示時間戳,tttt 顯示更詳細的時間

-x:顯示十六進製制格式

-v:顯示詳細的報文資訊,嘗試 -vvv,v 越多顯示越詳細

2、組合表示式引數

# 操作物件

type,表示物件的型別,比如:host、net、port、portrange,如果不指定 type 的話,預設是 host

dir:表示傳輸的方向,可取的方式為:src、dst。

proto:表示協議,可選的協議有:ether、ip、ip6、arp、icmp、tcp、udp。

# 組合連線詞

or:表示或操作

and:表示與操作

not:表示非操作

3、建議

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位址以數字的...

Linux tcpdump命令詳解

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