絡(luò)抓包利器tcpdump:從原理到實(shí)戰(zhàn)排查指南)
1. 網(wǎng)絡(luò)抓包從“黑盒”到“透視”的必備技能在Linux系統(tǒng)管理和網(wǎng)絡(luò)運(yùn)維的世界里我們常常需要面對(duì)一個(gè)“黑盒”數(shù)據(jù)包在網(wǎng)絡(luò)中穿梭我們能看到服務(wù)正?;虍惓s很難直觀地看到底層究竟發(fā)生了什么。是連接建立失敗是請(qǐng)求沒(méi)有發(fā)出還是響應(yīng)沒(méi)有回來(lái)是某個(gè)數(shù)據(jù)包被意外丟棄還是協(xié)議交互出現(xiàn)了異常這時(shí)候一個(gè)得力的“網(wǎng)絡(luò)透視鏡”就顯得至關(guān)重要。而tcpdump正是每一位Linux從業(yè)者工具箱里那把最鋒利、最可靠的瑞士軍刀。它不依賴(lài)任何圖形界面僅憑命令行就能捕獲流經(jīng)指定網(wǎng)絡(luò)接口的每一個(gè)比特并以人類(lèi)可讀當(dāng)然需要一些學(xué)習(xí)的方式呈現(xiàn)出來(lái)讓你直接對(duì)話(huà)網(wǎng)絡(luò)最原始的流量。簡(jiǎn)單來(lái)說(shuō)tcpdump是一個(gè)命令行下的網(wǎng)絡(luò)數(shù)據(jù)包捕獲與分析工具。它的核心功能就是“抓包”——監(jiān)聽(tīng)網(wǎng)卡捕獲經(jīng)過(guò)的數(shù)據(jù)包并根據(jù)你設(shè)定的過(guò)濾規(guī)則展示或保存你關(guān)心的那部分流量。無(wú)論是排查復(fù)雜的網(wǎng)絡(luò)連通性問(wèn)題、分析應(yīng)用層協(xié)議如HTTP、DNS、MySQL的交互細(xì)節(jié)、進(jìn)行安全審計(jì)以發(fā)現(xiàn)可疑流量還是單純?yōu)榱藢W(xué)習(xí)網(wǎng)絡(luò)協(xié)議如TCP三次握手、TLS握手tcpdump都是不可替代的首選工具。對(duì)于系統(tǒng)管理員、網(wǎng)絡(luò)工程師、后端開(kāi)發(fā)乃至安全研究員掌握tcpdump的熟練使用是脫離“初級(jí)”標(biāo)簽的關(guān)鍵一步。它讓你從被動(dòng)地查看日志和監(jiān)控圖表轉(zhuǎn)變?yōu)橹鲃?dòng)地、精準(zhǔn)地洞察網(wǎng)絡(luò)行為的本質(zhì)。2. tcpdump核心設(shè)計(jì)哲學(xué)與工作邏輯2.1 為什么是tcpdump核心優(yōu)勢(shì)解析在眾多網(wǎng)絡(luò)分析工具如Wireshark它甚至使用tcpdump的libpcap庫(kù)作為底層捕獲引擎中tcpdump為何能經(jīng)久不衰其設(shè)計(jì)哲學(xué)決定了它的獨(dú)特地位。首先輕量級(jí)與無(wú)處不在。tcpdump通常作為tcpdump包或libpcap-tools的一部分存在體積小巧幾乎在所有Linux發(fā)行版和類(lèi)Unix系統(tǒng)的默認(rèn)倉(cāng)庫(kù)中都能找到。在服務(wù)器生產(chǎn)環(huán)境特別是資源受限或沒(méi)有圖形界面的環(huán)境中安裝一個(gè)龐大的GUI工具是不現(xiàn)實(shí)的而tcpdump只需一條yum install tcpdump或apt-get install tcpdump命令即可部署開(kāi)箱即用。其次強(qiáng)大的過(guò)濾能力。這是tcpdump的靈魂。它使用伯克利包過(guò)濾器BPF語(yǔ)法允許你在捕獲階段就進(jìn)行極其精細(xì)的過(guò)濾。這意味著你可以直接告訴網(wǎng)卡“我只關(guān)心從IP 192.168.1.100發(fā)往端口80的TCP流量”網(wǎng)卡會(huì)直接將不匹配的數(shù)據(jù)包丟棄避免海量數(shù)據(jù)沖刷你的終端或占滿(mǎn)磁盤(pán)。這種在“數(shù)據(jù)鏈路層”進(jìn)行的過(guò)濾效率遠(yuǎn)高于抓取所有包再在應(yīng)用層篩選。再者命令行的高效與可腳本化。所有操作通過(guò)參數(shù)完成非常適合嵌入到自動(dòng)化腳本中。你可以寫(xiě)一個(gè)腳本定時(shí)抓包、分析并將結(jié)果通過(guò)郵件發(fā)送。這種靈活性是GUI工具難以比擬的。最后它是學(xué)習(xí)網(wǎng)絡(luò)協(xié)議的絕佳沙盒。通過(guò)觀察真實(shí)的、未經(jīng)修飾的數(shù)據(jù)包序列你對(duì)TCP/IP協(xié)議棧的理解將從書(shū)本上的圖表變?yōu)榱鲃?dòng)的、可驗(yàn)證的實(shí)踐認(rèn)知。2.2 底層原理libpcap與內(nèi)核的協(xié)作理解tcpdump如何工作能讓你更好地使用它。其核心依賴(lài)于libpcapLinux上對(duì)應(yīng)libpcapWindows上為WinPcap庫(kù)。當(dāng)你執(zhí)行tcpdump -i eth0時(shí)大致發(fā)生了以下幾步權(quán)限檢查tcpdump需要CAP_NET_RAW能力通常意味著需要root權(quán)限才能將網(wǎng)卡設(shè)置為混雜模式Promiscuous Mode或直接讀取原始套接字Raw Socket。打開(kāi)設(shè)備libpcap通過(guò)PF_PACKET套接字打開(kāi)指定的網(wǎng)絡(luò)接口如eth0。設(shè)置過(guò)濾與模式將用戶(hù)指定的BPF過(guò)濾規(guī)則編譯成內(nèi)核可執(zhí)行的字節(jié)碼傳遞給內(nèi)核。同時(shí)根據(jù)需要設(shè)置網(wǎng)卡為混雜模式監(jiān)聽(tīng)所有經(jīng)過(guò)網(wǎng)卡的流量而不僅是發(fā)給本機(jī)的。內(nèi)核空間捕獲內(nèi)核網(wǎng)絡(luò)驅(qū)動(dòng)收到數(shù)據(jù)包后會(huì)將其復(fù)制一份到為libpcap分配的緩沖區(qū)。BPF過(guò)濾器在內(nèi)核層運(yùn)行只有匹配的包才會(huì)被傳遞到用戶(hù)空間。這一步的高效性是關(guān)鍵。用戶(hù)空間處理tcpdump從libpcap的緩沖區(qū)中讀取捕獲到的數(shù)據(jù)包根據(jù)協(xié)議進(jìn)行解析并按照指定格式輸出到終端或文件。注意在生產(chǎn)環(huán)境抓包尤其是高流量網(wǎng)卡上務(wù)必使用-c參數(shù)限制抓包數(shù)量或使用精細(xì)的BPF過(guò)濾器。否則海量數(shù)據(jù)包可能瞬間刷屏甚至因頻繁的上下文切換和內(nèi)存拷貝導(dǎo)致服務(wù)器負(fù)載升高。3. 從安裝到第一個(gè)抓包實(shí)戰(zhàn)入門(mén)3.1 環(huán)境準(zhǔn)備與安裝絕大多數(shù)Linux發(fā)行版都可通過(guò)包管理器安裝。你需要root或具有sudo權(quán)限的用戶(hù)?;赗HEL/CentOS/Fedora:sudo yum install tcpdump # CentOS 7及以前 sudo dnf install tcpdump # CentOS 8/Fedora基于Debian/Ubuntu:sudo apt-get update sudo apt-get install tcpdumpopenSUSE:sudo zypper install tcpdump安裝完成后可以通過(guò)tcpdump --version查看版本信息確認(rèn)安裝成功。3.2 基礎(chǔ)命令格式與第一個(gè)抓包tcpdump的基本命令格式為tcpdump [選項(xiàng)] [過(guò)濾表達(dá)式]讓我們進(jìn)行最簡(jiǎn)單的抓包了解其輸出格式。步驟1查看可用網(wǎng)絡(luò)接口在不確定接口名時(shí)使用-D選項(xiàng)。sudo tcpdump -D輸出可能類(lèi)似于1.eth0 2.eth1 3.lo [Loopback] 4.any (Pseudo-device that captures on all interfaces)lo是回環(huán)接口any是一個(gè)虛擬設(shè)備代表所有活躍接口。步驟2捕獲第一個(gè)數(shù)據(jù)包我們抓取eth0接口上的前2個(gè)數(shù)據(jù)包。sudo tcpdump -i eth0 -c 2-i eth0: 指定網(wǎng)絡(luò)接口為eth0。-c 2: 捕獲2個(gè)包后自動(dòng)停止。你會(huì)看到類(lèi)似如下的輸出tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes 15:27:33.123456 IP 192.168.1.10.54218 192.168.1.1.53: 47441 A? www.google.com. (32) 15:27:33.145678 IP 192.168.1.1.53 192.168.1.10.54218: 47441 1/0/0 A 142.250.185.196 (48)輸出解讀第一行是提示信息告訴你使用-v可以看到更詳細(xì)解碼。第二行說(shuō)明了監(jiān)聽(tīng)接口、鏈路類(lèi)型以太網(wǎng)和捕獲大小。第三、四行是兩個(gè)具體的數(shù)據(jù)包。15:27:33.123456: 時(shí)間戳?xí)r:分:秒.微秒。IP: 網(wǎng)絡(luò)層協(xié)議是IPv4。192.168.1.10.54218 192.168.1.1.53: 源IP和端口 目的IP和端口。這里54218是客戶(hù)端隨機(jī)端口53是DNS服務(wù)端口。47441 A? www.google.com. (32): DNS查詢(xún)?cè)斍椤?7441是事務(wù)ID表示啟用遞歸查詢(xún)A?表示查詢(xún)A記錄(32)是數(shù)據(jù)包長(zhǎng)度。第四行是DNS響應(yīng)包含了查詢(xún)到的IP地址142.250.185.196。恭喜你已經(jīng)完成了第一次抓包你剛剛親眼目睹了一次DNS解析過(guò)程。4. 核心技能精通過(guò)濾表達(dá)式BPF語(yǔ)法不會(huì)過(guò)濾的tcpdump使用者就像在瀑布下用杯子接水費(fèi)力且無(wú)用。BPF語(yǔ)法是tcpdump的精髓它由**原語(yǔ)Primitives和運(yùn)算符Operators**構(gòu)成。4.1 常見(jiàn)過(guò)濾原語(yǔ)原語(yǔ)用于匹配數(shù)據(jù)包的特定字段格式通常為proto [src|dst] [host|net|port] ...類(lèi)型限定符:host: 指定主機(jī)IP或主機(jī)名。host 192.168.1.1net: 指定網(wǎng)絡(luò)段。net 192.168.1.0/24port: 指定端口。port 80portrange: 指定端口范圍。portrange 6000-6010方向限定符:src: 源。src host 10.0.0.1dst: 目的。dst port 443省略時(shí)表示雙向。協(xié)議限定符:ip,ip6,arp,tcp,udp,icmp等。tcpudp其他常用原語(yǔ):less length: 數(shù)據(jù)包長(zhǎng)度小于length。greater length: 數(shù)據(jù)包長(zhǎng)度大于length。ether host mac-addr: 根據(jù)MAC地址過(guò)濾。ether host 00:11:22:33:44:554.2 邏輯運(yùn)算符組合過(guò)濾使用邏輯運(yùn)算符將原語(yǔ)組合成復(fù)雜表達(dá)式。and或: 邏輯與。tcp and port 80or或||: 邏輯或。port 53 or port 80not或!: 邏輯非。not arp括號(hào)(): 改變優(yōu)先級(jí)。host 192.168.1.1 and (port 80 or port 443)4.3 高級(jí)過(guò)濾深入?yún)f(xié)議頭部BPF的強(qiáng)大在于可以直接訪問(wèn)數(shù)據(jù)包各層頭部的特定字節(jié)偏移。語(yǔ)法為proto [expr:size]。匹配TCP標(biāo)志位:tcp[tcpflags] (tcp-syn|tcp-fin) ! 0: 匹配包含SYN或FIN標(biāo)志的TCP包常用于觀察連接建立與關(guān)閉。tcp[tcpflags] tcp-syn ! 0 and tcp[tcpflags] tcp-ack 0: 匹配純SYN包SYN洪水攻擊常見(jiàn)特征。匹配IP分片:ip[6:2] 0x3fff ! 0: 匹配分片的IP包ip[6]是分片偏移字段。匹配HTTP GET請(qǐng)求在TCP載荷中匹配字符串:tcp port 80 and tcp[((tcp[12:1] 0xf0) 2):4] 0x47455420: 匹配包含“GET ”十六進(jìn)制47 45 54 20的TCP載荷。這需要理解TCP頭部長(zhǎng)度字段的計(jì)算tcp[12:1] 0xf0) 2得到TCP頭部長(zhǎng)度。實(shí)操心得對(duì)于復(fù)雜的協(xié)議內(nèi)容過(guò)濾如HTTP特定路徑更常見(jiàn)的做法是先使用tcpdump -w將流量保存為pcap文件然后用Wireshark或更專(zhuān)業(yè)的腳本進(jìn)行離線、更友好的分析。在命令行下進(jìn)行深度載荷匹配容易出錯(cuò)且效率不高。4.4 常用過(guò)濾組合示例這里提供一個(gè)表格快速查閱常見(jiàn)場(chǎng)景的過(guò)濾命令場(chǎng)景描述過(guò)濾表達(dá)式示例解釋抓取所有進(jìn)出某主機(jī)的流量host 192.168.1.100雙向流量抓取來(lái)自某主機(jī)的流量src host 192.168.1.100僅源IP抓取去往某端口的流量dst port 3389常用于排查RDP連接抓取特定網(wǎng)段的流量net 10.10.0.0/16CIDR表示法抓取非ICMP的IP流量ip and not icmp排除ping包干擾抓取TCP端口80或443的流量tcp and (port 80 or port 443)Web流量抓取DNS查詢(xún)和響應(yīng)port 53抓取TCP三次握手tcp[tcpflags] tcp-syn ! 0單獨(dú)抓SYN包抓取TCP連接建立SYN-ACKtcp[tcpflags] tcp-syntcp-ack抓取廣播/多播包ether broadcast或ether multicast5. 高級(jí)參數(shù)與輸出控制掌握過(guò)濾是核心但靈活運(yùn)用參數(shù)能讓抓包過(guò)程更高效、結(jié)果更易讀。5.1 輸出控制參數(shù)-n:禁用名稱(chēng)解析。不將IP地址轉(zhuǎn)換為主機(jī)名不將端口號(hào)轉(zhuǎn)換為服務(wù)名如80-http。強(qiáng)烈建議始終加上-n因?yàn)镈NS解析會(huì)引入延遲、產(chǎn)生額外流量并且在解析失敗時(shí)輸出不直觀。-nn: 在-n基礎(chǔ)上連端口服務(wù)名也禁用解析。port 80會(huì)顯示為80而非http。-v,-vv,-vvv:增加輸出詳細(xì)程度。-v顯示更多協(xié)議信息如TTL, ID等-vv和-vvv顯示更詳細(xì)的應(yīng)用層數(shù)據(jù)。根據(jù)需求選擇通常-v足夠。-q:快速安靜輸出。顯示更少的信息只顯示協(xié)議級(jí)別的摘要。-e:打印鏈路層頭部信息。顯示源和目的MAC地址。-l:行緩沖輸出。當(dāng)你想通過(guò)管道|將輸出實(shí)時(shí)傳遞給其他工具如grep處理時(shí)必須使用此參數(shù)否則輸出會(huì)因緩沖而延遲。-A:以ASCII格式打印每個(gè)數(shù)據(jù)包的載荷。非常適合查看明文協(xié)議如HTTP、SMTP、FTP。-X或-XX:同時(shí)以十六進(jìn)制和ASCII格式打印載荷。-XX會(huì)額外打印鏈路層頭部。這是分析二進(jìn)制協(xié)議或加密協(xié)議亂碼的利器。-S:打印絕對(duì)的TCP序列號(hào)。默認(rèn)情況下tcpdump為了便于閱讀會(huì)顯示相對(duì)序列號(hào)。但在分析序列號(hào)相關(guān)問(wèn)題時(shí)如重傳需要使用-S查看真實(shí)值。5.2 文件操作參數(shù)-w file.pcap:將原始數(shù)據(jù)包寫(xiě)入文件。文件格式通常是libpcap格式可以被tcpdump、Wireshark等工具讀取。這是保存證據(jù)、離線分析的必備操作。-r file.pcap:從文件中讀取數(shù)據(jù)包而不是從網(wǎng)絡(luò)接口。可以結(jié)合過(guò)濾表達(dá)式對(duì)抓包文件進(jìn)行“二次過(guò)濾分析”。-G rotate_seconds:按時(shí)間旋轉(zhuǎn)輸出文件。與-w配合使用例如-G 3600 -w capture-%H-%M.pcap會(huì)每小時(shí)生成一個(gè)新文件。用于長(zhǎng)期抓包。-C file_size:按文件大小旋轉(zhuǎn)。當(dāng)文件達(dá)到指定大小單位MB后切換到新文件。例如-C 100 -w capture.pcap會(huì)生成capture.pcap,capture.pcap1, ...-W filecount: 與-C或-G配合限制最大文件數(shù)量進(jìn)行循環(huán)覆蓋。5.3 性能與緩沖區(qū)相關(guān)參數(shù)-c count:捕獲指定數(shù)量的包后停止。這是防止刷屏的最基本保障。-s snaplen:設(shè)置抓包快照長(zhǎng)度。每個(gè)數(shù)據(jù)包只捕獲前snaplen個(gè)字節(jié)。默認(rèn)是262144字節(jié)對(duì)于大多數(shù)情況足夠。如果你只關(guān)心頭部比如排查連接問(wèn)題可以設(shè)置為一個(gè)較小的值如-s 96這能顯著減少內(nèi)存和磁盤(pán)占用提升性能。-B buffer_size:設(shè)置操作系統(tǒng)內(nèi)核緩沖區(qū)大小單位KB。如果抓包時(shí)出現(xiàn)“packet dropped by kernel”的警告可以嘗試增大此值例如-B 4096。6. 經(jīng)典場(chǎng)景實(shí)戰(zhàn)排查與分析的思維過(guò)程理論說(shuō)再多不如實(shí)戰(zhàn)。下面我們模擬幾個(gè)真實(shí)場(chǎng)景看看如何組合運(yùn)用上述知識(shí)。6.1 場(chǎng)景一排查服務(wù)器A無(wú)法訪問(wèn)服務(wù)器B的TCP 8080端口現(xiàn)象在服務(wù)器A上telnet B_IP 8080失敗連接超時(shí)。排查思路我們需要在服務(wù)器B上抓包看是否收到了來(lái)自A的SYN包以及B是否回復(fù)了SYN-ACK。操作步驟在服務(wù)器B上啟動(dòng)抓包過(guò)濾來(lái)自服務(wù)器A IP且目標(biāo)端口為8080的TCP流量。sudo tcpdump -i any -nn -S host A_IP and tcp port 8080-i any: 監(jiān)聽(tīng)所有接口避免選錯(cuò)網(wǎng)卡。-nn: 禁用解析清晰顯示IP和端口。-S: 顯示絕對(duì)序列號(hào)。host A_IP and tcp port 8080: 核心過(guò)濾器。從服務(wù)器A再次執(zhí)行telnet B_IP 8080。觀察服務(wù)器B上tcpdump的輸出。情況A理想情況你看到了SYN-SYN-ACK-ACK的三次握手。這說(shuō)明連接在TCP層是正常的問(wèn)題可能出在telnet客戶(hù)端或8080端口服務(wù)本身如服務(wù)進(jìn)程崩潰、防火墻規(guī)則阻止了特定用戶(hù)等。情況B常見(jiàn)問(wèn)題只看到了來(lái)自A的SYN包沒(méi)有看到B回復(fù)的SYN-ACK。可能原因1本地防火墻如iptables丟棄了包。在B上檢查sudo iptables -L -n -v查看INPUT鏈規(guī)則和丟包計(jì)數(shù)??赡茉?服務(wù)未監(jiān)聽(tīng)8080端口。在B上檢查sudo netstat -tlnp | grep :8080或ss -tlnp | grep :8080??赡茉?抓包接口不對(duì)。如果B是多網(wǎng)卡A的流量可能從另一個(gè)網(wǎng)卡進(jìn)入。使用-i any可以避免此問(wèn)題。情況C看到了SYN-RST復(fù)位。這通常表示端口是關(guān)閉的沒(méi)有進(jìn)程監(jiān)聽(tīng)。情況D什么包都沒(méi)抓到。這說(shuō)明A發(fā)出的包根本沒(méi)到達(dá)B的網(wǎng)卡。問(wèn)題可能出在A的出方向路由、中間網(wǎng)絡(luò)設(shè)備交換機(jī)、路由器、防火墻或B的入方向路由上。需要在路徑上的各個(gè)節(jié)點(diǎn)分段抓包排查。6.2 場(chǎng)景二分析某臺(tái)服務(wù)器的HTTP請(qǐng)求需求快速查看訪問(wèn)服務(wù)器80端口的所有HTTP請(qǐng)求方法GET/POST等和URL。操作sudo tcpdump -i eth0 -A -s 0 -l tcp port 80 and (((ip[2:2] - ((ip[0]0xf)2)) - ((tcp[12]0xf0)2)) ! 0) | grep -E ^(GET|POST|PUT|DELETE|HEAD|OPTIONS)這個(gè)命令看起來(lái)復(fù)雜拆解一下-A: 以ASCII輸出載荷。-s 0: 抓取完整數(shù)據(jù)包。-l: 行緩沖便于grep。復(fù)雜的BPF過(guò)濾表達(dá)式是為了只抓取有TCP載荷的數(shù)據(jù)包即排除純ACK包等提高效率。管道|后的grep用于從ASCII輸出中提取以HTTP方法開(kāi)頭的行。更實(shí)用的方法保存為pcap文件后用Wireshark分析或者使用專(zhuān)門(mén)工具如ngrep。# 保存抓包文件 sudo tcpdump -i eth0 -w http_traffic.pcap tcp port 80 # 之后用 tcpdump -r http_traffic.pcap -A | grep ... 或 Wireshark分析6.3 場(chǎng)景三捕獲并保存特定主機(jī)的流量以備后續(xù)分析需求監(jiān)控服務(wù)器與數(shù)據(jù)庫(kù)IP: 10.0.0.100之間的所有流量持續(xù)1小時(shí)每小時(shí)一個(gè)文件。操作sudo tcpdump -i eth0 -G 3600 -W 24 -w db_traffic-%Y%m%d%H%M.pcap host 10.0.0.100-G 3600: 每3600秒1小時(shí)旋轉(zhuǎn)一次文件。-W 24: 最多保留24個(gè)文件超過(guò)后覆蓋最舊的。-w db_traffic-%Y%m%d%H%M.pcap: 文件名包含時(shí)間戳年、月、日、時(shí)、分。host 10.0.0.100: 過(guò)濾器。這個(gè)命令會(huì)安靜地在后臺(tái)運(yùn)行生成如db_traffic-202310151400.pcap的文件非常適合生產(chǎn)環(huán)境長(zhǎng)期監(jiān)控和事后取證。7. 常見(jiàn)問(wèn)題、排錯(cuò)技巧與實(shí)操心得7.1 權(quán)限問(wèn)題與“no suitable device found”問(wèn)題運(yùn)行tcpdump提示tcpdump: no suitable device found或You don‘t have permission to capture on that device。解決最直接的方式使用sudo。如果希望非root用戶(hù)運(yùn)行可以將用戶(hù)加入wireshark或tcpdump組取決于發(fā)行版并設(shè)置dumpcapWireshark的抓包組件的權(quán)限。但生產(chǎn)環(huán)境服務(wù)器通常不推薦這么做堅(jiān)持最小權(quán)限原則使用sudo。檢查接口名稱(chēng)是否正確。使用ip link show或tcpdump -D確認(rèn)。7.2 抓包時(shí)終端被刷屏或機(jī)器負(fù)載高問(wèn)題在高流量接口上不加過(guò)濾直接抓包導(dǎo)致輸出飛速滾動(dòng)甚至系統(tǒng)變慢。解決務(wù)必使用過(guò)濾器這是第一原則。精確過(guò)濾到你關(guān)心的IP、端口或協(xié)議。使用-c限制包數(shù)量例如-c 100抓100個(gè)包就停。使用-s限制抓包長(zhǎng)度如果不需要完整載荷-s 128通常足夠分析協(xié)議頭。輸出到文件使用-w輸出到文件避免終端渲染開(kāi)銷(xiāo)。使用-q安靜模式減少輸出信息量。7.3 如何抓取回環(huán)localhost流量問(wèn)題在本地測(cè)試客戶(hù)端和服務(wù)器都在同一臺(tái)機(jī)器使用127.0.0.1或localhost通信在eth0上抓不到包。解決回環(huán)流量走lo接口。sudo tcpdump -i lo -nn port 3306這樣就可以捕獲本機(jī)MySQL客戶(hù)端的連接了。7.4 如何解析HTTPS等加密流量問(wèn)題tcpdump捕獲的HTTPS流量載荷是加密的亂碼無(wú)法直接解讀應(yīng)用層內(nèi)容。解決tcpdump本身無(wú)法解密。解密需要私鑰通常有兩種途徑在客戶(hù)端或服務(wù)器上配置SSL/TLS解密例如在Nginx或Apache中配置將TLS會(huì)話(huà)密鑰SSLKEYLOGFILE輸出到文件然后讓W(xué)ireshark在導(dǎo)入pcap文件時(shí)使用該密鑰文件解密。這主要用于調(diào)試。使用中間人代理在測(cè)試環(huán)境可以通過(guò)配置代理如Burp Suite、Charles來(lái)解密流量。但這不適用于生產(chǎn)環(huán)境未知流量的分析。 對(duì)于加密流量tcpdump的主要用途是分析連接層行為如握手是否成功、證書(shū)交換、流量模式、是否存在異常連接而不是內(nèi)容。7.5 實(shí)操心得幾個(gè)提升效率的小技巧組合使用-l和grep當(dāng)你需要實(shí)時(shí)過(guò)濾輸出內(nèi)容時(shí)例如只查看包含“error”字樣的HTTP響應(yīng)可以sudo tcpdump -i eth0 -A -l tcp port 80 | grep -i error注意-l行緩沖是關(guān)鍵否則grep可能看不到及時(shí)的輸出。使用-tttt輸出可讀性更強(qiáng)的時(shí)間戳-tttt會(huì)輸出像2023-10-15 14:30:01.123456這樣的格式便于日志關(guān)聯(lián)。sudo tcpdump -i eth0 -tttt -nn保存過(guò)濾表達(dá)式到文件對(duì)于復(fù)雜的、常用的過(guò)濾表達(dá)式可以保存到文件中通過(guò)-F選項(xiàng)讀取。# 將過(guò)濾表達(dá)式寫(xiě)入文件 echo host 10.0.0.5 and (tcp port 80 or tcp port 443) myfilter.txt # 使用文件中的過(guò)濾表達(dá)式 sudo tcpdump -i eth0 -F myfilter.txt理解輸出中的“Flags [S.]”等標(biāo)識(shí)在TCP包輸出中你會(huì)看到Flags [S.],[P.],[F.]等。.表示ACK位。常見(jiàn)組合[S]: SYN (連接建立)[S.]: SYN-ACK[.]: ACK (確認(rèn))[P.]: PSH-ACK (推送數(shù)據(jù))[F.]: FIN-ACK (連接關(guān)閉)[R]: RST (復(fù)位)生產(chǎn)環(huán)境抓包黃金法則先保存后分析。盡量使用tcpdump -w file.pcap 過(guò)濾器將原始數(shù)據(jù)包保存下來(lái)然后在測(cè)試機(jī)或本地用tcpdump -r file.pcap -nv或Wireshark進(jìn)行詳細(xì)分析。避免在生產(chǎn)環(huán)境終端上直接進(jìn)行復(fù)雜的、耗資源的實(shí)時(shí)分析以免影響業(yè)務(wù)。tcpdump的深度遠(yuǎn)超一篇博文所能涵蓋其BPF過(guò)濾器的靈活性與強(qiáng)大需要結(jié)合具體的網(wǎng)絡(luò)協(xié)議知識(shí)如TCP/IP、HTTP、DNS來(lái)不斷實(shí)踐和領(lǐng)悟。最好的學(xué)習(xí)方式就是打開(kāi)你的終端從一個(gè)簡(jiǎn)單的ping命令開(kāi)始抓包對(duì)照輸出逐字段去理解每一個(gè)數(shù)字和符號(hào)的含義。當(dāng)你能夠僅憑tcpdump的輸出就在腦海中勾勒出網(wǎng)絡(luò)交互的完整畫(huà)面時(shí)你就真正掌握了這門(mén)網(wǎng)絡(luò)診斷的“內(nèi)功”。