리눅스 모듈프로그래밍에서 네트워크관련

왕초보타자의 이미지

linux 모듈프로그래밍을 공부하고 있는 학생입니다.

거기서도 네트워크 쪽을 공부하고 있는데

궁금한게 있어서 이렇게 올립니다.. ^^;;

소켓이 오면 sock 구조체가 생기고,

sk_buff 구조체가 그 밑에 연결되어

소켓의 내용을 저장하는 것으로 알고 있습니다.
(다소 틀리더라도.. ^^;;)

어쨋든 sk_buff가 패킷이 들어오면 생기는 건데

sk_buff에서 source IP와 dest IP를 확인 할 수 있어도

port를 확인 할 수가 없더군요..

어떻게 port를 확인 할 수 없을까요?

sk_buff구조체에서 sock 구조체를 가리키고 있는 sk 포인터 변수를 사용하려고

하였지만 아직 연결되 되지 않은 상태였는지 sk변수값이 NULL이더군요...

그리고 port는 tcp 계층맞죠? 그중에서도 ip위에 있는...

리눅스소스를 뒤적뒤적 거려도 안되길래 혹시 알고 계신분 있나 해서 올립니다. ^^;;

답변 부탁드릴께요~ ^_^)/

pastime의 이미지

sk_buff 구조체는 각 계층별 헤더 정보를 쉽게 파악할 수 있도록
각각에 해당하는 포인터 값을 가지고 있습니다.
tcp 포트에 대한 정보를 보기 위해서는 skb->h.th 가 가리키는
source 나 dest 값을 읽어보면 됩니다.

하지만 이것은 순차적으로 각 계층별 헤더를 분석하여
tcp 계층까지 올라온 경우에 해당하는 것으로
ip 계층에서 이 값을 확인하고 싶은 경우에는 약간의 꽁수?가 필요합니다.

ip_local_deliver_finish() 함수의 첫부분에서
__skb_pull() 을 호출한 뒤
skb->data 를 전송계층의 헤더로 설정하는 부분을 잘 살펴보기 바랍니다.

왕초보타자의 이미지

int protocol = skb->nh.iph->protocol;
int hash = protocol & (MAX_INET_PROTOS - 1);
struct sock *port_sk = raw_v4_htable[hash];

이렇게 한후 port_sk구조체 (변수이름은 제가 쫌 변경..)에 있는
port를 읽어 오면 될듯도 싶은데
모듈로 만드니깐

unresolved symbol... ㅠㅁㅠ

raw_v4_htable 가 export가 안됬나 봐요...

커널컴파일은 하면 안되고...

지금 진행시킬려고 하는게 모듈로 만들어서 커널의 변경없이

작업 가능하게 하는게 목표라... 어떻게 raw_v4_htable을 접근 할 수 있는
방법이 없을까요.. 훔...

지금 하고 있는 작업은 netfilter가지고 패킷필터링 하는거랍니다 ^^;;

ip가지고 하는건 다 했는데 port단위로 필터링 할려니깐 쫌... 걸리는게 많네요

조금이나마 도움주셨으면 감사히 생각하겠습니다~ ㅎㅎ

휴휴~~~

marten의 이미지

#include <linux/tcp.h>

struct tcphdr tcph, *tcph_p;
tcph_p = skb_header_pointer(skb, skb->nh.iph->ihl*4, sizeof(tcph), &tcph);

source port ==> ntohs(tcph_p->source)
destination port ==> ntohs(tcph_p->dest)

커널 2.6에서라면 위 코드처럼 하시면 될 겁니다.

왕초보타자의 이미지

ㅜ.ㅜ 안타깝게 kernel버전 2.4.20이에요...

흑...

지금은 패킷이 어떻게 sock 구조체에 연결되나 보는중.. ^^;;

수업들으랴... 이거 하랴.. 에효에효~

휴휴~~~

albamc의 이미지

정확히 어떤 작업을 하시려고 하는지는 모르겠습니다만...

커널 버젼 2.4대이거나 2.6대 이거나 ...

현재 위치에서 skb->h.th를 읽으시던지 ...

skb->h.th가 아직 set되어 있지 않으면

현재 skb->data에서 TCP header 정보가 있는 곳 까지를

직접 계산하셔서 TCP header 정보를 읽어오시면 될것 같습니다.

예를 들면 ... IP layer에서는 skb->data가
ip header를 가리키고 있으므로

struct iphdr* iph;
struct tcphdr* tcph;

iph = (struct iphdr*)skb->data;
tcph = (struct tcphdr*)(skb->data+(iph->ihl*4));

하시면 될듯 합니다.

^^*

왕초보타자의 이미지

알려 주신 대로 해 보겠습니다 ㅎㅎ

sk를 통해서 sock구조체에 있는 dport를 읽었더니
(단순히 printk("port : %u", skb->sk->dport); )

kernel panic... 그냥 읽기만 했을 뿐인데...

skb->h.th 도 읽어 봤었는데 진짜 포트번호인지 아닌지 의심되서 ㅎㅎ

이것도 커널패닉되서 다운됬었던가...

해보구... 잘 안되면 skb->data를 이용해서 ip header를 직접 봐야 하겠네요

여러 방법 알려주셔서 감사해요~ ㅎㅎ 제발 되어라...

그리고 ntohs <-- 이것을 쓰면 unresolved symbol이라고 하는데 해결방법 알고 있으신분... 계신가요? ^_^)? 이거 하나때문에 커널컴파일을 다시 할 수도 없고... 쩝...

휴휴~~~

pastime의 이미지

ip 계층에서는 아직 sk_buff 에 해당하는 sock 구조체가 설정되어 있지 않기 때문에
skb->sk->dport 와 같은 식으로 접근하면 잘못된 메모리 영역을 참조하게 됩니다.
그래서 skb->data 에 ip 헤더 만큼을 더해서 직접 tcp 헤더 정보를 참조하는 것이 좋습니다.

그리고 ntohs 는 아마도 매크로로 정의되어 있을텐데
관련 헤더 파일을 한번 체크해 보시고
그래도 안되면 어차피 network byte-order (big-endian) 의 2바이트 (short) 정보를
host byte-order (x86 이라면 little-endian) 으로 바꾸는 것이니
(Network to Host, Short)
직접 매크로를 정의하셔도 됩니다.

익명 사용자의 이미지

주소값을 계산해서 접근하셔야지 바로 접근하면 뻗어요.

albamc의 이미지

valid 하지 않은 pointer의 값을 찍어 보려고 하면 당연히 죽습니다.

printk(KERN_INFO "%d", *ptr);

하시기 전에 먼저

printk(KERN_INFO "%p", ptr);

로 pointer가 valid 한지 검사해 보세요.

^^*

댓글 달기

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