2012-04-15 1 views
4

리눅스 라우터에서 pcap을 사용하여 IP 헤더와 패킷 길이를 얻는 C 프로그램을 작성했습니다. 그런 식으로 통계를 수집하고 IP를 기반으로 대역폭을 측정 할 수 있습니다. 꽤 깔끔한. :-)pcap (Linux) 대신에

이제 트래픽과 사용자 수가 증가하고 오래된 프로그램이 어려움을 겪습니다. 즉, 라우터는 엄청난 양의 패킷에 대처하기 위해 애 쓰고 있습니다. "주요한 시간"에 초당 50000 패킷 이상이 있습니다.

프로그램 자체가 매우 최적화되어 있습니다. 나는 과시하고 싶지 않지만 얻을 수있는만큼 좋은 것이라고 생각합니다. IP 헤더와 패킷 길이를 읽습니다. 그런 다음 IP를 색인으로 변환하고 (단순한 빼기) 패킷의 길이가 배열에 저장 (누적)됩니다. 매 순간마다 (실제로 SIGALRM) 배열을 MySQL 데이터베이스에 저장합니다.

내 질문은 : 비트 스트림을 pcap보다 "저렴하게"가져 오는 다른 방법이 있습니까?

물론 하나의 IP 통계 수집을 포함하도록 이더넷 드라이버를 수정할 수는 있지만 과장된 것 같습니다.

기본적으로 내 프로그램은 바쁜 eth0에서 'tcpdump'이며 결국 라우터를 죽일 것입니다.

+0

포트 미러링과 같은 구성을하고 다른 컴퓨터에서 분석 할 수 있습니까? – cnicutar

+0

[softflowd] (http://code.google.com/p/softflowd/)와 같은 다양한 netflow 도구를 살펴 보았습니까? 이것은 이것에 매우 가깝게 들린다. – andri

+0

Andri : 불행히도 softflowd는 libpcap을 기반으로하므로별로 도움이되지 않습니다. –

답변

6

PF_RING으로 생각하십니까? 그것은 여전히 ​​pcap -like 세계, 그러나 스테로이드 사용 - zero-copy 메커니즘 덕분에 :

보시다시피

enter image description here

가, 거기 PF_RING 버퍼에 낮은 수준의 패킷 복사를 제공하는 커널 모듈이며,이 이 버퍼에 액세스 할 수있는 userland 부분입니다.

누가 PF_RING이 필요합니까?

기본적으로 초당 많은 패킷을 처리해야하는 모든 사람. '많은'이라는 용어는 트래픽 분석에 사용하는 하드웨어에 따라 변경됩니다. 저가형 2,5GHz Xeon에서 1,2GHz ARM에서 80k pkt/sec에서 14M pkt/sec 이상까지 다양합니다. PF_RING을 사용하면 패킷을 더 빨리 캡처 할 수있을뿐 아니라 CPU 사이클을보다 효율적으로 유지하면서 패킷을 캡처 할 수 있습니다. ...

+1

'PF_RING'은 커널에 코드를 추가해야합니다. 리눅스는 잠시 동안 별도의 내장 제로 (zero-copy) 메카니즘을 가지고 있었고, libpcap 1.0과 그 이후 버전은 그 제로 복사 메카니즘을 사용한다. (libpcap의 최신 버전 인 1.2.1이 모든 버그 수정이나 0 사본 지원). –

+0

@GuyHarris : 현재 기본값으로 사용합니까? 오래 전에 상자 밖에서 ... 아니 었어? – Anonymous

+1

1.0 이후로 기본적으로 사용됩니다. 1.0 이전에는 사용하지 않아도되었으므로 전혀 사용하지 않았습니다. –

0

PF_RING ZC를 강력히 사용하고/userland/examples_zc에서 찾을 수 있습니다. 그것은 pf_ring의 일부입니다.

pf_ring zc를 사용하면 수십 Gbps 트래픽을 회선 속도로 처리하고 캡처 할 수 있습니다.