2014-04-16 2 views
2

iptables/netfilter를 사용하여 패킷을 복사하고 변경하고 을 모두으로 응용 프로그램에 전달하는 방법이 있는지 궁금합니다.패킷을 복사하는 iptables netfilter

기본적으로 흐름에서 패킷을 캡처하여 일부 대기열로 리디렉션하고 싶습니다. 그런 다음 복사하여이를 (C에서이 부분을 수행하는 방법을 알고 있음) 복사하고 싶습니다. 복사 된 버전의 내용을 변경하고 해당 "수정 된"패킷에 대한 평결을 발행하십시오.

기본적으로 나는 수정되지 않은 버전과 수정 된 버전으로 받길 원합니다.

이것이 가능합니까? 도움을 미리 요청 해 주셔서 감사합니다.

답변

1

당신의 임무는 libipq 라이브러리로 얻을 수 있습니다. 자습서는 사용자 공간에서 패킷을 수정하는 & 복사에 중점을 두었습니다.

http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.205.2605&rep=rep1&type=pdf

당신은 그것을 작동하는 C를 알아야합니다. 파이썬 기반 패킷 조작 도구 인 "Scapy"를 사용할 수도 있습니다.

#include <linux/netfilter.h> 
#include <libipq.h> 

/* 
* Used to open packet ; Insert a iptables rule to get packet here 
* iptables -I 1 [INPUT|OUTPUT|FORWARD] <packet header match> -j QUEUE 
*/ 

#include <linux/netfilter.h> 
#include <libipq.h> 
#include <stdio.h> 
#define BUFSIZE 2048 
static void die(struct ipq_handle *h) 
{  
    ipq_destroy_handle(h); 
    exit(1); 
} 
int main(int argc, char **argv) 
{ 
    int status; 
    unsigned char buf[BUFSIZE]; 
    struct ipq_handle *h; 
     h = ipq_create_handle(0, NFPROTO_IPV4); 
    if (!h) 
     die(h); 
      status = ipq_set_mode(h, IPQ_COPY_PACKET, BUFSIZE); 
    if (status < 0) 
     die(h); 
    do{ 
     status = ipq_read(h, buf, BUFSIZE, 0); 
     if (status < 0) 
      die(h); 
     if (ipq_message_type(buf) == IPQM_PACKET){ 
      ipq_packet_msg_t *m = ipq_get_packet(buf); 
      status = ipq_set_verdict(h, m->packet_id, NF_ACCEPT, 0, NULL);   

     }      

    } while (1); 
     ipq_destroy_handle(h); 
    return 0; 
} 
관련 문제