封包擷取(packet capture)
有時候摘要還不夠,你需要看見網路最原始的話語——每一則穿過線路的訊息的確切位元組。封包擷取(packet capture)就是把這些封包逐位元組記錄下來、在你選定的某一點經過時擷取它們的動作。如果較高層的工具告訴你兩台電腦在對話,封包擷取則讓你讀到實際的對話:哪一方先開口、各自說了什麼、又是在哪裡出錯的。它相當於網路版的法庭速記員,逐字逐句謄寫下來。
在機制上,擷取工具會把一個網路介面切換到一種模式,讓它把它所看到的每一個訊框(frame)的副本交給作業系統,而不只是發給這台主機的訊框。一個叫 libpcap 的程式庫(在 Windows 上則是 WinPcap/Npcap)負責底層的抓取;tcpdump 與 Wireshark 這類工具坐在它之上,把結果呈現出來。因為把一切都存下來會多到無法承受,你幾乎總是會掛上一個 BPF 過濾器,告訴核心要保留哪些封包——譬如只要通往某主機、連接埠 443 的 TCP 流量——這樣你記下的是那根針,而不是整堆乾草。擷取到的封包可以存成 .pcap 檔,稍後重播或分析。
三個誠實的提醒。第一,擷取本質上是被動的:它觀察既有流量、不加任何東西,但在高速下主機可能跟不上而靜默地丟掉封包,所以一個空的結果可能是「什麼都沒發生」,也可能是「我漏掉了」。第二,你只能擷取到達你介面的東西——在交換式網路上,你通常只看得到自己的流量加上廣播,除非有埠鏡像(port mirror)或分接器(tap)餵給你別人流量的副本。第三,那些擷取到的封包是真人的資料,對未加密的協定往往是明文可讀的,所以擷取背負著嚴肅的隱私、安全與法律責任。
為了找出登入為何失敗,你在嘗試登入時執行「sudo tcpdump -i eth0 -w login.pcap host server and port 443」,接著在 Wireshark 中打開 login.pcap。現在你能看見 TLS 交握開始、憑證交換,以及連線被重置的確切時點。
封包擷取記錄穿過介面的原始封包;BPF 過濾器只保留你在乎的那些,讓你讀到那根針,而不是整堆乾草。
在現代的交換式區域網路上,你通常只擷取得到自己的流量加上廣播——要看到別人的流量需要埠鏡像或分接器。而擷取到的封包是真實資料:要以其所隱含的隱私與法律審慎來對待它們。