2009-08-17 1 views
2

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

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

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

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

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

спасибо.

+0

Вы, кажется, просто тиражирование NFQUEUE + libnetfilter_queue инфраструктуры. –

ответ

1

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

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

Посмотрите на драйверы устройств Linux, 3rd Edition.

1

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

3

My way of this: Создайте модуль ядра, чтобы подключиться к сетевой активности. Затем используйте Netlink, который может разговаривать с пользовательским пространством из ядра для передачи данных IPC.

2

Вариант 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 
+0

Полезная ссылка для netlink api http://smacked.org/docs/netlink.pdf –

Смежные вопросы