linux netfilter передает содержимое пакета в приложение user space socket
-
18-09-2019 - |
Вопрос
Я хочу написать 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_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 () вернется, у вас будут данные для чтения.Просто убедитесь, что вы прочитали все это, а не просто предполагаете, что объем данных равен одному пакету.