Модуль ядра Linux

Можно ли использовать netfilter для перехвата всех пакетов Ethernet?

Я могу просто получить пакет с ipv4 или ipv6.

Редактировать:

Приведенный выше код - это мой модуль ядра. Я хочу, чтобы все пакеты, поступающие на один интерфейс Ethernet, перенаправлялись на другой интерфейс. Этот модуль просто печатает имя устройства, на которое пришел пакет (только для тестирования). С помощью этого крючка я просто получаю пакеты, тип которых - ipv4, но я хочу получить все типы.

Я искал в Интернете, но не нашел, как настроить свой хук, чтобы получать все пакеты, которые обходят интерфейс Ethernet.

С уважением

статическая структура nf_hook_ops nfho;

int hook_func (структура sk_buff * skb)

{struct ethhdr * eth;

printk ("Устройство:% s \ n, skb-> dev-> name);

}

int init_module () {
printk ("Модуль перехвата в сети! \ n");

nfho.hook = (nf_hookfn *) hook_func;

nfho.hooknum = NF_IP_PRE_ROUTING;
nfho.pf = PF_INET; nfho.priority = NF_IP_PRI_FIRST;

nf_register_hook (& nfho);

возврат 0; }

/ * Процедура очистки * / void cleanup_module () {

printk ("Снова и снова! \ n"); nf_unregister_hook (& nfho); }


person Ricardo    schedule 27.03.2012    source источник
comment
Краткий ответ на единственный вопрос, который вы задали, - да, но если это весь ваш вопрос, то он наиболее уместен (неправильный сайт и общая ссылка). Если это не весь ваш вопрос, вам нужно быть более конкретным (и вопрос по-прежнему актуален, пока вы это не сделаете).   -  person dmckee --- ex-moderator kitten    schedule 27.03.2012
comment
Перередактирую свой пост. Если бы вы могли мне помочь, я буду признателен. С наилучшими пожеланиями!   -  person Ricardo    schedule 27.03.2012
comment
Нет, для этого нельзя использовать netfilter. Вы должны использовать bridge-netfilter.   -  person ninjalj    schedule 28.03.2012
comment
Хммм. Как я могу использовать bridge-netfilter? Я пытаюсь определить крючок с помощью моста, но не работает.   -  person Ricardo    schedule 28.03.2012


Ответы (1)


конечно, если я все понимаю, вы просто готовы принять все проверенные эфиром пакеты и передать их другому интерфейсу. В этом случае просто включите файл ядра:

#include <linux/if_ether.h>

вы получите заголовок:

struct ethhdr *hdr = eth_hdr(skb);
// *skb is a ptr !!

и убедитесь, что эфир действителен, проверив некоторые значения из структуры ethhdr. затем просто отправляется локальным хостом или модифицирует адреса, если вы хотите, чтобы другой интерфейс принимал его, как это были его пакеты.

person Gal Niv    schedule 09.04.2017