リアルタイムでtcpdumpストリームを解析する方法は?

リアルタイムでtcpdumpストリームを解析する方法は?

OEMで私が識別できない複数のプロセスを実行しているDebianインストールがありますが、これらのプロセスの間にダイヤルアップが行われていることを確認したいと思います。

私は走ったsudo tcpdump | grep ^e <ssh_ip>

しかし、パイプは引き続き破損しています。 SSH経由で接続しましたが、grep ^eからクライアントのSSH IPを省略しました。アウトバウンド要求へのネットワーク接続を継続的に監視する方法はありますか?私はこれが家と呼ばれる場所がどこであるか、特にこの問題と関係のない他の行動から、それが家だと疑われる場所がどこであるかわかりません。

壊れたパイプは一般的に接続が切断されたことを意味しますが、私のSSH接続は大丈夫でした。これはtcpdumpが実行する必要がある他の作業のようです。

答え1

存在する:

sudo tcpdump | grep ^e <ssh_ip>

まず、^e殻によって意味が異なります。

  • Bourneシェルでは、^(元の古いThompsonシェルのパイプ演算子と同様にレンダリングされています)のエイリアスなので、パイプを介してコマンドを実行できます。|^grepe
  • fish3.2より前のバージョンでは、^stderr(の略2>)をリダイレクトするために使用されていました。
  • inrcと派生語は^連結演算子なのでにgrep ^eなりますgrepe
  • inはzsh -o extendedglob^のグローバル演算子であるため、名前付き^eファイルを除いて現在のディレクトリに隠されていないすべてのファイルに展開されますe
  • csh///では、行の先頭と履歴拡張が無効になっていない場合にのみ特別に処理されますtcshbashだからここではありません。zsh^
  • 他のほとんどのシェルでは^e文字通りgrep

したがって、次のいずれかのシェルを想定すると、コマンドは他のシェルにパイプされた入力と同時に開始および出力されsudo tcpdumpます。grep ^e <ssh_ip>

パラメータの構文は(オプションの部分を表します)grepです。ファイルが存在しない場合は、標準入力をgrepします。オプションは役割で始まります。grep [<options>] <regular-expression> [<files>][...]grep-

これは^e、正規表現と<ssh_ip>その正規表現に一致する行を検索するために使用されるファイルです。

正規表現では、^e次の行の先頭に一致するので、で始まる行が報告されeますe

ここではファイルが<ssh_ip>存在しない可能性が高いため、grepすぐにエラーが返されます。

この時点でtcpdumpsから継承したstdoutはsudo壊れたパイプになるため、最初に何かを出力しようとtcpdumpするとSIGPIPE信号を受けて死んだり、信号を無視するとwrite()エラーで失敗することになりますEPIPE。ここで、tcpdumpはシグナルを無視し、失敗を報告するか、ハンドラーがあり、write()終了する前に受信を報告することを示すエラーメッセージを作成します。

の出力でIPアドレスを含む行をフィルタリングするには、whereとhereを1つのパラメータで囲んで表現する必要がtcpdumpあります。grep -Fvw <ssh_ip>-F-v-w

  • F正規表現の代わりに固定文字列と一致します(正規表現のように単一文字ではなく.リテラルと一致するために使用されます)。.
  • Rematch v: 一致する行を返します。いいえマッチ。
  • 注文のみが一致します(例:==はそのアイテムにはw見つかりません<ssh_ip>)。10.10.10.10210.10.10.109

デフォルトでは、tcpdumpは出力が端末に送信されないことを検出するとブロックバッファリングに戻ります。出力がすぐに確認されるためには、-ltcpdumpにオプションを追加して再度有効にする必要があります。ワイヤーバッファー。

ただし、とにかくtcpdumpは自分でパケットをフィルタリングできます。ここで特定のIPアドレスとのパケットを除外するには、次のようにします。

sudo tcpdump not host <ssh_ip>

または、そのIPアドレスのSSHトラフィックのみをフィルタリングします。

sudo tcpdump 'not (host <ssh_ip> and tcp port ssh)'

(Ssh接続がデフォルトポート22にあると仮定します。)

これらのフィルタ(Berkeley Packet Filters、BPF)は、カーネル(setsockopt(fd, SOL_SOCKET, SO_ATTACH_FILTER, filter)少なくともLinuxでは)に渡されるバイナリフィルタ式にコンパイルされます。ここでフィルタリングが行われるので、実際にはtcpdumpがすべてのトラフィックを要求し、それらをすべてデコードしてgrepに渡すよりも、tcpdumpとシステムの操作が少なくなります。

wireshark、対応するコマンドラインインターフェイスは、tsharkここでも考慮できる高度なトラフィック分析アプリケーションです。 2種類のフィルタをサポートしています。上からBPFと呼ばれるフィルターです。キャプチャフィルタ(通過-f)とフィルタ表示(通過-Y)Wiresharkの独自のフィルタ構文と高度な機能を使用して、カーネルから返されたパケットにさらに適用されます。


または、現在の作業ディレクトリに再帰的に移動します(最新バージョンのGNU実装に-r/オプションが提供されている場合)。-Rgrep

関連情報