LINUX.ORG.RU

Где в ядре можно перехватить L2 сетевой пакет?

 , ,


0

2

Нужно перед отправкой Ethernet пакета его перехватить и при наличии определенных условий модифицировать. Соответственно принятый модифицированный Ethernet пакет тоже нужно перехватить и модифицировать в обратном порядке. Под модификацией понимается любое изменение в Ethernet payload.

Ставить ловушки в prerouting и postrouting вроде как не имеет смысла. В prerouting, насколько я понимаю, пакет поступает уже после обработчика протокола L3. То есть пакет должен быть преобразован еще раньше, ибо в IP-заголовке могут быть неадекватные данные.

Вроде как приходит на ум как вариант, что для принимаемых пакетов можно написать и зарегистрировать собственный обработчик протокола L3.

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

Ставить ловушки в prerouting и postrouting вроде как не имеет смысла. В prerouting, насколько я понимаю, пакет поступает уже после обработчика протокола L3.

Посмотри на схему
На L2 так же есть возможность пакеты исправлять. Раньше это было через ebtables, а сейчас все это переместили в nftables. Но для этого нужно трафик загнать в бридж.

vel ★★★★★
()
Ответ на: комментарий от ya-betmen

В смысле?
В схеме ничего не поменялось.
Добавили новое api (nftables) для работы с правилами.

А раньше этим рулили только через ebtables + iptables.

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

ipchains (2.4) -> iptables (2.6) -> nftables («точка отсчета» cgroups, но сама nftables это уже "машина, а не модуль ядра.)

anonymous
()

Пока что я вижу, что используя nftables для входящих пакетов можно установить hook в точке ingress сразу после сетевого интерфейса. Как альтернатива остается свой обработчик протокола сетевого уровня (ip).

А вот для исходящих пакетов нормального решения как не было, так и нет. Надо само ядро модифицировать.

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

Да точно так же, только не ingress, а egress. Чем не нормальное-то?

Действительно, сейчас посмотрел ядро, можно и на egress поставить hook. Вчера смотрел, ядро на все, кроме ingress, возаращало EINVAL. Старое ядро что-ли попалось.

zloy_starper ★★★
() автор топика
  • Markdown
Пустая строка (два раза Enter) начинает новый абзац. Знак '>' в начале абзаца выделяет абзац курсивом цитирования.
Внимание: прочитайте описание разметки Markdown.
Используйте Ctrl-Enter для размещения комментария