Intro
tcpdump 是一個執行在命令列下的數據包剖析器。它允許使用者攔截和顯示傳送或收到過網路連接到該電腦的 TCP/IP 和其他封包。
安裝
以支援 apt-get 的 Debian 系列 Linux(如 Ubuntu)為例::
$ sudo apt-get install tcpdump
用法
$ tcpdump -i [interface] '[expression]'
$ tcpdump -i en0 'tcp && host www.yidas.com'
# No interface flag is equal to any
$ tcpdump -i any 'port 22'
# Full verboses mode
$ tcpdump -i any 'port 25' -vv
Filter by packet
利用tcp[tcpflags]
來指定過濾 TCP 封包類型,可用的 tcpflags 如下:
- tcp-syn
- tcp-ack
- tcp-push
- tcp-urg
- tcp-ece
- tcp-cwr
- tcp-fin
- tcp-rst
# 列出所有 SYN 或 FIN 封包
$ tcpdump 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'
# 在 25 port 上列出 PSH-ACK 封包
$ tcpdump -i any 'port 25 && tcp[tcpflags] & (tcp-push|tcp-ack) == (tcp-push|tcp-ack)' -vv
Output 欄位
首先以監聽 25 port (SMTP) 預設輸出結果為例:
$ sudo tcpdump -i any 'port 25'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
15:38:25.831589 IP yidas.com.44458 > tj-in-f27.1e100.net.smtp: Flags [S], seq 186492170, win 64240, options [mss 1460,sackOK,TS val 1855872952 ecr 0,nop,wscale 7], length 0
15:38:25.883309 IP tj-in-f27.1e100.net.smtp > yidas.com.44458: Flags [S.], seq 362477225, ack 186492171, win 65535, options [mss 1412,sackOK,TS val 4265814556 ecr 1855872952,nop,wscale 8], length 0
15:38:25.883382 IP yidas.com.44458 > tj-in-f27.1e100.net.smtp: Flags [.], ack 1, win 502, options [nop,nop,TS val 1855873004 ecr 4265814556], length 0
15:38:26.053722 IP tj-in-f27.1e100.net.smtp > yidas.com.44458: Flags [P.], seq 1:87, ack 1, win 256, options [nop,nop,TS val 4265814726 ecr 1855873004], length 86: SMTP: 220 mx.google.com ESMTP c9-20020a170903235800b001bf1973eafcsi15096307plh.571 - gsmtp
15:38:26.053756 IP yidas.com.44458 > tj-in-f27.1e100.net.smtp: Flags [.], ack 87, win 502, options [nop,nop,TS val 1855873174 ecr 4265814726], length 0
15:38:26.053844 IP yidas.com.44458 > tj-in-f27.1e100.net.smtp: Flags [P.], seq 1:17, ack 87, win 502, options [nop,nop,TS val 1855873174 ecr 4265814726], length 16: SMTP: EHLO yidas.com
15:38:26.104243 IP tj-in-f27.1e100.net.smtp > yidas.com.44458: Flags [.], ack 17, win 256, options [nop,nop,TS val 4265814777 ecr 1855873174], length 0
Packet Flag
- [S]: SY
- [.]: ACK
- [P]: PSH(推送)
- [F]: FIN (Finish connection)
- [R]: RST(Reset connection)
[S.] 表示 SYN-ACK,也就是 SYN packet 的 reply packet。
[P.] 表示 PSH-ACK,也就是 Application data packet 的。
Appendix
TCP 封包類型
TCP Flag | 全名 (英文) | 說明 |
---|---|---|
tcp-syn | SYN (Synchronize) | 用來建立連線,屬於 TCP 三次握手的第一步。用來同步序列號。 |
tcp-ack | ACK (Acknowledgment) | 確認封包已收到,幾乎所有有效封包都會帶 ACK。三次握手與資料傳輸期間皆使用。 |
tcp-push | PSH (Push) | 要求接收方立即處理資料,而不是先暫存。多用於即時資料傳輸。 |
tcp-urg | URG (Urgent) | 指出此封包包含緊急資料,需要優先處理。現代應用較少使用。 |
tcp-ece | ECE (ECN Echo) | 回應 ECN(顯式擁塞通知)訊號,用於主動偵測與回報網路壅塞狀況。 |
tcp-cwr | CWR (Congestion Window Reduced) | 表示發送方已收到 ECE 訊號,並已調整傳送視窗以回應壅塞。 |
tcp-fin | FIN (Finish) | 表示發送方已完成資料傳輸,要求關閉連線。通常代表 TCP 四次揮手中的其中一個步驟。 |
tcp-rst | RST (Reset) | 強制重置連線,常用於拒絕非法請求或連線異常時的快速關閉。 |