tcp/ip에 대해서 질문 있습니다.

powerson의 이미지

현재 bridge mode로 설정한 상태이고, netif_receive_skb에서 현재 패킷 처리를 하고 있습니다. 이 때 제가 원하는 패킷들에 대해서는 connect terminate 시키고 싶은데요. 다음 코드로 해서 fin 설정을 해주면 바로 종료되지 않고, timeout 걸리면서 retransmission이 이루어지고 있습니다.
아래 코드는 보내온 source 컴퓨터에게 fin 설정을 하고, 그 외에 헤더 정보를 바꿔서 보내도록 socket buffer를 수정한 것입니다.

void connect_reject( struct sk_buff *skb )
{
    struct ethhdr   *eth;
    struct tcphdr   *tcph;
    struct iphdr    *iph;
    unsigned char   temp[ETH_ALEN];
    __u16           temp_port;
    __u32           temp_addr;

    eth = eth_hdr( skb );
    memcpy( temp, eth->h_dest, sizeof(ETH_ALEN) );
    memcpy( eth->h_dest, eth->h_source, sizeof(ETH_ALEN) );
    memcpy( eth->h_source, temp, sizeof(ETH_ALEN) );

    iph = (struct iphdr *) skb->data;
    temp_addr = iph->saddr;
    iph->saddr = iph->daddr;
    iph->daddr = temp_addr;

    tcph = (struct tcphdr *)(((unsigned char *)iph) + (iph->ihl<<2));
    temp_port = tcph->source;
    tcph->source =  tcph->dest;
    tcph->dest = temp_port;

    tcph->ack_seq = tcph->seq;
    tcph->fin = 1;

    printk( "DEST IP : %u.%u.%u.%u SOURCE IP : %u.%u.%u.%u\n", NIPQUAD(skb->nh.iph->daddr), NIPQUAD(skb->nh.iph->saddr) );
}

혹시 아시는 분 답변 좀 부탁드립니다. ^^

kuaaan의 이미지

1. netif_receive_skb 란게 뭔지는 잘 모르겠는데요...
저 코드는... 시퀀스 넘버가 안맞을것 같습니다.
tcph->ack_seq = tcph->seq;
이게 아니라

tcph->seq = tcph->ack_seq; 
tcph->ack_seq = htonl(ntohl(수신된 tcph의 seq) + 수신된 data size);

이런식이 되어야 할것 같은데요...
ethereal같은 걸로 패킷을 분석해보세요.
시퀀스넘버나 Ack넘버까지 알아서 분석하니... 편하죠.

2. 세션을 terminate 시키고 싶으시다면... rst 을 보내는게 더 쉽지 않나요?

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

powerson의 이미지

우선 답변 주신것에 대해서 감사합니다.
현재 테스트를 해본 결과 마찬가지네요.. ㅠㅠ

해당 함수의 argument는 수신된 socket buffer입니다. 제가 질문시에 안 적어놓았군요.. ㅠㅠ
netif_receive_skb는 수신된 socket buffer에 대한 처리를 하는 커널 함수입니다. 현재 수신된 buffer의 header값을 port, ip, mac 값을 수정하고, fin 설정을 하도록 한 것입니다. 현재 seq가 사실 저도 제일 염려하는 부분인데, 해당 코드로 처리한 이유는 수신된 seq값이기 때문에 그걸 바로 ack_seq로 보내면 되는게 아니가 생각하고 저렇게 처리한 것입니다. 그럼 답변 부탁드립니다. 좋은 하루 보내세요~

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kuaaan의 이미지

powerson wrote:
현재 seq가 사실 저도 제일 염려하는 부분인데, 해당 코드로 처리한 이유는 수신된 seq값이기 때문에 그걸 바로 ack_seq로 보내면 되는게 아니가 생각하고 저렇게 처리한 것입니다.

아마.. 반대로 생각하시면 될겁니다.

ACK란건... 몇번까지 받았다는 확인인 동시에 다음에 니가 몇번부터 보내면 된다라는걸 알려주는 의미가 있습니다.
그러니, 회신하는 seq에는 수신된 ack_seq를 그대로 사용하면 되겠죠.

하지만 회신하는 ack값에는 '다음번에 당신이 보내야 할 seq'를 계산해서 넣어줘야 합니다. 아마도... '수신된 seq + Data의 Byte 수' 정도 되겠지요.

(그런데... ethernet hdr는 세팅 안해줘도 되나요?)

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

익명 사용자의 이미지

재전송이 반복되고, ....

이러한 경우는 브리지에서 보낸(만들어서) 패킷의 seq가 맞지 않아서, 원격지에서는 이를 이상 패킷으로 감지했다라는 시나리오에 100원 걸겠습니다.
RST나 FIN등의 플래그 문제가 아닌 TCP Sequence 문제일 것이라는 얘기입니다.

kuaaan의 이미지

Anonymous wrote:
재전송이 반복되고, ....

이러한 경우는 브리지에서 보낸(만들어서) 패킷의 seq가 맞지 않아서, 원격지에서는 이를 이상 패킷으로 감지했다라는 시나리오에 100원 걸겠습니다.
RST나 FIN등의 플래그 문제가 아닌 TCP Sequence 문제일 것이라는 얘기입니다.

당연한 말씀입니다.
브릿지에서 만들어서 보낸 FIN 패킷의 TCP Sequence 가 맞지 않아 생기는 문제라는 얘기지요. -_-;;

참고로... RST의 경우에는 seq 넘버가 맞지 않아도 세션을 끊을수 있습니다. seq넘버가 도로 작아지지만 않는다면요.
(게다가 FIN은 HandShake 과정을 거쳐야 하니 더 불편하기도 합니다.)

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

익명 사용자의 이미지

* 해당 세션의 패킷들을 ... 그냥 조용히 버리는 것은 어떻습니까? 당하는 쪽이야 열받겠지만 말이지요.(사실 버릴만 하니까 버리겠지요? 아마도?)

powerson의 이미지

kuaaan wrote:
참고로... RST의 경우에는 seq 넘버가 맞지 않아도 세션을 끊을수 있습니다. seq넘버가 도로 작아지지만 않는다면요.
(게다가 FIN은 HandShake 과정을 거쳐야 하니 더 불편하기도 합니다.)

rst로도 테스트를 해보았지만, 여전히 재전송이 이루어지곤 있습니다. 열심히 삽질해봐야겠지요. ^^ kuaaan님이 도와주셔서 방향은 알거 같습니다. 감사합니다.

손님 wrote:
해당 세션의 패킷들을 ... 그냥 조용히 버리는 것은 어떻습니까? 당하는 쪽이야 열받겠지만 말이지요.(사실 버릴만 하니까 버리겠지요? 아마도?)

물론 그냥 버려도 되지만, 재전송이 되는걸 막아볼려고 하는것이라서요. ^^

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

powerson의 이미지

kuaaan wrote:
(그런데... ethernet hdr는 세팅 안해줘도 되나요?)

Quote:
eth = eth_hdr( skb );
memcpy( temp, eth->h_dest, sizeof(ETH_ALEN) );
memcpy( eth->h_dest, eth->h_source, sizeof(ETH_ALEN) );
memcpy( eth->h_source, temp, sizeof(ETH_ALEN) );

이걸로써 hdr 값은 셋팅 된거 아닌가요? 다른걸 더 해줘야 하는게 있는건가요?

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kuaaan의 이미지

powerson wrote:
kuaaan wrote:
(그런데... ethernet hdr는 세팅 안해줘도 되나요?)

Quote:
eth = eth_hdr( skb );
memcpy( temp, eth->h_dest, sizeof(ETH_ALEN) );
memcpy( eth->h_dest, eth->h_source, sizeof(ETH_ALEN) );
memcpy( eth->h_source, temp, sizeof(ETH_ALEN) );

이걸로써 hdr 값은 셋팅 된거 아닌가요? 다른걸 더 해줘야 하는게 있는건가요?

아.. 제가 잘못봤네요. 죄송여.. ^^

tcpdump 뜬걸 올려봐주실래요?

----------------------------------------------
한번뿐인 인생....
미친듯이 살아보자!
----------------------------------------------

댓글 달기

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