2013-06-15 2 views
0

죄송합니다. 나는 tcpdump과 pcap을 처음 사용하고있다. 나는 pcap 정적 lib를 사용하여 개발하고 응용 프로그램은 특정 포트에서 TCP 데이터를 수신 대기합니다. 작은 프로토 타입이 구축되어 있고 포트 80 (HTTP의 기본값)을 통해 전송 된 tcp 패킷을 스니핑 할 때 잘 작동합니다. 그러나 포트 5984 (CouchDB가 사용하는 기본 포트)와의 HTTP 패킷을보고 싶습니다. 내 응용 프로그램은 어떤 이유로이 포트에서 패킷을 확인/스니핑/볼 수 없습니다. 내가 노련한 네트워크 개발자가 아니기 때문에 나는 근본적으로 뭔가 빠져있을 것입니다.Tcpdump - pcap - 포트 5984에서 패킷을 스니핑 할 수 없습니다.

전체 응용 프로그램을 여기에 붙여 넣지 않고 문제를 찾는 데 필요한 코드를 추가 할 수 있습니다. 제발 알려주세요.

char filter_exp[] = "tcp port 5984";/* The filter expression */ 

필터는 컴파일하고 문제없이 PCAP 세션에 설정됩니다

이는 내 PCAP 필터 표현이다. 세션은 무차별 모드로 실행되도록 설정됩니다.

//get a pcap session 
    //args device, # of packets to capture, promisc mode, timeout, err buff 
    handle = pcap_open_live(dev, BUFSIZ, 1, 1000, errbuf); 
    if (handle == NULL) { 
     fprintf(stderr, "Couldn't open device %s: %s\n", dev, errbuf); 
     return(2); 

    //compile our filter 
    if (pcap_compile(handle, &fp, filter_exp, 0, net) == -1) { 
     fprintf(stderr, "Couldn't parse filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
     return(2); 
    } 
    //set the filter 
    if (pcap_setfilter(handle, &fp) == -1) { 
     fprintf(stderr, "Couldn't install filter %s: %s\n", filter_exp, pcap_geterr(handle)); 
     return(2); 
    } 

    //begin sniffing packets. cnt -1: keep sniffing until err occurs 
    //last arg is optional. It can be used to pass additonal information to callback 
    pcap_loop(handle, -1, got_packet, NULL); 

'got_packet'은 콜백 기능입니다. $ curl http://localhost:5984/test

을 그냥 내가 루프백 사용하려고 한 그것의 지옥 : $ curl http://127.0.0.1:5984/test

를이 내가 시도 컬을 사용하여 5984.

대신에 포트 80과 같은 필터하지만를 사용하여 여러 번 호출

이 두 가지 모두 내 pcap 응용 프로그램에 의해 주목되지 않습니다. 그러나 포트 80에서 수신 대기하도록 필터를 변경하고 $ curl http://www.google.com을 입력하면

나는 패킷을 확인할 수 있습니다. 나는 무엇을 간과하거나 이해하지 못합니까?

고맙습니다.

-Nick

+1

어떤 OS가 실행되고 있습니까? 127.0.0.1에 대한 연결을 설정하는 데 'curl 'ing google과 다른 장치를 사용하고 있다는 사실을 알고 있습니까? – alk

+0

프로그램이 관리 권한으로 실행되고 있습니까? – chacham15

+0

프로그램이 루트 액세스 권한으로 실행되고 있지 않습니다. @ chacham 중대한 시점. 아픈 그것을 시도하십시오. – Nick

답변

1

패킷이 같은 맥에 맥에서려고하는 경우 - "localhost"를 결의 - 당신이 나 127.0.0.1 (같은 일있는 "로컬 호스트"와 통신하는 경우, 예를 들어 127.0.0.1), lo0에 캡처하고 en0 또는 en1에 캡처하지 않습니다. 127.0.0.1 로의 트래픽은 실제 네트워크에서 보내지는 것이 아니라 내부적으로 머신으로 되돌아옵니다. 그래서 "루프백"네트워크와 "루프백"인터페이스를 살펴 봐야합니다.

(리눅스에서 루프백 인터페이스는 lo이 아니라가 아니라는 점을 제외하고는 다른 UN * Xes와 비슷한 답변이 적용됩니다.) Windows 및 Solaris 10과 같은 일부 버전의 UN * X에는 해당 사항이 없습니다. 이전에 루프백 인터페이스에서 캡처 할 수 없습니다.)

+0

감사! 나는 그것을 시도하고있다. 나는 루프백 (loopback)에 대해 약간의 독서를했다. 이것은 대답처럼 들립니다. – Nick

+0

예. 그거였다. 루프백 듣기가 효과적이었습니다. – Nick