2010-12-02 4 views
4

이것이 첫 번째 질문입니다. @stackoverflow.libpcap setfilter() 함수와 패킷 손실

일부 VoIP 프로덕션 서버, 특히 Perl에서 pcap 라이브러리를 사용하여 주어진 패턴과 일치하는 모든 트래픽 (VoIP 호출)을 캡처 할 수있는 스 니프 도구에 대한 모니터링 도구를 작성하고 있습니다.

나는 예를 들어 다음과 같은 열악한 선택 필터를 사용할 수 없습니다. "udp"를 실행 한 다음 내 앱 코드에서 모든 필터링을 수행합니다. 트래픽이 너무 많아서 커널이 패킷 손실을보고하지 않기 때문입니다.

내가 수행하는 작업은 캡처하는 동안 가능한 한 더 선택적 필터를 반복적으로 작성하는 것입니다. 처음에는 (모든) SIP 시그널링 트래픽과 IP 조각 (패턴 일치는 어떤 경우에도 애플리케이션 레벨에서 수행되어야 함)을 캡처 한 다음 SIP 패킷으로 RTP에 대한 정보를 찾으면 '또는'절을 특정 IP 및 PORT가있는 실제 필터 문자열을 찾아서 setfilter()를 사용하여 필터를 다시 설정하십시오.

이 같은

그래서 기본적으로 뭔가 :

  1. 초기 필터 : "(UDP 포트 5060) 또는 (UDP 및 IP [6 : 2]! & 0x1fff = 0)"-> 모든 SIP 트래픽을 캡처 및 IP는

  2. 업데이트 필터 프래그먼트 ->가 또한 RTP 캡처 "(UDP 포트 5060) 또는 OR (호스트 IP 및 포트 PORT) (UDP 및 IP [6 2 & 0x1fff를 = 0!)" 특정 IP, 포트

  3. 업데이트 된 필터 : "(udp (호스트 IP 및 포트 PORT) 또는 (호스트 IP2 및 포트 PORT2) "-> 두 번째 RTP 스트림도 캡처합니다.

(포트 5060) 또는 (udp 및 ip [6 : 2] & 0x1fff! = 0)

등등.

내 도구의 선택 필터 버전이 좋지 않은데 비해 RTP 패킷 손실 백분율이 신뢰할 수없는 반면 모니터링 목적으로 RTP 스트림의 '실제'패킷 손실을 얻을 수 있기 때문에 상당히 효과적입니다. 커널에 의한 패킷 드롭으로 인해 패킷이 누락되었습니다.

하지만이 방법의 단점을 보도록하겠습니다.

캡쳐 중에 setfilter()를 호출하면 setpkap() 함수의 코드 주석에서 pcap-linux.c (check libpcap version 0.9 및 1.1)로 설명한 것처럼 libpcap이 "필터를 변경하는 중"수신 된 패킷을 삭제합니다.

그래서 setfilter()를 호출하고 IP 조각화 된 일부 패킷이 도착하면 일부 조각이 풀리고 결국 libpcap 통계에 의해보고되지 않습니다. 추적으로 파고 들었습니다.

이 작업이 libpcap에 의해 수행되는 이유를 알았지 만, 제 경우에는 패킷 손실이 전혀 필요하지 않습니다. (관련없는 트래픽이 생기는 것은 신경 쓰지 않습니다.)

libpcap의 코드를 수정하지 않는이 문제를 해결하는 방법을 알고 싶습니까?

답변

1

더 구체적인 필터로 새 프로세스를 시작하는 경우는 어떻습니까? 한 번에 두 개의 병렬 pcap 캡처를 할 수 있습니다. 잠시 후 (또는 동일한 패킷을 모두 받았는지 확인) 원본을 멈출 수 있습니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 나는 "새로운 필터"가 필요할 때마다 프로세스를 생성하는 것에 대해 생각했지만, 결국 프로세스의 상당 부분이 끝나고 결국 캡처를 병합하는 작업도 끝날 것입니다. 솔직히 말해서 내가 피해야 할 것이 었습니다. : P – Guido

1

모든 RTP 트래픽을 캡처 할 수 있습니까?

capture filters에서 RTP 트래픽에 대한 제안은 다음 링크가 지적

udp[1] & 1 != 1 && udp[3] & 1 != 1 && udp[8] & 0x80 == 0x80 && length < 250 

당신이 RTP에 의해 사용되는 DNS 및 가능한 다른 UDP 패킷이 이따금 헤더 바이트, 0x80으로 포함되어 몇 가지 잘못된 반응을 얻을 것이다 그러나 패킷 수는 무시할 만하고 커널을 떨어 뜨릴만큼 충분하지 않아야합니다.

+0

안녕하세요, 답변 해 주셔서 감사합니다. 불행히도 프로덕션 서버에는 많은 수의 호출이 있고 모든 RTP 트래픽은 거의 모든 트래픽을 의미하며 많은 부분을 차지합니다. 이런 종류의 필터에 대해 알아두면 좋지만 나중에 유용 할 수도 있습니다. – Guido

1

둥근 구멍, 사각형 페그.

당신이 필요로하지 않는 도구가 있습니다.

또 다른 옵션은 첫 번째 수준의 필터 (위와 같이 원하는 것보다 많이 캡처 함)를 수행하고 원하는 세밀한 필터 (통화 별 사례까지)를 구현하는 다른 도구로 파이프하는 것입니다. 첫 번째 레벨의 필터가 RTP 트래픽이 많아 커널에 너무 많은 경우 개별 호출을 캡처하기 위해 안정적인 프로세스를 유지해야 할 수도 있습니다 (따라서 "메인"필터에서 필터를 변경하지 않을 것입니다) 단순히 필터를 설정하는 방법을 다른 사람들에게 지시하는 것입니다.)

예, 즉석에서 (캡처를 저장하는 모든 과정에 전달) 또는 사실 이후에 캡처를 병합하는 것을 의미 할 수 있습니다.

필터를 설치하지 않으면 RTP 패킷을 놓칠 수 있습니다. RTP 패킷이 200 OK가 오기 전에 (또는 함께) 발신자가 들어올 수 있다는 것을 잊지 말고, ACK 전에 (또는 그 위에) 응답자에게 돌아갈 수 있습니다. 또한 SDP가없는 INVITE를 잊지 마시기 바랍니다 (200 OK에서 제공, ACK 응답). 기타 :-)

+0

미디어 스트림에 관해서는 처음부터 끝까지 패킷을 놓칠 경우 커다란 문제는 아니지만 중간에 완전한 실제 스트림을 얻는다면 : * 실제 * 패킷 손실을 감지 할만큼 충분해야합니다. 우연히 있다). 결국 다중 프로세스가 유일한 솔루션이라고 생각해 왔습니다. libpcap에 패치를 적용한 버전을 구현했지만 항상 불행히도 잘 작동하지는 않습니다. – Guido