Learning Objectives
- 說明封包擷取是什麼,以及只能在自己有權限的網路上擷取的原因
- 讀懂封包分析工具的三個窗格:封包清單、逐層欄位、十六進位
- 寫出常用的顯示過濾條件(協定名稱、ip.addr、tcp.port、旗標與 &&、||、!)
- 用「追蹤 TCP 串流」看一條連線雙方送出的內容
- 從封包裡找出 DNS 查詢與 HTTP 請求,以及查無此名稱、連線被拒絕這類問題
把網路上的封包拿出來看
前幾課的模擬器會畫出封包怎麼走。真實的網路沒有這種畫面,但我們可以擷取(capture)封包: 擷取軟體把經過網路卡的每一個訊框複製一份存下來,之後一層一層拆開來看。計算機概論軌第 30 課〈協定分層與 TCP/IP〉說的分層與封裝,在這裡會看得一清二楚。
封包分析是排除網路問題最直接的方法。使用者說「網頁打不開」,擷取一下就知道是 DNS 查不到、TCP 連不上,還是伺服器回了錯誤。
| 工具 | 特色 |
|---|---|
| Wireshark | 圖形介面,免費開放原始碼,三個窗格的介面是這一課練習的樣子 |
| tcpdump | 命令列工具,常用在沒有圖形介面的伺服器上擷取,存成檔案再用 Wireshark 開 |
擷取下來的檔案常見的格式是 pcap 或 pcapng。這一課的封包資料是本課自己編寫的範例,使用文件專用的位址; 小工具依標準格式把每個位元組組出來,校驗和也是真的算出來的。
先講清楚:誰的網路才能擷取
封包裡有別人的網址、訊息、Cookie,HTTP 的話連密碼都看得到。所以擷取封包有明確的界線:
- 只在自己有權限的網路上擷取:自己的電腦、自己家裡的網路、課程或工作明確授權的實驗環境。
- 不要擷取別人的通訊:宿舍、圖書館、咖啡店的公共網路,即使技術上做得到,也不可以。臺灣的刑法與通訊保障及監察法都有處罰違法監察、竊錄他人通訊的規定;學校的網路使用規範通常也明文禁止。
- 擷取檔要當成機密資料保管:裡面可能有登入資訊;分享給別人之前先確認內容,必要時只保留需要的封包。
- 只拿來除錯與學習:發現別人的帳號密碼,要通知管理者修正,而不是使用它。
這一課所有的練習都使用自編的範例資料。
三個窗格
Wireshark 的主畫面由上到下分成三個窗格:
| 窗格 | 顯示什麼 | 看什麼 |
|---|---|---|
| 封包清單 | 一個封包一列:編號、時間、來源、目的、協定、長度、摘要(Info) | 整體的順序與對話 |
| 封包細節 | 選取的封包一層一層展開:Frame、Ethernet II、IPv4、TCP 或 UDP、應用層 | 每個欄位的值 |
| 位元組 | 同一個封包的十六進位與 ASCII | 欄位實際佔了哪幾個位元組 |
點細節窗格裡的欄位,位元組窗格會標出它的位置;狀態列會顯示這個欄位的過濾名稱(例如 ip.ttl),可以直接拿來寫過濾條件。
「Time」欄預設是距離第一個封包的秒數;TCP 的序號預設顯示相對序號(從 0 開始),原始的 32 位元序號另外列出。
顯示過濾的寫法
擷取檔動不動就有上萬個封包,顯示過濾(display filter)讓你只看需要的。常用的寫法:
| 寫法 | 意思 |
|---|---|
dns、http、tcp、udp、arp、icmp |
只看這種協定 |
ip.addr == 192.168.1.10 |
來源或目的是這個位址 |
ip.src == 192.168.1.10、ip.dst == … |
只看來源,或只看目的 |
ip.addr == 192.168.1.0/24 |
整個網段 |
tcp.port == 80 |
來源埠或目的埠是 80 |
tcp.flags.syn == 1 && tcp.flags.ack == 0 |
只看建立連線的第一個 SYN |
tcp.flags.reset == 1 |
連線被重置(RST) |
dns.qry.name == "www.club.tw" |
查詢這個名稱的 DNS 封包 |
dns.flags.rcode == 3 |
查無此名稱的 DNS 回應 |
http.request.method == "POST" |
HTTP 的 POST 請求 |
http.host contains "club" |
文字欄位包含某段字 |
條件可以用 &&(and)、||(or)、!(not)組合,也可以加括號,例如 dns || (tcp.port == 80 && tcp.len > 0)(DNS,或 80 埠上有帶資料的 TCP 封包)。
輸入框變綠色表示語法正確,變紅色表示有錯。
要分清楚擷取過濾(capture filter)和顯示過濾:擷取過濾在擷取之前決定要存哪些封包(語法不同,例如 port 53),沒存下來的就沒有了;
顯示過濾只是把已經存下來的封包藏起來,隨時可以改。這一課的練習只用顯示過濾;小工具支援的欄位是 Wireshark 常用欄位的一小部分。
小測驗:窗格與過濾
想看「192.168.1.10 和任何人之間的網頁流量(80 埠)」,哪一個過濾條件最合適?
在封包細節窗格點了一個欄位,位元組窗格標出 cb 00 71 50 四個位元組。這個欄位最可能是什麼?
擷取時設了擷取過濾 port 53,事後發現想看的 HTTP 封包不見了。改用顯示過濾 http 能找回來嗎?
追蹤 TCP 串流,以及從封包找問題
一條 TCP 連線的資料常常分散在好幾個封包裡,中間還夾著 ACK。追蹤 TCP 串流(Follow TCP Stream)會把同一條連線雙方送出的資料依序接起來,
用兩種顏色分別標示用戶端與伺服器送出的部分(Wireshark 預設是紅色與藍色),同時把過濾條件設成 tcp.stream eq 編號。
每一條 TCP 連線依出現順序編號,從 0 開始。
從封包看出常見的問題:
| 在封包裡看到 | 代表什麼 | 對應的使用者症狀 |
|---|---|---|
DNS 回應是 No such name(dns.flags.rcode == 3) |
名稱不存在 | 找不到伺服器 |
| 送出 SYN,對方回 RST | 那個埠沒有服務在聽 | 連線被拒絕 |
| 同一個 SYN 送了好幾次都沒有回應 | 封包被丟掉(防火牆、主機不在) | 一直轉圈圈,最後逾時 |
| HTTP 回應 4xx 或 5xx | 連線正常,是請求或伺服器的問題 | 錯誤頁面 |
| 連到 443 埠,只看到 TLS 的 Application Data | 連線有加密 | (正常)內容看不到 |
最後一列很重要:HTTPS 的內容在封包分析裡也看不到,只看得到位址、連接埠、資料量與時間。要分析加密的內容,必須在自己的程式或瀏覽器端取得金鑰,這超出這一課的範圍。
小測驗:串流與排錯
擷取檔裡看到 PC1 送出 SYN 到 203.0.113.80 的 8080 埠,對方立刻回了 [RST, ACK]。最可能的原因是?
按「追蹤 TCP 串流」之後,過濾條件變成 tcp.stream eq 1。它和 ip.addr == 203.0.113.80 && tcp.port == 80 有什麼不同?
同學想在宿舍網路上擷取封包,看看室友都在看什麼網站。下面哪個說法正確?
重點整理
- 封包擷取把經過網路卡的訊框存下來,之後一層一層拆開看;只在自己有權限的網路上擷取,擷取檔要當成機密資料保管。
- 三個窗格:封包清單看順序、封包細節看每一層的欄位、位元組看欄位實際的位置;欄位的過濾名稱可以直接拿來寫條件。
- 顯示過濾:協定名稱、
ip.addr == …、tcp.port == …、旗標欄位,用&&、||、!組合;擷取過濾是擷取之前就決定存什麼。 - 追蹤 TCP 串流把一條連線雙方的資料接起來;HTTP 看得到全部內容,HTTPS 只看得到加密的資料。
- 找問題:No such name 是名稱不存在、RST 是埠沒有服務、重複的 SYN 是封包被丟掉、4xx/5xx 是請求或伺服器的問題。
下一課自己寫程式:用 Python 的 socket 開 TCP 連線、送出與接收資料,親手做出這些封包。