2013-03-26 2 views
0

ssh를 사용하여 원격으로 서버 인터페이스에서 트래픽을 캡처하여 Tcpdump를 제어하는 ​​쉘 스크립트에 명령을 보냈습니다.캡처 한 수백만 개의 패킷을보고 한 경우에도 Tcpdump 저장된 파일이 비어 있습니다.

#!/bin/bash 
# Script to Start/Stop TCP 
# Usage: ./ControlTCPdump.sh start|stop [filename] 

CONSOLE_OUTPUT="tcpdump$(date +%m%d).console" 
HOST_NAME=`hostname` 

#Default filename: 
if [ "$2" = "" ]; then 
    FILENAME="traffic.dmp" 
else 
    FILENAME=$2 
fi 

if [ "$1" = start ]; then 
    echo $(date) $FILENAME >> $CONSOLE_OUTPUT 
    if [ "" = "$(pidof tcpdump)" ]; then 
     nohup tcpdump -s 96 -w $FILENAME -i em2 -n tcp > /dev/null &>> $CONSOLE_OUTPUT & 
     echo [$HOST_NAME] TCPdump is started\! 
    else 
     echo [$HOST_NAME] There is runnung process. Kill All\! 
     killall -q tcpdump #Quiet, don't talk 
     sleep 1 
     if [ "" = "$(pidof tcpdump)" ]; then 
      echo [$HOST_NAME] Restarting TCPdump... 
      nohup tcpdump -s 96 -w $FILENAME -i em2 -n tcp >/dev/null &>> $CONSOLE_OUTPUT & 
      echo [$HOST_NAME] TCPdump is started\! 
     else 
      echo [$HOST_NAME] Error\! Cannot kill them\! 
      exit 0 
     fi 
    fi 
else 
    if [ "$1" = stop ]; then 
     TD=`pidof tcpdump` 
     if [ -n "$TD" ]; then 
      kill "$TD" 
     fi 
     sleep 1 
     if [ "" = "$(pidof tcpdump)" ]; then 
      echo [$HOST_NAME] TCPdump is stopped\! 
     else 
      echo [$HOST_NAME] Error\! Cannot kill them\! 
      exit 0 
     fi   
    else 
     echo [$HOST_NAME] Syntax error\! 
     exit 0 
    fi 
fi 

보고서에는 이미 수천 개의 패킷이 포착되었다고합니다. 그러나 tcpdump cap 파일을 볼 때 비어 있으며 tcptrace로 읽을 때 문제가 있습니다.

... 
-rw-r--r--. 1 root root 105206180 Mar 25 16:37 Traffic05.dmp 
-rw-r--r--. 1 root root 117855276 Mar 25 16:39 Traffic06.dmp 
-rw-r--r--. 1 root root 109911288 Mar 25 16:40 Traffic07.dmp 
-rw-r--r--. 1 root root 121505444 Mar 25 16:42 Traffic08.dmp 
-rw-r--r--. 1 root root 110303300 Mar 25 16:43 Traffic09.dmp 
-rw-r--r--. 1 root root 120444026 Mar 25 16:45 Traffic10.dmp 
-rw-r--r--. 1 root root 98545664 Mar 25 16:46 Traffic11.dmp 
-rw-r--r--. 1 root root   0 Mar 25 16:48 Traffic12.dmp 
-rw-r--r--. 1 root root   0 Mar 25 16:50 Traffic13.dmp 
-rw-r--r--. 1 root root   0 Mar 25 16:51 Traffic14.dmp 
-rw-r--r--. 1 root root   0 Mar 25 16:53 Traffic15.dmp 
-rw-r--r--. 1 root root   0 Mar 25 16:54 Traffic16.dmp 
... 

이 언젠가는 일을 언젠가는하지 않았다 :

... 
Mon Mar 25 23:25:48 CET 2013 CapturedTraffic201303252230/Traffic30.dmp 
tcpdump: listening on em2, link-type EN10MB (Ethernet), capture size 
96 bytes 1403831 packets captured 1403831 packets received by filter 0 
packets dropped by kernel Mon Mar 25 23:27:28 CET 2013 

CapturedTraffic201303252230/Traffic31.dmp tcpdump: listening on em2, 
link-type EN10MB (Ethernet), capture size 96 bytes 1378692 packets 
captured 1378692 packets received by filter 0 packets dropped by 
kernel 
... 

현상이 하나 (I는 "LS -l"을 사용하여 파일 크기를 보려면)과 같다. 전에 이런 종류의 문제가 발생한 사람이 있습니까? 도와 줘서 고마워.

+0

디스크가 꽉 찼습니까? – themel

+0

디스크가 꽉 찼지 만 tcpdump가 알려주지 않았습니다. 나는 tshark로 바꾼다. 그리고 그것은 공간이 떠났다라고 나에게 이야기했다. 고마워요. –

답변

-1

귀하의 스크립트를 시도했는데 몇 가지 사항이 있습니다 (문제와 관련 없음).

  • 당신은 HOSTNAME을 할당 (이미 그런데, 기본적으로 설정되어있는) 그리고 당신은 항상 HOST_NAME을 사용합니다. 어쩌면 HOST_NAME을 대신 설정 하시겠습니까?

  • 스크립트의 마지막 else

    은 (버퍼 일명)의 크기가 일정 금액에 도달하면 말했다 fi

이 파일을 디스크에 기록받을 수 있어야합니다. sync과 강제로 동기화 할 수 있습니다. 예 :

# ls -al 
total 16 
drwxr-xr-x 2 root  root 4096 Mar 26 10:51 . 
drwxr-xr-x 5 elisiano users 4096 Mar 26 10:43 .. 
-rwxr-xr-x 1 elisiano users 1327 Mar 26 10:49 ControlTCPdump.sh 
-rw-r--r-- 1 root  root 119 Mar 26 10:51 tcpdump0326.console 
-rw-r--r-- 1 root  root  0 Mar 26 10:51 traffic.dmp 
[[email protected] /home/elisiano/Projects/ctcpd ]# ls -al 
total 16 
drwxr-xr-x 2 root  root 4096 Mar 26 10:51 . 
drwxr-xr-x 5 elisiano users 4096 Mar 26 10:43 .. 
-rwxr-xr-x 1 elisiano users 1327 Mar 26 10:49 ControlTCPdump.sh 
-rw-r--r-- 1 root  root 119 Mar 26 10:51 tcpdump0326.console 
-rw-r--r-- 1 root  root  0 Mar 26 10:51 traffic.dmp 
# sync 
# ls -al 
total 24 
drwxr-xr-x 2 root  root 4096 Mar 26 10:51 . 
drwxr-xr-x 5 elisiano xbmc 4096 Mar 26 10:43 .. 
-rwxr-xr-x 1 elisiano users 1327 Mar 26 10:49 ControlTCPdump.sh 
-rw-r--r-- 1 root  root 119 Mar 26 10:51 tcpdump0326.console 
-rw-r--r-- 1 root  root 8192 Mar 26 10:51 traffic.dmp 

콘솔 출력의 출력을 붙여 넣을 수 있습니까?

또한 파일 크기에 대한 파일 시스템 한도에 도달 했습니까?

이 디버깅하려면 터미널 멀티플렉서 (예 : screen 또는 tmux)에서 tcpdump를 점심을 먹고 세션에서 분리해도 tcpdump를 실행할 수 있습니다. 이렇게하면 (세션을 다시 연결하면) 추가 출력을 볼 수 있습니다.

+0

감사합니다. 페트리 니. 마지막 부분이없는 쉘 스크립트를 복사합니다. 파일 크기가 150MB 이하 여야 문제가 발생할 것으로 생각되지 않습니다. 내 최대 대역폭은 1Gbs이고 60 초 동안 각 패킷을 전송할 때마다 96 바이트 만 사용합니다. 확실히 150MB를 초과 할 수 없습니다. –

+0

질문의 중간에있는 코드는 작동하지 않는 콘솔 출력입니다. 그것은 항상 패킷의 톤을 캡처했다고보고하지만, 모자 파일을 볼 때, 그것은 0 바이트의 크기가됩니다. –

+1

sync 명령의 의미에 착각했습니다. 블록 버퍼 캐시를 디스크에 기록하고 응용 프로그램 로컬 버퍼는 파일 설명자에 기록하지 않습니다. – themel