진짜 힘드네요. TCP를 끊는 것이 WindowsXP 서비스팩2에서는 안

alone의 이미지

회사에서 iptables의 PREROUTING과 MASQUERADE를 이용해서
리눅스 서버의 특정 포트로 들어오는 것을 다른 회사의 서버의 특정포트의
보냅니다. 서비스 이름을 말씀드리기는 머하구염..

그런데 접속한 사용자를 끊는 방법이 없더라구염.. PREROUTING을 제거해도
사용자는 계속 접속을 하게 됩니다.

과금을 해야 하기 때문에 사용자 과금이 종료되면 사용자를 종료 해야 합니다.
그래서 rst tcp 패킷을 을 만들어서 사용자의 접속을 강제로 종료 시켰습니다.

지금까지는 무리없이 잘 사용했는데 windows 서비스팩2는 rst 패킷을 만들어 보내도 종료가 되지 않습니다. 내공이 모잘라서 잘 안되는군여

접속을 종료하는 루틴은 있으니깐.. 내공이 높으신 분들이 좀 봐주시면 좋겠습니다.

좋은 아이디어 주심 감사하겠습니다.

int cut_tcp (struct ethhdr* eth,struct tcphdr *tcp, struct iphdr *ip, char* Addr, int clientport,int serverport,int Flag,int& Ret)
{
    char logstring [256];
    char aux [256];


    struct in_addr  cut_add;
    struct in_addr  cut_serveradd;
    struct in_addr  add;
    struct in_addr  temp;
    int cut_port;
    int cut_serverport;
    static int tempid=  0;

    struct tcp_spec ts;
    static int Complete =   0;

    memset (aux, '\0', sizeof (aux));
    memset (logstring, '\0', sizeof (logstring));
    cut_port    =   0;
    cut_add.s_addr  =   inet_addr(Addr);
    cut_port    =   htons(clientport);
    cut_serverport  =   htons(serverport);
//  printf ("TCP: %s: \n", inet_ntoa (add));

    add.s_addr = ip->saddr;
    if((add.s_addr) != (cut_add.s_addr)){
        return 0;
    }else{
        if(cut_port != tcp->source){
        //  printf("SourcePort[%d]\n",ntohs(tcp->source));
            return 0;
        }else{
        //  printf("DestPort[%d]\n",ntohs(tcp->dest));
            if(cut_serverport   != tcp->dest){
                return 0;
            }else{
            }
        }

    }
#if 1
    ts.saddr = ip->daddr;
    ts.daddr = ip->saddr;
    ts.sport = tcp->dest;
    ts.dport = tcp->source;
    ts.src_mac = (char*)eth->h_dest;
    ts.dst_mac = (char*)eth->h_source;
    ts.window = tcp->window ? tcp->window : htons(242);
    ts.id = ip->id;
    ts.ack = 1;
    ts.rst = 1;
    ts.psh = 0;
    ts.data = NULL;
    ts.data_len = 0;
    ts.ack_seq = htonl(ntohl(tcp->seq)+TCP_DATA_LENGTH(ip,tcp)+1);
    ts.seq = htonl(ntohl(tcp->ack_seq)+1);
    send_tcp_packet(s,&ts);
    if(Flag ==  0){
    //  printf("1Ret [%d]\n",Ret);
        if(Ret  ==  2){
            Ret =   10;
        }else{
            Ret =   1;
        }

    }else if(Flag   ==  1){
    //  printf("2Ret [%d]\n",Ret);
        if(Ret  ==  1){
            Ret =   10;
        }else{
            Ret =   2;
        }

    }
return (0);
}

send_tcp_packet(s,&ts); 가 실제 패킷을 보내는 것입니다.

아마 ack_seq나 seq가 틀려서 그런거 같은디.. 쩝..

댓글 달기

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