[질문]libipq사용시 "No buffer space available" 에러!?
글쓴이: mixmccym / 작성시간: 수, 2008/07/09 - 10:25오후
안녕하세요 kldp 고수님들...
저는 현재 리눅스상에서 libipq를 가지고 sql injection 탐지툴을 제작하고 있습니다.
어느정도 완성이 된듯 싶지만 치명적인 버그가 있습니다.
현재 http 데이터를(header 및 payload) 계속 모니터링하며
데이터의 출력도 같이 보여주고 있습니다.
binary data같은 경우는 "."으로 대신 출력하여 잘 나오는데요
문제는 ip_queue에 있는 데이터를 버퍼로 복사해오는 ipq_read()에서
에러가 납니다.
항상 에러가 나는건 아니구요 이미지가 많거나 뭔가 볼게많은(?) 그런 사이트를 접속시에 에러가 납니다.
ipq_perror함수를 이용하여 출력해보면
Failed to receive netlink message: No buffer space available
위와 같은 에러가 뜨구요. queue에서 데이터를 복사해오는 버퍼는
unsigned char buffer[BUFSIZE] 이런형태입니다. BUFSIZE는 크게도 잡아보고 작게도 잡아보았습니다(60000이 넘게도 잡아봤구요)
그러나 언제나 같은 에러가 나는군요.
왜 그럴까요? 참고로 ipq_read함수는 다음과 같이 코딩하였습니다
status=ipq_read(h,buffer,BUFSIZE,0); if(status==-1) { fprintf(stderr,"ipq_read()에러\n"); fprintf(stderr,"ipq_get_msgerr %d번 에러!\n",ipq_get_msgerr(buffer)); error(h); }
error()에서는 ipq_perror를 사용하여 메시지 출력후 ipq핸들을 소멸시킵니다.
제발 이 문제를 해결해주실 고수님들이 나와주셨으면 좋겠습니다.
지도부탁드리겠습니다.
Forums:
[bushi@rose target_unit2s]$
버퍼 크기를 늘려서 증상을 완화시킬 수는 있지만 궁극적인 해결책은 아닙니다.
s/w 를 잘 만드시는 것이 첫번째고, 좀 더 좋은 h/w 에서 돌리는 것이 두번째입니다.
OTL
질문한 사람입니다.
분명 ipq_read에서는 제가 뜻한대로 queue에서 지정된 buf사이즈 만큼만 읽어오는데 왜 이런 에러가 날까요?
ip_queue의 버퍼가 모잘라서 생기는 에러인지요?
s/w를 잘 만든다는 의미를 좀더 구체적으로 말씀해 주실수는 없을런지요?
만약 ip_queue의 크기때문에 생기는 일이라면 s/w를 코딩으로 해결이 될 수있나요?
저 에러가 뜨는 본질적인 의미를 알고 싶습니다.
이 에러를 궁극적으로 회피할 수있는 방법을 찾고 있습니다.
제가 지금 당장은 이 작업을 할 수있는 곳에 있지않아서
일단 ip_queue의 크기를 늘려보겠습니다.
답변에 정말 진심으로 감사드립니다.기다리고 있었습니다.
http://kldp.org/node/95974
http://kldp.org/node/95974 에서 EBS Radio 방송 패킷을 덤프하기 위해 사용했던 코드를 첨부합니다.
커널 ip_queue 파라미터는 조정하지 않고 동작시켰으며,
Intel quad-core 2.4GHz 에서 오류없이 동작했습니다.
일방적인 스트림 패킷을 처리해야하는 상황에서 CPU 가 느릴 경우,
ip_queue 의 이상동작보다도 프로그램이 사용하는 메모리가 기하급수적으로 늘어나리라 예상합니다.
덤프가 주목적이었기 때문에 ipq_read() 하자마자 바로 ipq_set_verdict(ACCEPT) 처리를 했습니다.
메인루프는 ip_read() 로 읽어낸 패킷들을 복사한 뒤 리스트에 던져놓고,
1초마다 깨어나는 덤프 쓰레드는 리스트에서 패킷을 빼서 덤프합니다.
리스트에 던져놓은 뒤,
덤프쓰레드를 강제로 깨울 수도 있지만 코드 상에서 disable 시켜놓고 있습니다.
첨부파일 중 list.h 는 리눅스 커널 소스에서 복사한 파일이며 GPL 입니다.
OTL
댓글 달기