2010년 8월 12일 목요일

패킷덤프중 프로세스 강제종료는 일부 데이터손실을 가져올 수 있다.

tcpdump 를 이용하여 패킷을 여러개 기록한 경우가 있다. 이상하게도 이전 포스팅에서 소개한 것과 같이 패킷파일을 열어보려고 하면 'appears to have been cut short in the middle of a packet' 메시지가 나타났지만, 어떤 경우는 아예 데이터가 없거나 일부분만 있는 경우가 나타났다.

일부는 기록이 되었는데, 100% 완벽하게 기록이 되지 못했던 것이다. 이유인즉, kill -9 로 프로세스를 kill 하면서 발생하는 문제였다. tcpdump 옵션을 찾아보니 이를 해결할 옵션이 보인다. 바로 -U 옵션이다.

-U 옵션은 Output 버퍼에 기록되어 기록되기 보다는 바로 디스크에 기록이 된다는 점이다. 데이터를 바로바로 기록할 수 있으므로, 내용 하나하나가 중요한 경우에는 필요한 옵션이다.

       -U     Make  output  saved  via  the  -w  option ``packet-buffered``; i.e., as each packet is
              saved, it will be written to the output file, rather than being written only when  the
              output buffer fills.

              The  -U flag will not be supported if tcpdump was built with an older version of libpcap
              that lacks the pcap_dump_flush() function.

다만, 디스크에 바로 기록하기 때문에 디스크 IO 요청은 늘어난다. 이런점은 고려하여 사용여부를 결정해야 한다.

이 -U 옵션을 좀더 살펴보기 위해 tcpdump 소스코드를 살펴보았다. 일반적인 기록에는 pcap_dump 가 사용되는데 -U 옵션은 pcap_dump_flush 가 사용되고 있다.

    pcap_dump((u_char *)dump_info->p, h, sp);
#ifdef HAVE_PCAP_DUMP_FLUSH
    if (Uflag)
        pcap_dump_flush(dump_info->p);
#endif

    --infodelay;
    if (infoprint)
        info(0);
}

사용되는 libpcap 의 소스코드를 살펴보면 pcap_dump_flush 에는 fflush 로 기록을 하고 있고 , pcap_dump 는 fwrite 를 통해 기록을 하고 있다는 차이점이 있다.


[fflush 이용]

int
pcap_dump_flush(pcap_dumper_t *p)
{

    if (fflush((FILE *)p) == EOF)
        return (-1);
    else
        return (0);
}

[fwrite 이용]

void
pcap_dump(u_char *user, const struct pcap_pkthdr *h, const u_char *sp)
{
    register FILE *f;
    struct pcap_sf_pkthdr sf_hdr;

    f = (FILE *)user;
    sf_hdr.ts.tv_sec  = h->ts.tv_sec;
    sf_hdr.ts.tv_usec = h->ts.tv_usec;
    sf_hdr.caplen     = h->caplen;
    sf_hdr.len        = h->len;
    /* XXX we should check the return status */
    (void)fwrite(&sf_hdr, sizeof(sf_hdr), 1, f);
    (void)fwrite(sp, h->caplen, 1, f);
}

그렇기 때문에 kill 로 그냥 프로세스를 종료할 시에는 버퍼 내용이 다 기록된 반면 -9 옵션을 통해 kill 하는 경우 버퍼내용이 기록되지 않으면서 데이터가 완벽하게 기록이 안되는 경우가 발생한 것이다.

패킷 데이터를 덤프하는 경우, 그리고 데이터 내용이 중요한 경우에는 이점을 참고하기 바란다. 정말 패킷이 흘러간 내용이 없는 것으로 판단 착오를 할수도 있기 때문이다. libpcap 을 이용하는 패킷 덤프 프로그램에서는 이런 경우가 있을 수 있으므로 머리속에 기억해 놓자!


댓글 4개:

  1. 좋은 정보 감사합니다 :)

    답글삭제
  2. @착이 - 2010/08/20 17:12
    좋은 정보 얻어 가셔서 감사합니다 :-)

    답글삭제
  3. 좋은정보 감사합니다

    답글삭제