진짜 힘드네요. TCP를 끊는 것이 WindowsXP 서비스팩2에서는 안
글쓴이: alone / 작성시간: 화, 2004/11/30 - 6:15오후
회사에서 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가 틀려서 그런거 같은디.. 쩝..
Forums:
댓글 달기