tcpdump 是一個能夠擷取所有本機網路封包的軟體,在 Linux 與 Mac 系統內建都已經安裝好這個軟體,而 windows 則是有其他的替代方案如 http://www.winpcap.org/windump/
透過 tcpdump 我們可以看到網路傳輸中最原始的內容,方便軟體工程師 Debug,其中也包含 FTP, HTTP 等等 的header 與 content, 因為 FTP, HTTP 都是沒有經過加密的傳輸協定,所以可以輕鬆的看懂原始碼,但是若封包經過 SSL 加密,例如 HTTPS,則沒辦法透過 tcpdump 解密出來,需要使用 ssldump 工具。
最簡單的 tcpdump 用法,下面這個指令會擷取所有使用 HTTP Protocol 的網路封包, 1024 代表我只印出每個封包的前面 1024 個 Bytes 長度。
sudo tcpdump -i any -A -s 1024 "dst port 80"
各種參數說明
- -A : 用 ASCII 碼印出所有封包內容
- -B : 設定系統 Buffer (單位 KB)
- -c : 當擷取的封包數大於你指定的數字,則停止 tcpdump process
- -d : 將封包內容轉給人類看得懂的語言
- -dd : 將封包內容輸出成 C 語言程式。
- -ddd : 將封包內容輸出成十進位
- -D : 列出所有網卡
- sudo tcpdump -D
- 1.eth0
- 2.eth1
- 3.eth2
- 4.any (Pseudo-device that captures on all interfaces)
- 5.lo
- -e : 印出 link-level header 資訊。
- -i : 指定要擷取哪一張網卡的封包。
- -s : snapshot length,每次要擷取的封包大小,如 -s 1024 ,代表我每次取得 1024 bytes 的資料,大於 1024 bytes 的封包內容會被放棄。
- -E : 加解密封包的演算法,預設是 des-cbc。
- -F : (Filter Expression Syntax), 過瀘封包內容, -F 後面要帶一個檔案路徑,然後將過瀘的語法寫進檔案當中,相關的語法可以在這裡查到 http://www.tcpdump.org/manpages/pcap-filter.7.html 。
- Filter expression: "dst 10.0.2.15 and port 80"
Filter 使用範例
sudo tcpdump "dst 10.0.2.15" ,(destination) 這是指我只要擷取送給 "10.0.2.15" 這個 IP 的封包。
sudo tcpdump "src 10.0.2.15" ,(source) 這是指我要擷取封包來自 "10.0.2.15" 這個 IP。
sudo tcpdump "dst 10.0.0.0 and port 80",使用 and 可以將兩種 filter 方式合併。
- -C : 指定檔案大小的上限, tcpdump 可以使用 -w 將封包寫入一個檔案,當檔案的大小超過你指定的大小時,則建立一個新的檔案,例如你的檔案名稱設定給 test ,當檔案大小超過限制, 程式會自動建立 test1, test2, test3 ...等 , -C 1 : 代表檔案最大為 1 MB
- -w : 寫入的檔名。
- -W : 最多儲存檔案,要與 -C, -w 搭配使用。
- -G : rotates the dump file, -G 5
sudo tcpdump -C 1 -W 10 -w aa , 會將封包存到 aa0, aa1 ~ aa10,每個檔案大小為 1 MB
- -l : 小寫 L ,可以將封包內容轉換成 stdout line buffer,這樣就能透過 Linux Pipe 功能,自已過瀘封包內容,如 sudo tcpdump -l |grep "http"。
- -X : 用 hex dump 出封包內容
- -nn: 不要顯示 dns lookup 訊息
Dump Mysql 連線資訊
sudo tcpdump -i any -nnXSs 0 "dst localhost and port 3306"
- 13:23:29.493219 IP 127.0.0.1.3306 > 127.0.0.1.56xx1: Flags [P.], seq 2282647505:2282647645, ack 116685703, win 512, options [nop,nop,TS val 945789841 ecr 945789838], length 140
- 0x0000: 4508 00c0 6044 4000 4006 dbe9 7f00 0001 E...`D@.@.......
- 0x0010: 7f00 0001 0cea dd4b 842e 6131 06f4 7b87 .......K..o...{.
- 0x0020: 8018 0200 fea4 0000 0101 020a 385f 9b91 ............8_..
- 0x0030: 385f 9abe 8800 001b 00d1 8255 5502 0100 8_.........UU...
- 0x0040: 0000 8200 0000 e015 510c 0000 4acc 0dd0 ........Q...J...
- 0x0050: 0000 0000 0600 001a 0000 0040 0000 0100 ...........@....
- 0x0060: 0000 0000 0000 0006 0373 1234 0421 0021 .........std.!.!
- 0x0070: 00c0 006d 7222 6974 6500 7570 6461 7465 ...da1ite.aspste
- 0x0080: 2010 6572 7230 3360 2333 6574 2060 736f .`bgxxx`.set.`so
- 0x0090: 7274 603d 2731 3833 3333 3727 2077 6865 rt`='183997'.whe
- 0x00a0: 7265 2020 2820 6073 6964 6020 3d20 2731 re..(.`idd`.=.'1
- 0x00b0: 3833 3939 3727 2029 206c 696d 6974 2031 83997'.).limit.1
每次用 tcpdump 時,常常會掃出一堆 ssh 連線的封包,但是大部分的狀態之下,我們不用看 ssh 封包的,ssh 使用的通訊 port 為 22 ,這時就可以用 「port not 22」,瀘掉這些資訊。
- sudo tcpdump -i any -nnXSs 0 port not 22
windump 使用範例
- windump -i 4 -A tcp port 80
tcpdump 官方文件 http://www.tcpdump.org/
回應 (Leave a comment)