在日常工作中,我們總是能遇上各種各樣奇怪的網路問題,比如我這台機器怎麼 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等...