題 在Linux上嗅探TCP流量數據的最簡單方法是什麼?


我想要一種簡單的方法來顯示我的Linux機器上任何接口上的所有TCP數據(不是TCP標頭或其他任何東西)。

例如,如果我這樣做,我想要一個神奇的命令:

magic_commmand_I_want port=1234

然後,如果有一台服務器在我的機器上偵聽端口1234,有人做了:

echo hello | nc localhost 1234
# Note: "nc" (aka "netcat") is a simple tool that sends data to a host/port

然後神奇的命令就會打印出來:

hello

我嘗試過“tcpdump”,“ethereal”,“tethereal”,“tshark”等等,但是如何讓它們得到它們並不明顯:

  • 不顯示IP地址或其他元數據
  • 僅顯示正在發送的“數據”,而不是單個數據包及其標題
  • 按原樣打印數據,而不是十六進制,而不是使用數據包偏移標記
  • 吸氣 所有 網絡流量(無論是否開啟 為eth0 要么 ETH1 要么 等...)

是的,您可以將一組管道的unix命令串起來執行此操作,但下次不容易記住:)

如果您有一個確切的命令行的簡單示例,那就是我想要的。


74


起源


tcpdump是你想要的神奇命令。 Wireshark是tcpdump使用的庫之上的一個很好的GUI - Vinko Vrsalovic
我知道這是一個老問題,但我很想知道為什麼使用nc作為“服務器端”也不是一個選擇? “nc -l 1234”創建一個服務器,該服務器偵聽端口1234並打印出發送給它的任何內容並關閉連接。如果要保持連接活動而不斷開連接,可以添加“-k”選項。 - StFS
@StFS因為他想嗅到一個正在運行的端口而nc會抱怨。 - infoclogged


答案:


更新: 

正如Michal在評論中指出的那樣: 從tcpflow 1.3版開始,-e選項用於指定掃描程序名稱。因此打印錯誤“無效的掃描儀名稱'8983'”。正確的命令是

sudo tcpflow -i any -C -J port 1234

(也 -J 已改為 -g 在最新版本中)


感謝yves指點我“tcpflow“這是命令行:

tcpflow -i any -C -e port 1234  # as root, or with sudo

這就是我想做的一切

  • 在進入時逐字節顯示數據
  • 不顯示任何其他元數據
  • 監聽所有接口(因此它捕獲來自機器內外的數據)

-C“告訴它轉儲到控制台而不是文件。 “-e“啟用顏色,因此客戶端 - >服務器和服務器 - >客戶端在視覺上是不同的。

我只是簡單地安裝了tcpflow

sudo apt-get install tcpflow

102



哇。 tcpflow太棒了,謝謝!救了我一個與wireshark有關的痛苦。 Wireshark,tcpdump等有太多的信息,並沒有真正做原始問題的要求。 tcpflow非常適合這個。 - Russ
從tcpflow 1.3版開始 -e 選項用於指定掃描儀名稱。因此打印錯誤“無效的掃描儀名稱'8983'”。正確的命令是 sudo tcpflow -i any -C -J port 1234 - Michal Kováč
注意 -J 已改為 -g 在最新版本中。 - tvon
有人需要向工具的作者解釋術語“向後兼容性”的含義! - Sridhar-Sarnobat
它為我打印了兩次“東西”。這是為什麼 ? lpaste.net/3984129577801744384 - user1198559


socat是您要求的工具。它可以充當代理:

$socat -v TCP-LISTEN:4444 TCP:localhost:1234
hello

那麼你的應用程序必須連接端口4444而不是直接連接到1234

-v選項是socat打印出標準錯誤(stderr)上收到的所有內容。

更新:

如果您的計算機上沒有socat,您仍然可以使用netcat以這種方式模擬它:

$netcat -l -p 4444 | tee output_file | netcat localhost 1234

警告:此選項是單向的。第二個netcat實例將打印從服務器到標準輸出的任何響應。 你可能仍然這樣做:

$mkfifo my_fifo
$netcat -l -p 4444 < my_fifo | tee output_file | netcat localhost 1234 > my_fifo

27



假設我無法控制客戶端和服務器,(或者我不想阻止它),因此我無法更改涉及的端口或攔截流量。那又怎樣?


嘗試 Wireshark的。它是針對Linux和Windows的出色協議分析器。


20



我的經驗是,界面真的很糟糕的Linux。 - Joe Phillips
該死的,你在我面前,在wireshark上+1
你能給出一個示例命令行嗎?
看看這個鏈接 wiki.wireshark.org/Tools 它給出了wireshark的命令行工具列表。留意Dumpcap。 - Kevin Boyd


tcpflow就是你想要的。從手冊頁中提取:

描述
tcpflow是一個程序   捕獲作為一部分傳輸的數據   TCP連接(流)和存儲   數據的方式很方便   用於協議分析或調試。 一個   像tcpdump(4)這樣的程序顯示了一個   在電線上看到的包的摘要,   但通常不存儲數據   那實際上正在傳播。在   對比,tcpflow重建了   每個實際的數據流和存儲   流在一個單獨的文件中供以後使用   分析。 tcpflow了解TCP   序號和正確   無論如何重建數據流   重傳或無序   交貨。

tcpflow存儲所有捕獲的數據   具有表單名稱的文件

192.168.101.102.02345-010.011.012.013.45103

上面文件的內容在哪裡   將是從主機傳輸的數據   192.168.101.102端口2345,主機10.11.12.13端口45103。

設置從應用程序應用程序到服務器的連接。 當連接啟動並運行時,tcpflow仍然能夠從中捕獲數據 舉個例子:

$ sudo tcpflow -i lo port 5555
tcpflow[3006]: listening on lo

每個數據都將存儲在名為127.000.000.001.48842-127.000.000.001.05555的文件中。

您仍然可以使用選項-Cs在標準輸出上重定向它。 閱讀手冊頁以使用表達式來調整您想要tcpflow捕獲的paquets。


13





ngrep 對此非常好。它需要一個BPF字符串和一個可選字符串來搜索數據包,然後以非常有用的格式將數據包內容轉儲到屏幕上。它還可以轉儲到pcap_dump文件,以後可以在Wireshark中更仔細地查看。


2





看一眼 Chaosreader。雖然它比你要求的稍微多一點,但可能你可以修改它的代碼來做你想要的。


0





也許您可以為tcpdump編寫一個包裝器,例如,它將刪除所有冗餘信息


-1