web-dev-qa-db-ja.com

リモートマシンでtcpdumpを実行しているローカルスクリプトを終了するCTRL + Cを停止します

以下のような簡単なスクリプトを設定しました。

sshpass -p $password ssh -T $username@$ip_address -p 30007 <<- EOF > $save_file.pcap
    sh
    tcpdump -i eth5.1 -s 0 -n -v -U -w -
EOF

sed -i '1d' $save_file.pcap

このスクリプトの目的は、リモートデバイスでtcpdumpを実行しながら、出力をローカルマシンのファイルに保存できるようにすることです(リモートデバイスのストレージ容量は非常に限られているため、これにより、非常に大きなキャプチャを取得できます。もちろん、オンデマンドでキャプチャをより迅速に設定できるようになります)。

shとヒアドキュメントの目的は、デフォルトでは、このリモートデバイスの適切なシェルにドロップされないためです。リモートデバイスでshを発行すると、tcpdumpを実行できる適切なシェルに移動します。このヒアドキュメントは、このタスクを実行し、情報をローカルファイルに移植するために私が見つけた唯一の方法です。 。

私が直面している問題は、スクリプトがこのスクリプトのtcpdumpセクションに到達すると、端末に次のような出力が表示されることです。これは、tcpdumpをファイルに実行したときに表示されると予想されるとおりです。

drew@drew-Ubuntu-18:~/Desktop$ ./Script.sh 
tcpdump: listening on eth5.1, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 665

そしてもちろん、その「Got」カウンターは、より多くのパケットがキャプチャされてローカルファイルにパイプされるにつれて増加します。残念ながら、これを停止して端末を返すためにこれまでに見つけた唯一の方法は、CTRL + Cを開始することです。

ここでの問題は、これによりリモートマシンのtcpdumpが停止するだけでなく、ローカルマシンで実行されているスクリプトが終了することです。

もちろん、これはスクリプトでこれ以上何も実行されないことを意味し、ここに含めたsedだけでなく、このデータを使用して実行する必要のあるタスクがたくさんあります。

代わりに、次のように設定しようとしました。

tcpdump -i eth5.1 -s 0 -n -v -U -w - &
read -n 1 -s; kill $!

ここでの思考プロセスは、私の生のtcpdump情報がまだstdoutに投稿されているため、ローカルキャプチャファイルに入力されているということです。ただし、この方法で&を使用してキャプチャを実行しようとすると、実際にはターミナルに他に何も投稿できなかったようです(常に大量のジャンクが飛んでいるかどうかはわかりません)。何)。私もこれをローカルで試しましたが、stdoutに生のtcpdump投稿を実行しようとしても、他に何も起こらないようです。

この情報に基づいて、この時点で私が考えることができる唯一のことは、CTRL + Cを使用してのtcpdumpを閉じることができる方法があるかどうかです。リモートマシンですが、スクリプトは実行したままにします。私が試すことができる提案はありますか?または、はるかに論理的なこれを行う他の方法はありますか?

1
Drew

リモートキャプチャトラフィックスクリプトのいくつかの改善を提案します。

  1. 防止 CTRC+C スクリプトを強制終了することから:

    これは、トラップを使用してSIGINTをキャプチャすることで実行できます。通常、スクリプトの先頭に配置します。この例を参照してください。

    trap "pkill ssh" INT
    

    明らかに、必要なsshのみを取得するためのフィルターを改善できます。

  2. そのtcpdumpからリモートマシンとの通信を除外します

    システムがキャプチャに適切に反応していないとのことですが、再帰的なデータキャプチャがシステムに過負荷をかけている可能性があります。聞いているインターフェースによっては、リモートマシンとの接続ごとに、制御接続データがキャプチャに追加され、tcpdumpにフィードするパケットがさらに生成されるという再帰的な状況が発生する場合があります。

    したがって、tcpdumpは、ローカルマシンとリモートマシン間の通信を除外する必要がある場合があります。次のようなものを使用します。

    /usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not port 22"
    

    または:

    /usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not my_local_Host"
    

    これにより、速度の低下と不安定さが軽減される可能性があるため、スクリプトの動作が向上します。後で、ncの使用に関するポイントも参照してください。

  3. 使用する必要がないようにtcpdumpのパケット数を制限する CTRC+C いつも。

    少数のトラフィックセットのみをキャプチャする場合は、tcpdumpによってキャプチャされるtcpdumpパケットの数を制限する必要があります。

    たとえば、100パケットをキャプチャして返す場合:

    tcpdump -c 100 -w -
    
  4. 使用を避けるためにtcpdumpを時間内に制限する CTRC+C いつも。

    5分(300秒)のトラフィックをキャプチャする場合は、リモート側でtimeoutコマンドを使用します。のように:

    ssh "timeout 300 tcpdump -w -"
    
  5. そのシェルを落とす

    tcpdumpを呼び出すには$ PATHが必要なため、シェルを使用しています。代わりに、完全なtcpdumpパスを呼び出します。

    のように:

    sshpass -p $password ssh -T $username@$ip_address -p 30007 "/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w -"
    
  6. バッファリング解除tcpdump

    tcpdumpからtcpdumpへのstdout出力はバッファリングされます。バッファを解除してリモートホストからデータをより速く取得し、中断したときに失われるデータを減らすには、-lを使用します。

    /usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -l -w -
    

    これはあなたのケースで役立つかもしれないし、役に立たないかもしれません、いくつかのテストをしてください。 CTRL-Cで中断すると、より多くのデータが確実に残ります。

  7. トラフィックダンプの取得にSSHを使用していません。代わりにnetcatを使用してください。

    それほど厳格なセキュリティ要件がない場合(例:独自のネットワーク内のキャプチャで、2つのホスト間の途中にファイアウォールがポートをブロックしていない場合は、そのSSHをドロップしてtcpdump出力を取得します。これは計算量の多いプロトコルであり、より多くのリモートトラフィックをキャプチャする必要がある場合に邪魔になります。代わりにncを使用して、tcpdumpデータを取得します。

    ローカルマシンの場合:

    nc -l -p 20000 > capture.dump &
    

    リモートマシン:

    ssh remote "/usr/bin/tcpdump -w - | nc IP_local_machine 20000" > /dev/null
    
  8. そのsshpassを削除します

    パスワードの代わりにsshキーを使用して認証します。

  9. 最後に、より専門的に行う場合は、エージェントと専門的なサービスを使用する可能性を検討します。

    csharkを使用してそれを行うことができます。

    トラフィックをキャプチャし、分析のためにCloudSharkに直接アップロードします。 https://www.cloudshark.org のCloudSharkサービスまたは独自のCloudSharkアプライアンスを使用してください。

1
Rui F Ribeiro