2014-04-16 3 views
2

Je me demandais s'il y a un moyen de copier un paquet à l'aide iptables/netfilter, changer et de livrer les deux à l'application. Fondamentalement, je veux capturer un paquet à partir d'un flux et le rediriger vers une file d'attente, puis je veux le copier, émettre le verdict pour cela (je sais comment faire cette partie en C), puis je dois changer quelque chose dans la version copiée, et émettre le verdict pour ce paquet "modifié" aussi.iptables netfilter copie du paquet

Fondamentalement, je veux que l'application reçoive à la fois la version non modifiée et la version modifiée.

Est-ce possible? Merci d'avance pour toute aide.

Répondre

1

Votre mission peut être accomplie avec la librairie libipq. Le tutoriel en suivant comme se concentrer sur la copie & modifier un paquet dans l'espace utilisateur.

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

Vous devez savoir C pour travailler. Alternativement "Scapy" - un outil de maipulation de paquets basé sur python peut être utilisé.

#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; 
} 
Questions connexes