linux netfilter передает содержимое пакета в приложение сокета пользовательского пространства

Я хочу написать Linux 2.6 netfilter module, который может проверять информацию о входящем IP пакете, такую ​​как IP-адрес назначения, IP-адрес источника. После этого передайте эту информацию в приложение user space, которое (т.е. приложение Socket) обработает эту информацию, как только пакет достигнет HOOK.

Я хочу попробовать два способа:

1 . Внутри модуля netfilter создайте строку структуры fifo, каждый раз, когда пакет достигает hook, поместите информацию о пакете в fifo. и с помощью /proc/example файловой системы. каждый раз, когда приложение пользовательского пространства читает файл /proc/example, будет получать информацию о пакете из заголовка FIFO.

Я новичок в программе kernel, эта программа несколько раз вылетала из моего ядра. -_-! Интересно, возможен ли этот путь?

2 . Внутри модуля netfilter создайте символьное устройство, приложение пользовательского пространства считывает информацию о пакетах с этого символьного устройства. Но я до сих пор не знаю, как убедиться, что пакет получен как можно скорее, есть ли какой-либо способ, когда пакет достигает ловушки сетевого фильтра, ядро ​​​​отправляет некоторый сигнал в информационное приложение пользовательского пространства, затем приложение пользовательского пространства приходит к выбрать информацию о пакете?

Спасибо большое.


person Community    schedule 17.08.2009    source источник
comment
Похоже, вы просто копируете инфраструктуру NFQUEUE+libnetfilter_queue.   -  person jørgensen    schedule 18.01.2012


Ответы (4)


Что вы имеете в виду под как можно скорее? Есть ли у вас какие-то реальные требования к жесткому/мягкому реальному времени?

Если вы выберете вариант 2, вы сможете довольно быстро получать новые данные, открывая неблокирующее символьное устройство и выбирая() для чтения fd. Я сделал что-то подобное с сокетом уровня ядра, где данные сокета были представлены процессу пользовательского уровня через символьный драйвер. Я видел очень небольшую задержку, пока своевременно обслуживал сокет. Драйвер использовался в среде с некоторыми требованиями к программному обеспечению реального времени, и у нас не было никаких проблем с выполнением этих требований с помощью заурядных средств ядра.

Взгляните на драйверы устройств Linux, 3-е издание.

person Rob Jones    schedule 17.08.2009

Мой способ сделать это: создать модуль ядра, чтобы подключиться к вашей сетевой активности. Затем используйте Netlink, который может обращаться к пользовательскому пространству из ядра для передачи данных IPC.

person Wei    schedule 06.10.2011

Вариант 1 возможен и работоспособен, в чем проблема? Но я обычно использую для связи между user-space и kernel space использование netlink

netlink_kernel_create

netlink_kernel_release

nl_sk = netlink_kernel_create(&init_net, 17, 0, recv_cmd, NULL, THIS_MODULE);

netlink_kernel_release(nl_sk);

netlink_unicast
person Ibrar Ahmed    schedule 28.02.2013

Я не уверен в первом методе, но используя второй, ваше приложение пользовательского пространства может использовать вызов select() с устройством char в качестве единственной цели - как только select() вернется, у вас будут данные для чтения . Просто обязательно прочитайте все это, а не просто предполагайте ценность одного пакета данных.

person Harper Shelby    schedule 17.08.2009