以下のような簡単なスクリプトを設定しました。
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を閉じることができる方法があるかどうかです。リモートマシンですが、スクリプトは実行したままにします。私が試すことができる提案はありますか?または、はるかに論理的なこれを行う他の方法はありますか?
リモートキャプチャトラフィックスクリプトのいくつかの改善を提案します。
防止 CTRC+C スクリプトを強制終了することから:
これは、トラップを使用してSIGINT
をキャプチャすることで実行できます。通常、スクリプトの先頭に配置します。この例を参照してください。
trap "pkill ssh" INT
明らかに、必要なsshのみを取得するためのフィルターを改善できます。
その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
の使用に関するポイントも参照してください。
使用する必要がないようにtcpdump
のパケット数を制限する CTRC+C いつも。
少数のトラフィックセットのみをキャプチャする場合は、tcpdump
によってキャプチャされるtcpdump
パケットの数を制限する必要があります。
たとえば、100パケットをキャプチャして返す場合:
tcpdump -c 100 -w -
使用を避けるためにtcpdump
を時間内に制限する CTRC+C いつも。
5分(300秒)のトラフィックをキャプチャする場合は、リモート側でtimeout
コマンドを使用します。のように:
ssh "timeout 300 tcpdump -w -"
そのシェルを落とす
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 -"
バッファリング解除tcpdump
tcpdump
からtcpdump
へのstdout
出力はバッファリングされます。バッファを解除してリモートホストからデータをより速く取得し、中断したときに失われるデータを減らすには、-l
を使用します。
/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -l -w -
これはあなたのケースで役立つかもしれないし、役に立たないかもしれません、いくつかのテストをしてください。 CTRL-Cで中断すると、より多くのデータが確実に残ります。
トラフィックダンプの取得に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
そのsshpass
を削除します
パスワードの代わりにsshキーを使用して認証します。
最後に、より専門的に行う場合は、エージェントと専門的なサービスを使用する可能性を検討します。
cshark
を使用してそれを行うことができます。
トラフィックをキャプチャし、分析のためにCloudSharkに直接アップロードします。 https://www.cloudshark.org のCloudSharkサービスまたは独自のCloudSharkアプライアンスを使用してください。