LINUX.ORG.RU

Перехват RTNETLINK сообщений от iproute2

 , ,


0

1

Предположим у меня есть три модуля ядра - дженерный модуль бриджа линукс, rtnetlink модуль, и мой модуль - mymodule.ko. Насколько я понимаю, когда, например из userspace выполняется команда «ip link show type bridge», она отправляет rtnetlink сообщение в модуль rtnetlink и тот, в свою очередь что-то делает с таблицами и возвращает ответ в userspace. Что если я хочу перехватывать эти сообщения в моем модуле mymodule.ko, делать что-то свое, и возвращать ответ в userspace (для «ip link show type bridge») так что-бы она думала, что работает с обычным бриджом. Вот сдесь нашел статью про что-то подобное (одно из решений использовать BPF) - https://people.netfilter.org/pablo/netdev0.1/papers/Rtnetlink-dump-filtering-in-the-kernel.pdf. Но не уверен, что это применимо в моем случае. Да, вопрос не простой, но как можно добиться такого поведения, как я описал, если не менять код самого rtnetlink’а? Заранее спасибо!)

Задача извращенская, и лучше такую задачу вообще не решать. Понимаешь ли, системное программирование – это не про то, как делать что-то через жопу, а про то, как делать стабильно и нормально.

Если прям очень надо, то способов много, например:

  1. Найди link_ops с помощью регистрации фейковых ops с помощью __rtnl_link_register.

  2. Найди br_link_ops в списке link_ops.

  3. Подмени часть методов в br_link_ops на свои методы (из своих методов ты должен будешь звать оригинальные методы br_link_ops).

ttnl ★★★★★
()

Зависит от ответа на вопрос «Нафига, блджад?»

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

Большущее спасибо! Да, соглашусь, задача «нестандартная», но как говориться «надо делать». Ответ очень помог, парачку уточнений если можно:

  1. А как мне найти link_ops,просто пройтись по &ops->list с помощью моих фейковых ops и найти там те ops которые бридж зарегистрировал (br_link_ops), я правильно понимаю?
  2. И как подменить методы br_link_ops, т. е. я их подменю, но как их обратно в &ops->list запихнуть на то же место, просто перерегистрировать с помощью __rtnl_link_register?
  3. Зачем мне звать оригинальные методы br_link_ops?
  4. Это все я могу делать в своем отдельном модуле? Спасибо!)
Andy041292
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.