LinuxでTCPトラフィックデータをスニッフィングする最も簡単な方法は何ですか?


79

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アドレスまたはその他のメタデータを表示しない
  • 送信されている「データ」のみを表示し、個々のパケットとそのヘッダーは表示しません
  • データを16進数ではなく、パケットオフセットマーカーなしでそのまま印刷します。
  • すべてのネットワークトラフィックをスニッフィングます(eth0またはeth1またはloなど)。

はい、おそらくこれを行うためにパイプで接続されたUNIXコマンドのセットをつなげることができますが、それは次回のために覚えるのは非常に簡単ではありません:)

これを行う正確なコマンドラインの簡単な例がある場合、それが私が欲しいものです。


2
tcpdumpは、必要な魔法のコマンドです。Wiresharkは、tcpdumpが使用するライブラリの上にある素晴らしいGUIです。
Vinko Vrsalovic 09

3
私はこれが古い質問であることを知っていますが、「サーバー側」にもncを使用することも選択肢ではなかった理由を知りたいですか?「nc -l 1234」は、ポート1234でリッスンするサーバーを作成し、送信されたものをすべて出力して接続を閉じます。接続を切断せずに接続を維持したい場合は、「-k」オプションを追加できます。
StFS

2
@StFSは、実行中のポートをスニッフィングしたいので、ncは文句を言うでしょう。
詰まった

回答:


106

更新:

コメントでMichalが指摘したように、tcpflowバージョン1.3以降では、スキャナー名の指定に-eオプションが使用されます。そのため、「Invalid scanner name '8983'」というエラーが出力されます。正しいコマンドは

sudo tcpflow -i any -C -J port 1234

(最新リリースに-J変更され-gました)


tcpflow」を指し示してくれたyvesに感謝します。コマンドラインは次のとおりです。

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

これは私が望むすべてを行います

  • データをバイトごとに表示します
  • 他のメタデータは表示されません
  • すべてのインターフェイスでリッスンします(したがって、マシン内外からのデータをキャプチャします)

-C」は、ファイルではなくコンソールにダンプするように指示します。" -e"は色を有効にするため、client-> serverとserver-> clientは視覚的に区別されます。

私は単に行うことでtcpflowをインストールしました

sudo apt-get install tcpflow

2
ワオ。tcpflowは素晴らしいです、ありがとう!Wiresharkで抱えていた痛みを1トン節約しました。Wireshark、tcpdumpなどは情報が多すぎて、実際には元の質問がしたことをしません。tcpflowはこれに最適です。
ラス

10
tcpflowバージョン1.3以降で-eは、スキャナー名の指定にオプションが使用されます。そのため、「Invalid scanner name '8983'」というエラーが出力されます。正しいコマンドはsudo tcpflow -i any -C -J port 1234
ミカルコヴァーチ

6
最新リリースで-Jはに変更さ-gれていることに注意してください。
-tvon

2
誰かがツールの作者に「後方互換性」という用語の意味を説明する必要があります!
スリダールサルノバット

私にとっては、「もの」を2回印刷します。何故ですか ?lpaste.net/3984129577801744384
user1198559

29

socatはあなたが求めているツールです。プロキシとして機能できます:

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

アプリケーションは、1234に直接接続するのではなく、ポート4444に接続する必要があります

-vオプションは、socatが受け取ったすべてを標準エラー(stderr)に出力するためのものです。

更新:

socatがマシンで使用できない場合でも、netcatを使用してそのようにエミュレートできます。

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

警告:このオプションは単方向です。2番目のnetcatインスタンスは、サーバーからの応答を標準出力に出力します。あなたはまだそうすることができます:

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

クライアントとサーバーを制御できない(または停止したくない)と仮定すると、どのポートが関係するか、トラフィックをインターセプトできません。じゃあ何?

20

Wiresharkをお試しください。LinuxとWindowsの両方を対象とした優れたプロトコルアナライザーです。


3
私の経験では、インターフェイスはLinuxで本当にひどいものです。
ジョーフィリップス

いまいましい、あなたは1 wiresharkの上、私の前にそこに着いた

コマンドラインの例を教えてもらえますか?

このリンクwiki.wireshark.org/Toolsをご覧ください。wiresharkのコマンドラインツールのリストを提供します。Dumpcapに注目してください。
ケビン・ボイド

13

tcpflowはあなたが望むものです。manページから抽出:

説明
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でキャプチャするパケを調整する式を再生します。


2

ngrepこれにはとてもいいです。パケット内で検索するBPF文字列とオプションの文字列を受け取り、パケットの内容をダンプして非常に便利な形式で表示します。オプションでpcap_dumpファイルにもダンプします。これは、後でWiresharkでさらに詳しく調べることができます。



-1

たぶん、tcpdumpのラッパーを書くことができます。これは、すべての冗長な情報を削除します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.