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