轉自: ?http://www.rwifeng.com/jekyll/update/2015/04/16/how-to-tcpflow/
tcpflow 抓包
大家都知道 tcpdump 是一個很方便的抓包工具, 但是 tcpdump 是以包為單位進行輸出的,閱讀起來不是很方便。 而 tcpflow 是面向 TCP 流的,每個 TCP 傳輸會保存成一個文件。所以一個典型的 TCP 會話會產生兩個文件,每個方向產生一個文件。 此外, tcpflow 還可以解析 tcpdump 保存的文件。
先看一個小例子。在我的 Mac 上有一個 HTTP 服務,所用端口號為 12345,那么用 tcpflow 抓包結果如下:
可以看到,tcpflow 直觀地顯示出了請求、響應的 HTTP 報文,具有很好的可讀性。
安裝
具體可以參考:?tcpflow github
簡單使用
具體的使用方法,可以去查應用手冊?man tcpflow
. 下面介紹幾種簡單的使用方法。
- 打印經過網卡的所有報文
在你的 terminal 中輸入:
tcpflow -ci en0
其中 -c 表示將報文直接打印在 terminal 中。不指定 -c 參數會將抓取的 TCP 報文保存在文件中。 -i 表示你要監聽的網絡端口。 假如你不指定 -c 參數, tcpflow 會將每個 TCP 流的數據存儲在他自己的文件中,其中文件的命名規則你可以參考:?tcpflow github?. 基本格式為:
[timestampT]sourceip.sourceport-destip.destport[--VLAN][cNNNN]
- 讀取已有的 pcap 文件
在使用 tcpdump, 或者 wireshark 抓得包的格式是?pcap
。 使用 tcpflow 也可以讀取這些包得格式。 這兒有一個我使用 tcpdump 抓的包的格式:?tcpdump pcap
tcpflow -cr test.pcap
可以將 pcap 包打印到 terminal 中。當然你也可以將 TCP 流保存在文件中:
tcpflow -r test.pcap# 這樣我得到了兩個文件:
# 183.136.139.016.00080-192.168.199.146.49570
# 192.168.199.146.49570-183.136.139.016.00080
其中文件 ?192.168.199.146.49570-183.136.139.016.00080
?是我的主機向服務器發送的請求包。文件?183.136.139.016.00080-192.168.199.146.49570
?是服務器向客戶端返回的響應包。如果你想要重放下請求,就可以使用這種方法。
nc -i 1 183.136.139.16 80 < 192.168.199.146.49570-183.136.139.016.00080
- 使用表達式過濾抓包
tcpflow 也是支持表達式過濾的,格式和 tcpdump 一樣,具體格式和對應參數你可以參考?filter expression?。 這里列幾種常用的表達式:
# 過濾經過 192.168.1.202 的流量:
tcpflow -i any host 192.168.1.202# 過濾從主機 192.168.1.202 發出的流量:
tcpflow -i any src host 192.168.1.202# 過濾從主機 192.168.1.202 發出的流量并且端口號為 80:
tcpflow -i any src host 192.168.1.202 and port 80# 過濾固定端口的流量:
tcpflow -i en0 any port 443 or port 80# 過濾主機 192.168.1.202 端口為 80 或 443 的流量:
tcpflow -i en0 'host 192.168.1.202 and (port 80 or port 443)'...