Tcpdump

停止 CTRL+C 退出在遠端機器上執行 tcpdump 的本地腳本

  • February 6, 2019

我已經設置了一個簡單的腳本,如下所示:

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,同時將輸出保存到本地電腦上的文件中(遠端設備的儲存容量非常有限,因此這將允許我獲得大量擷取,當然,還可以讓我更快地按需設置擷取)。

和 heredoc的目的sh是因為預設情況下,我不會被放入此遠端設備的適當外殼中。在遠端設備中發出sh讓我能夠執行我的 tcpdump 的正確 shell,而這個 heredoc 是我發現完成此任務並且仍然將資訊移植回我的本地文件的唯一方法。

我遇到的問題是,一旦腳本到達該腳本的 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 資訊仍將發佈到標準輸出,因此仍將填充到我的本地擷取文件中。但是,似乎當我嘗試以這種方式執行擷取時&,它實際上並沒有讓我在終端中發布任何其他內容(不確定是否總是有太多的垃圾飛行或什麼)。我什至在本地嘗試過,似乎嘗試將原始 tcpdump 發佈到標準輸出並不會讓其他任何事情發生。

基於此資訊,此時我唯一能想到的是,是否有某種方式可以使用CTRL+C來關閉遠端電腦上的 tcpdump,但保持我的腳本仍在執行。我可以嘗試任何建議嗎?或者其他更合乎邏輯的方法?

我建議對您的遠端擷取流量腳本進行一些改進:

  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 -
  1. 限制tcpdump時間以避免一直使用CTRC+ C

如果要擷取 5 分鐘(300 秒)的流量,請使用timeout遠端端的命令。如:

ssh "timeout 300 tcpdump -w -"
  1. 丟掉那個殼

您正在使用 shell,因為您需要 $PATH 來呼叫tcpdump. 而是呼叫完整tcpdump路徑。

如:

sshpass -p $password ssh -T $username@$ip_address -p 30007 "/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w -"
  1. 無緩衝tcpdump

tcpdump輸出到tcpdumptostdout被緩衝。要取消緩衝​​以更快地從遠端主機獲取數據,並在中斷它時失去更少的數據,請使用-l

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

這對您的情況可能有用也可能沒用,請進行一些測試。當你用 CTRL-C 打斷它時,它肯定會給你留下更多的數據。 7. 不使用 SSH 獲取流量轉儲。改為使用netcat

如果您沒有如此嚴格的安全要求,例如在您自己的網路中進行擷取,並且沒有防火牆阻止兩台主機之間的埠,請放棄該 SSH 以獲取tcpdump輸出。這是一個計算量很大的協議,如果您需要擷取更多的遠端流量,它會妨礙您。改為使用nc來獲取tcpdump數據。

與本地機器一樣:

nc -l -p 20000 > capture.dump &

遠端機器:

ssh remote "/usr/bin/tcpdump -w - | nc IP_local_machine 20000" > /dev/null
  1. 放棄那個sshpass

使用 ssh 密鑰而不是密碼進行身份驗證。 9. 最後,如果做得更專業,考慮使用代理+專業服務的可能性。

您可以使用cshark.

擷取流量並將其直接上傳到 CloudShark 進行分析。使用https://www.cloudshark.org上的 CloudShark 服務或您自己的 CloudShark 設備。

引用自:https://unix.stackexchange.com/questions/498382