iptables netfilter копиране на пакета

Чудех се дали има начин да копирам пакет с помощта на iptables/netfilter, да го променя и да доставя и двете на приложението.

По принцип искам да уловя пакет от поток и да го пренасоча към някаква опашка, след което искам да го копирам, да издам присъдата за него (знам как да направя тази част в C), след което трябва да променя нещо в копирана версия, И издайте присъдата и за този "модифициран" пакет.

По принцип искам приложението да получава както немодифицираната и модифицираната версия.

Възможно ли е това? Благодаря предварително за всяка помощ.


person user2662165    schedule 16.04.2014    source източник


Отговори (1)


Вашата мисия може да бъде постигната с библиотеката libipq. Следващият урок се фокусира върху копирането и модифицирането на пакет в потребителското пространство.

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

Трябва да знаете C, за да работите върху него. Като алтернатива може да се използва "Scapy" - базиран на Python инструмент за обработка на пакети.

#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;
}
person Gopi    schedule 19.05.2014