номер очереди сетевого фильтра

Я пишу какой-то модуль ядра с хуком netfilter. Функция крючка:

uint main_hook(uint hooknum,
                  struct sk_buff *skb,
                  const struct net_device *in,
                  const struct net_device *out,
                  int (*okfn)(struct sk_buff *)  )
{
    struct iphdr *ip;
    struct udphdr *udp;
    if (skb->protocol == htons(ETH_P_IP)){
        ip = (struct iphdr *)skb->data;//skb_network_header(skb);
        if (ip->version == 4 && ip->protocol == IPPROTO_UDP){
            udp = (struct udphdr *)(skb->data + sizeof(struct iphdr));
            printk("[udp-catch] packet from %d to %d\n", ntohs(udp->source), ntohs(udp->dest));
            return NF_QUEUE;
        }
    }
    return NF_ACCEPT;
}

Можно ли указать номер очереди? И если нет, то как я могу найти этот номер?


person someuser    schedule 13.03.2013    source источник
comment
как вы имеете в виду номер очереди? Насколько я знаю, у вас есть 5 конкретных очередей, которые предназначены для определенных точек в потоке пакетов.   -  person Fred    schedule 13.03.2013
comment
Прототип функции из libnetfilter_queue: struct nfq_q_handle * nfq_create_queue (struct nfq_handle * h, u_int16_t num, nfq_callback * cb, void * data) Цитата из netfilter.org: Создает новый дескриптор очереди и возвращает его. Новая очередь идентифицируется числом, а обратный вызов, указанный cb, будет вызываться для каждого поставленного в очередь пакета. Аргумент данных будет передан обратному вызову без изменений. Если запись в очереди с идентификатором num уже существует, эта функция вернет ошибку, а существующая запись не изменится.   -  person someuser    schedule 13.03.2013
comment
Можете ли вы объяснить, зачем нам нужен этот идентификатор u_int16?   -  person someuser    schedule 13.03.2013
comment
Также.   -  person someuser    schedule 13.03.2013


Ответы (1)


libnetfilter_queue и таблица ip

Документация по функциям с веб-страницы libnetfilter_queue:

create_queue()

При создании вашей очереди значение по умолчанию num равно 0.

Если у вас есть две очереди, работающие на одном компьютере, скажем, одна для отправки IP-пакетов, а другая для приема, вам нужно создать две очереди с разными номерами:

отправить:

qh = nfq_create_queue(h,  0, &cb, NULL);

получить:

qh = nfq_create_queue(h,  1, &cb, NULL);

Для корректной фильтрации IP-таблиц необходимо указать номер очереди netfilter:

отправитель:

sudo iptables -A OUTPUT -p all -d <dest ip> -j NFQUEUE --queue-num 0

получатель:

sudo iptables -A INPUT -p all -s <src ip> -d <dest ip> -j NFQUEUE --queue-num 1

Вы также можете проверить руководство по iptables и найти NFQUEUE.

Надеюсь, это немного поможет.

person bharald    schedule 04.09.2013
comment
При создании вашей очереди значение по умолчанию для num равно 0 - когда я отправляю пакет из пространства ядра в nf-queue, ядро ​​также отправляет этот пакет в очередь с num 0. Я хочу заставить ядро ​​отправлять пакеты в другую очередь (с другим номером). - person someuser; 05.09.2013
comment
Я не совсем понимаю вашу проблему. Сколько очередей вы используете на одной машине? Я не эксперт, но я думаю, что если вы хотите делать разные вещи с одним и тем же iptable, вам нужно создать разные очереди, как в моем примере выше с одной отправкой и одной получением. - person bharald; 03.10.2013