리눅스 커널 소스 네트워크쪽에서 3way handshake 구현된곳의 백

einsok의 이미지

리눅스 커널 소스에서 클라이언트가 connect()로 syn메시지를 서버에 보냈을 때 syn가 저장된다는 백로그큐에 접근해서 그부분을 조사해 syn flooding 공격을 검출해보려고 하고 있습니다.

그런데 소스를 뒤져봐도 백로그큐..syn메시지가 75초동안 보관되었다가 time-expire되면 버려진다는 그 백로그큐를 발견할 수가 없습니다. 혹시 제가 개념을 잘못잡고 있는건지요? 그냥 중간에서 모든 패킷을 가로채서 검사하는 방법을 취할수 밖에 없는건지요?

아시는 분 도와주세요 ㅠ.ㅠ 너무 어렵네요.

wariua의 이미지

~linux/include/net/tcp.h에...

struct tcp_listen_opt {
{
         u8                     max_qlen_log;   /* log_2 of maximal queued SYNs */
         int                    qlen;
         ...
         struct open_request    *syn_table[TCP_SYNQ_HSIZE];
};

가 있습니다. 이 필드를 주로 다루는 코드는 ~linux/net/ipv4/tcp_ipv4.c에 있습니다.

구글링이나 괜찮은 리눅스 커널 관련 책을 읽으실 수도 있겠지만, 이번 같은 경우는 몇 번의 grep으로도 간단히 원하는 루틴을 찾으실 수 있습니다. /proc/sys/net/ipv4/tcp_max_syn_backlog가 백로그의 최대 크기를 지정하는 거라는 걸 알고 계시다면 ~linux/net/ 에서 "tcp_max_syn_backlog"로 grep을 해보실 수 있고, 그러면 sysctl 관련 루틴을 제외하고 딱 두 개 파일(~linux/net/ipv4/tcp_ipv4.c, ~linux/net/ipv4/tcp.c)이 걸립니다.

$PWD `date`

einsok의 이미지

예..저도 저 구조체까지 따라가봤는데요..
syn_backlog라는 문자가 들어간 필드는 정수형으로 되있어서
갯수정도 체크만 해주는거 같았습니다.

적어주신 저 구조체가 백로그에 직접 관련있는 구조체라는 말씀이신가요?
따라가다보면 뭔지모를 코드들이 너무 많이 나와서 어떤식으로 구현이 되있는지 윤곽을 모르고는 제실력으로는 도저히 이해가 안되더라고요 ㅠ.ㅠ

백로그큐라는게 실제로 큐이고 따로 전송계층에서 syn패킷을 따로 저장해놓는 자료구조가 있는건가요? 아니면 개념적으로 있는거고 실제로는 다른식으로 처리되있는건지요? ㅠ.ㅠ

wariua의 이미지

예, sysctl_max_syn_backlog 변수는 백로그의 항목 최대 갯수를 지정하는 정수 변수가 맞습니다. 소스 트리에서 원하시는 부분을 어떻게 찾아가실 수 있는가 하는 한 예로 든 것이고, 이 외에도 TCP SYN와 관련된 다른 sysctl 변수들(tcp_syn_reties, tcp_synack_retries, tcp_syncookie)을 이용해 찾아가실 수도 있습니다.

참, 혹시나 싶어서 말씀드리자면 제가 보고 있는 커널 소스는 2.6.6 버전입니다. 같은 2.6.x 버전의 소스를 보고 계신 거라면 별 문제 없겠지만, 2.4.x 라거나 하면 얼마나 다를지 저도 잘 모르겠네요;;;

위에서 적었던 구조체가 백로그 큐를 위한 구조체 맞습니다. 개념적으로는 연결 요청이 한쪽에서 차례대로 들어오고 다른 쪽에서 차례대로 나가는 queue이지만, 실제 구현은 빠른 탐색 등을 위해 hash table로 구현되어 있습니다. syn_table 필드가 바로 bucket들이구요. 테이블에 연결 요청을 추가하거나 제한 시간이 만료된 요청을 삭제하는 루틴은 "syn_table"로 grep 하면 찾으실 수 있습니다. 대략 ~linux/net/ipv4/tcp_ipv4.c의 tcp_v4_synq_add() 함수와 ~linux/net/ipv4/tcp_timer.c의 tcp_synack_timer() 함수 등을 참고하실 수 있습니다.

$PWD `date`

einsok의 이미지

그렇군요 ^^; 저도 synq_add 함수이름이 그럴듯해서 그쪽 찾아보다가
이상한 hash펑션을 통한뒤에 syn-table[] 배열(맞던가..)에다가 넣어주는 코드를 보고 혹시 이건가 하다가 너무 복잡하고 그래서 큐라고 했는데 이럴리가....이쪽은 다른 뭔가를 처리해주는곳인가보다...생각하며 좌절했었는데...그래도 길은 제대로 찾아간거였네요..^^

아..복잡합니다... 다시 열심히 함 봐야겠네요.

정말 감사합니다. 그리고 저는 2.4.31보는데 다행히 비슷하네요

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.