LINUX.ORG.RU

Создать APR запрос

 , , ,


0

1

Всем привет, признаюсь сразу, я немного туповат, поэтому не кидайте ссаными тряпками :)

Вопрос значит в следующем, пишу небольшой фаервол, который работает в юзерспейсе (dpdk) и все бы хорошо, но у меня появилась небольшая проблемка при наполнении ARP кеша (не хотелось бы с ним заморачиваться) и вариант который видится в лоб это завернуть пакет который пришел ко мне(я проверил если его мака у меня нет в кеше) в ядро, и пусть она само его разбирает делает всю грязную работу, но хотелось бы какое-то решение изящное, например ко мне приходит пакет я понимаю что мне надо посмотреть кеш, смотрю если там нет пары то я каким то образом пинаю ядро и говорю сделай мне запрос широковещательный для IP который был в пакете, дак вот собсна вопрос как мне пнуть ядро и сказать ему чтобы оно сделало то что мне надо не передавая пакет ему, думал ebpf прикрутить но почитал оно вроде как только по событию может реагировать, помогите в какую сторону копать или книжку подскажите, думал модуль ядра писать, но я в них не силен, не знаю можно такое сделать что я хочу, вообщем нужна помощь, памагите :)

Ответ на: комментарий от cobold

да, все верно, если интерфейс по управлением dpdk, то ядро им не управляет, у меня есть интерфейс, который проброшен в ядро, то есть ядро пошлет в него, а я в dpdk просто транзитом выпущу на ружу, проблема вся заключается в том что я знаю как пакет завернуть на ядро, но я хотел бы этого избежать, и просто хочу сказать ядру, друг вот тебе IP по которому надо узнать mac, вот мой IP вот мой mac, сделай бродкаст запрос в сеть чтобы узнать мак, и ядро само создает запрос, выполняет все проверки, делает наполнение паекта, и всякую другую работу которую мне не хотелось бы описывать, вот…

roma55592
() автор топика
Ответ на: комментарий от anonymous

я не хотел бы в ядро передавать пакет никак не полностью не указатель на него, я хочу просто сказать, ядро вот

send_brod_arp(void* need_ip, ssize size_need_ip, void* my_ip, ssize size_my_ip, void* my_mac, ssize size_my_mac)

и в результате ядро само все сделает, а потом я просто буду у себя принимать arp ответ

roma55592
() автор топика

Можешь через netlink сокет кидать сообщение в ядро, и в модуле делать запрос собственно. Но это надо таки дописать модуль ядра (можно попатчить тот же kni)

false ★★★★★
()
Последнее исправление: false (всего исправлений: 1)
Ответ на: комментарий от firkax

в том то и вопрос, я хочу сказать ядру шли и оно само все делает и при этом будет думать что я его не заставлял :) как будто само захотело, я не хочу вообще заморачиваться с arp, потому что по мимо прав, обычно еще выключают прием arp если не посылал запрос, то есть, есть риск если самому послать(будь то программно или через утилиту arp) то может не получится принять, и права нужны, вот… я понимаю что все что вы предлагаете это рабочие варианты, но это решение в лоб, хотелось бы что то более изящного, извините если террорезирую :)

roma55592
() автор топика
Ответ на: комментарий от roma55592

Не вижу чего изящного в спуфинге пакетов вместо штатной команды. А ещё непонятно зачем это нужно. Система и так сама сделает arp запрос когда ей потребуются эти данные, а пока они не потребовались - они и не нужны.

firkax ★★★★★
()
Ответ на: комментарий от false

запрос в модуле, я об этом думал, что мне надо дернуть чтобы запустить каскад операций которые приведут к тому что отправится arp пакет? я просто я коде ядра не шарю

или ты имел ввиду в модуле самому пакет собирать и отправлять?

roma55592
() автор топика
Ответ на: комментарий от firkax

нюанс в том что все пакеты обрабатываются в dpdk (пользовательском режиме), до ядра они не доходят, это для того что бы увеличить производительность, поэтому arp запросов создано не будет, нужно их создавать самому, но при этом варианте появляются права суперпользователя, плюс если все завернуть входящий трафик на ядро что бы оно само принимало arp то оно может не принять потому что может быть отключен прием пакетов если не отправляло ядро запрос, сейчас это видется так, надо как то заставить ядро испустить пакет широковещательный arp, когда у меня в юзерспейсе появился пакет с маком которого нет в arp кеше, потом принять arp если это нужный отправить в ядро, потом синхронизировать кеш в ядре с кешем в юзерспейсе через например netlink, таким образом я защищаюсь от ddos и arp спуфинга потому что производительность юзерспейса больше чем ядра, и ядро защищено так как нет к нему прямого доступа

roma55592
() автор топика
Ответ на: комментарий от roma55592

Ты вместо того чтобы написать реализацию на 1 страницу кода хочешь делать какие-то костыли и уже на старте из-за них сталкиваешься с проблемами.

firkax ★★★★★
()
Ответ на: комментарий от roma55592

я не хотел бы в ядро передавать пакет

А напрасно. ARP - это только первое, с чем ты столкнулся. Если планируешь поддерживать IPv6, тебе нужно будет обрабатывать NDP. Потом ты поймешь, что неплохо бы поддерживать LLDP. Потом поймешь, что хорошо бы иметь еще Slow Protocols(LACP), VRRP/CARP и т.п.

Проще всего это делать как раз с помощью KNI. Ты создаешь виртуальный интерфейс, это будет как бы копия-помощник твоего физического. Выставляешь на нем такие параметры (адрес и т.п.), которые ты хотел бы чтобы были на физическом.

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

anonymous
()
Ответ на: комментарий от anonymous

А напрасно. ARP - это только первое, с чем ты столкнулся. Если планируешь поддерживать IPv6, тебе нужно будет обрабатывать NDP. Потом ты поймешь, что неплохо бы поддерживать LLDP. Потом поймешь, что хорошо бы иметь еще Slow Protocols(LACP), VRRP/CARP и т.п.

вот это дельное замечание

Проще всего это делать как раз с помощью KNI. Ты создаешь виртуальный интерфейс, это будет как бы копия-помощник твоего физического. Выставляешь на нем такие параметры (адрес и т.п.), которые ты хотел бы чтобы были на физическом. После этого трафик (служебный), который ты хочешь обрабатывать ядром, просто посылаешь на этот виртуальный интерфейс. А все что выходит из него, посылаешь на физический. Все

такой вариант прорабатываю, но это как запасной вариант

все таки хотелось бы скрестить ежа с ужом :)

roma55592
() автор топика