2011년 5월 17일 화요일

패킷캡쳐 라이브러리 Libpcap 의 MMAP 방식

오늘은 한번 Libpcap 이야기를 잠깐 꺼내볼까 한다. Libpcap 에서 사용하는 방법중에 하나가 Memory Mapped 방식의 MMAP 방식이다. 패킷이 커널로부터 유저 공간으로 포워딩 되는 방식이 아니라, 링버퍼를 이용한 것이다. 패킷 캡쳐 방식으로 가장 많이 이용하는 Libpcap 은 상위 레벨의 패킷 캡쳐 라이브러리이다. Tcpdump, Snort, Wireshark 등 많은 네트워크 패킷 관련 프로그램이 사용하고 있다.

Libpcap 은 네트워크 인터페이스 카드에 Promiscuous 모드 설정을 허용하며, 네트워크 카드에서 패킷을 커널로 포워드 시킨다. 커널의 패킷은 다시 PF_PACKET 소켓을 거쳐 유저 공간으로 까지 넘어와 사용할 수 있게 되는 것이다. libpcap 1.0.0 이상이면 MMAP 을 지원하고 있고, 리눅스 커널은 정확하지는 않지만 대략 2.6.27 부터인가 기본 설정으로 지원한다. 즉, 컴파일시

CONFIG_PACKET_MMAP=y 라는 것이다. 물론 그 이전 버전에서도 직접 설정하여 컴파일을 하면 사용할 수 있다.

만약, 여러분이 패킷 캡쳐 시스템으로 사용하는 시스템이 리눅스 이며, 오래된 커널 버전을 사용하고 있다면 이 부분도 한번 검토해 볼 필요가 있다. PACKET_MMAP 방식을 사용하지 않는 상태라면 성능이 저하되기 때문이다. 최근, 고속화되고 있는 네트워크 구조에 따라 10,100 메가를 넘어 기가비트는 기본이 되었다. 말은 쉽게 기가비트를 얘기하지만, 이런 네트워크 환경에서 패킷 덤프를 하는게 쉬운일 만은 아니다. 어떻게 하면 고속으로 패킷 손실 없이 패킷을 저장할 수 있을까 하는 연구가 계속되는 것이다. 전문적인 장비도 나오지만, 필자 입장에서는 일반적인 시스템 상에서 커널 파라미터를 어떻게 조정하고 또 어떤 방식을 통해 효율적인 패킷 모니터링을 구현할 수 있을까가 관심사다. 이런 부분은 앞으로도 차차 언급해 보도록 하겠다.

어찌되었든 여러분의 시스템에서 MMAP 버전을 사용하는지 확인하고 싶다면, 다음과 같이 알아볼 수 있다.

$ cat /proc/net/ptype
Type Device      Function
ALL  eth3     tpacket_rcv+0x0
ALL  dummy0   tpacket_rcv+0x0
0800          ip_rcv+0x0
0011          llc_rcv+0x0
0004          llc_rcv+0x0
0806          arp_rcv+0x0
86dd          :ipv6:ipv6_rcv+0x0

"tpacket_rcv" 가 보인다면 MMAP 버전을 사용하는 것이다. 만약 앞에 't' 가 없다면 MMAP 버전이 아니라 오래된 버전을 사용하는 것일 것이다. 아주 오래된 시스템만 아니면, 기본적으로는 많이 사용하고 있을 것이다.

[참고]
1. Linux Packet MMAP
http://wiki.ipxwarzone.com/index.php5?title=Linux_packet_mmap

댓글 없음:

댓글 쓰기