linux netfilter передает содержимое пакета в приложение user space socket

StackOverflow https://stackoverflow.com/questions/1288906

Вопрос

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

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

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

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

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

Большое вам спасибо.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top