Linux Tcpdump抓包入門
一、Tcpdump簡介
tcpdump
是一個在Linux系統上用于網絡分析和抓包的強大工具。它能夠捕獲網絡數據包并提供詳細的分析信息,有助于網絡管理員和開發人員診斷網絡問題和監控網絡流量。
-
安裝部署
# 在Debian/Ubuntu上安裝 sudo apt-get install tcpdump# 在CentOS/RHEL上安裝 sudo yum install tcpdump
-
底層原理
1、tcpdump由C語言開發,主要功能通過libpcap庫實現,而libpcap是linux平臺下的一個網絡數據包捕獲功能包, 通過內核BPF技術實現數據過濾功能。tcpdump使用BPF虛擬機的指令集定義過濾器表達式,然后傳遞給內核,并由解釋器執行,這使得包過濾可以在內核中進行,避免了向用戶態進程復制全部數據包,從而提升數據包的過濾性能。tcpdump將包過濾指令注入到內核,返回按條件過濾的數據包,提供多種輸出功能將抓取的報文格式化處理能力。 2、tcpdump的包過濾指令由BPF代碼實現,通過對libpcap庫的調用可以把一個輸入輸出的邏輯表達式變為BPF代碼,實現在用戶輸入的命令行和BPF代碼之間的轉換。tcpdump 程序支持使用 -d參數來 dump 出過濾規則轉化后的BPF指令字節碼。 3、應用在接收報文的時候,硬件的硬中斷首先觸發內核的軟中斷,通過內核驅動程序進入網絡設備層進行數據包的處理,然后數據包進入協議棧的網絡層和傳輸層,最后被用戶進程接收。而應用在發送報文時,首先經過內核的協議層,由鄰居子系統實現L3層ip地址轉化為L2層mac地址,然后進入網絡設備層,數據包處理完成后,經驅動程序流轉,最后由硬件將報文發出。tcpdump為了能抓取數據包,首先需要創建socket套接字,用于在應用系統接收和發送報文時獲取抓取的數據包,然后將過濾條件也就是對應的BPF程序注入到內核網絡設備層,獲取過濾后的數據包后再進行格式化處理。
-
其他
二、Tcpdump命令參數
-
基本參數
-
設置不解析域名提升速度
-n:不把ip轉化成域名,直接顯示 ip,避免執行 DNS lookups 的過程,速度會快很多 -nn:不把協議和端口號轉化成名字,速度也會快很多。 -N:不打印出host 的域名部分.。比如,,如果設置了此選現,tcpdump 將會打印’nic’ 而不是 ‘nic.ddn.mil’. 將抓取到的數據包保存為文件,可以借助wireshark進行分析
-
從文件中讀取包數據
tcpdump icmp -r all.pcap
-
輸出控制參數-顯示內容
-v:產生詳細的輸出. 比如包的TTL,id標識,數據包長度,以及IP包的一些選項。同時它還會打開一些附加的包完整性檢測,比如對IP或ICMP包頭部的校驗和。 -vv:產生比-v更詳細的輸出. 比如NFS回應包中的附加域將會被打印, SMB數據包也會被完全解碼。 -vvv:產生比-vv更詳細的輸出。比如 telent 時所使用的SB, SE 選項將會被打印, 如果telnet同時使用的是圖形界面,其相應的圖形選項將會以16進制的方式打印出來
-
輸出控制參數-顯示時間
-t:在每行的輸出中不輸出時間 -tt:在每行的輸出中會輸出時間戳 -ttt:輸出每兩行打印的時間間隔(以毫秒為單位) -tttt:在每行打印的時間戳之前添加日期的打印(此種選項,輸出的時間最直觀)
-
輸出控制參數-顯示數據包頭部
-x:以16進制的形式打印每個包的頭部數據(但不包括數據鏈路層的頭部) -xx:以16進制的形式打印每個包的頭部數據(包括數據鏈路層的頭部) -X:以16進制和 ASCII碼形式打印出每個包的數據(但不包括連接層的頭部),這在分析一些新協議的數據包很方便。 -XX:以16進制和 ASCII碼形式打印出每個包的數據(包括連接層的頭部),這在分析一些新協議的數據包很方便。
-
其他顯示控制參數
-i:指定要過濾的網卡接口,如果要查看所有網卡,可以 -i any -Q:選擇是入方向還是出方向的數據包,可選項有:in, out, inout,也可以使用 --direction=[direction] 這種寫法 -q : 簡潔地打印輸出。即打印很少的協議相關信息, 從而輸出行都比較簡短 -c : 捕獲 count 個包 tcpdump 就退出 -s : tcpdump 默認只會截取前 96 字節的內容,要想截取所有的報文內容,可以使用 -s number, number 就是你要截取的報文字節數,如果是 0 的話,表示截取報文全部內容。 -S : 使用絕對序列號,而不是相對序列號 -A : 顯示格式為ASCII -C:file-size,tcpdump 在把原始數據包直接保存到文件中之前, 檢查此文件大小是否超過file-size. 如果超過了, 將關閉此文件,另創一個文件繼續用于原始數據包的記錄. 新創建的文件名與-w 選項指定的文件名一致, 但文件名后多了一個數字.該數字會從1開始隨著新創建文件的增多而增加. file-size的單位是百萬字節(nt: 這里指1,000,000個字節,并非1,048,576個字節, 后者是以1024字節為1k, 1024k字節為1M計算所得, 即1M=1024 * 1024 = 1,048,576) -F:使用file 文件作為過濾條件表達式的輸入, 此時命令行上的輸入將被忽略.
-
-
過濾參數
-
指定ip地址過濾-host
tcpdump host 192.168.10.100# 根據源ip進行過濾 tcpdump -i eth2 src 192.168.10.100 # 根據目標ip進行過濾 tcpdump -i eth2 dst 192.168.10.200
-
基于網段進行過濾:net
tcpdump net 192.168.10.0/24# 根據源網段進行過濾 tcpdump src net 192.168 # 根據目標網段進行過濾 tcpdump dst net 192.168
-
基于端口進行過濾:port
tcpdump port 8088 # 根據源端口進行過濾 tcpdump src port 8088# 根據目標端口進行過濾 tcpdump dst port 8088#同時指定兩個端口 tcpdump port 80 or port 8088 #指定端口的范圍 tcpdump portrange 8000-8080 tcpdump src portrange 8000-8080 tcpdump dst portrange 8000-8080
-
基于協議進行過濾:proto
proto
后面跟的 的關鍵詞是固定的,只能是ip, ip6, arp, rarp, atalk, aarp, decnet, sca, lat, mopdl, moprc, iso, stp, ipx, or netbeui
這里面的其中一個。tcpdump icmp#過濾IPV4數據包(友情提示:數字 6 表示的是 tcp 在ip報文中的編號。) tcpdump ip proto 6 tcpdump ip protochain 6
-
過濾條件基本語法
-
and
:所有的條件都需要滿足,也可以表示為&&
-
or
:只要有一個條件滿足就可以,也可以表示為||
-
not
:取反,也可以使用!
-
=
:判斷二者相等 -
==
:判斷二者相等 -
!=
:判斷二者不相等 tcpdump 還提供了一些關鍵字的接口來方便我們進行判斷 -
if
:表示網卡接口名、 -
proc
:表示進程名 -
pid
:表示進程 id -
svc
:表示 service class -
dir
:表示方向,in 和 out -
eproc
:表示 effective process name -
epid
:表示 effective process ID#過濾出源地址是1.1.1.1發往任意主機的3389端口的數據包 tcpdump src 1.1.1.1 and dst port 3389#過濾出源地址是1.1.1.1發往任意主機的3389端口或者22端口的數據包 tcpdump 'src 1.1.1.1 and (dst port 3389 or 22)'#過濾來自進程名為 nc 發出的流經 en0 網卡的數據包,或者不流經 en0 的入方向數據包tcpdump "( if=en0 and proc =nc ) || (if != en0 and dir=in)"
-
-
特殊過濾
-
根據 tcpflags 進行過濾
tcpdump -i eth0 "tcp[tcpflags] & tcp-syn != 0"
-
基于包大小進行過濾
tcpdump less 32 tcpdump greater 64 tcpdump <= 128
-
根據 mac 地址進行過濾
tcpdump ether host [ehost] tcpdump ether dst [ehost] tcpdump ether src [ehost]
-
過濾廣播/多播數據包
tcpdump ether broadcast tcpdump ether multicasttcpdump ip broadcast tcpdump ip multicasttcpdump ip6 multicast
-
-
三、使用示例
-
查看網卡ens33,端口9093,協議udp的流量信息,要求顯示流量詳情
tcpdump udp -i ens33 port 9093 -XX -vvv -nn
-
HTTP 請求頭中提取 HTTP 的 User-Agent
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
-
抓取 HTTP GET 請求包
tcpdump -vvAls0 | grep 'GET'
-
提取 HTTP 請求的主機名和路徑
tcpdump -s 0 -v -n -l | egrep -i "POST /|GET /|Host:"
-
將抓包信息保存到文件
tcpdump -i eth0 -s 0 -n -w capture.pcap
-
分別抓取所有tcp、udp、icmp流量
sudo tcpdump -i eth0 -s 0 -n 'tcp' sudo tcpdump -i eth0 -s 0 -n 'udp sudo tcpdump -i eth0 -s 0 -n 'icmp'
-
僅顯示HTTP請求和響應的頭信息:
sudo tcpdump -i eth0 -A -s 0 'tcp port 80 and (tcp[13] & 8!=0)'
-
抓取指定主機(例如192.168.1.100)的HTTP流量,并保存到文件:
tcpdump -i eth0 -s 0 -w http_traffic.pcap 'tcp and host 192.168.1.100 and (port 80 or port 443)'
四、參考資料
-
https://mp.weixin.qq.com/s/JouI946715kngfve0rzztw
-
https://mp.weixin.qq.com/s/KYkJjPkKvOvt8jXQFwtkXg
-
tcp flags通信標識
Flags 標識符 [S] : SYN(開始連接) [P] : PSH(推送數據) [F] : FIN (結束連接) [R] : RST(重置連接) [.] : 沒有 Flag (意思是除上面四種類型外的其他情況,有可能是 ACK 也有可能是 URG)
-
官方連接
- https://www.tcpdump.org/manpages/tcpdump.1.html