[질문]libipq사용시 "No buffer space available" 에러!?

mixmccym의 이미지

안녕하세요 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핸들을 소멸시킵니다.

제발 이 문제를 해결해주실 고수님들이 나와주셨으면 좋겠습니다.

지도부탁드리겠습니다.

bushi의 이미지

[bushi@rose target_unit2s]$ 
[bushi@rose target_unit2s]$ cat /proc/net/ip_queue 
Peer PID          : 0
Copy mode         : 0
Copy range        : 0
Queue length      : 0
Queue max. length : 1024
Queue dropped     : 0
Netlink dropped   : 0
[bushi@rose target_unit2s]$ sudo /sbin/sysctl -w net.ipv4.ip_queue_maxlen=4096
net.ipv4.ip_queue_maxlen = 4096
[bushi@rose target_unit2s]$ 
[bushi@rose target_unit2s]$ cat /proc/net/ip_queue 
Peer PID          : 0
Copy mode         : 0
Copy range        : 0
Queue length      : 0
Queue max. length : 4096
Queue dropped     : 0
Netlink dropped   : 0
[bushi@rose target_unit2s]$

버퍼 크기를 늘려서 증상을 완화시킬 수는 있지만 궁극적인 해결책은 아닙니다.
s/w 를 잘 만드시는 것이 첫번째고, 좀 더 좋은 h/w 에서 돌리는 것이 두번째입니다.

OTL

mixmccym의 이미지

분명 ipq_read에서는 제가 뜻한대로 queue에서 지정된 buf사이즈 만큼만 읽어오는데 왜 이런 에러가 날까요?

ip_queue의 버퍼가 모잘라서 생기는 에러인지요?

s/w를 잘 만든다는 의미를 좀더 구체적으로 말씀해 주실수는 없을런지요?

만약 ip_queue의 크기때문에 생기는 일이라면 s/w를 코딩으로 해결이 될 수있나요?

저 에러가 뜨는 본질적인 의미를 알고 싶습니다.

이 에러를 궁극적으로 회피할 수있는 방법을 찾고 있습니다.

제가 지금 당장은 이 작업을 할 수있는 곳에 있지않아서

일단 ip_queue의 크기를 늘려보겠습니다.

답변에 정말 진심으로 감사드립니다.기다리고 있었습니다.

bushi의 이미지

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

댓글 첨부 파일: 
첨부파일 크기
Plain text icon ipq.c.txt9.28 KB
Plain text icon list.h.txt24.39 KB

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.