1

Я ищу способ отбросить один пакет (UDP) многоадресного потока.

Возможно ли это утилитами пользовательского пространства или единственным способом было бы внедрить некоторый код в стек IP ядра?

Я ожидаю, что он должен выбросить пакет, который проходит через два соединенных мостом интерфейса (таким образом вход в один eth и выход в другом). В идеале он должен отбрасывать первый пакет, который будет соответствовать некоторым требованиям (в форме фильтра BPF или просто комбинации DST | SRC IP | PORT), но отбрасывания только первого пакета на интерфейсе будет достаточно.

1 ответ1

1

Хорошо! Как сказал @dirkt в своем комментарии, есть возможность использовать расширение iptables. Одним из очень хороших для этого целей может быть statistic --mode nth . Его можно легко использовать на мосту (для моста необходимо net.bridge.bridge-nf-call-iptables !)

Итак, если кто-то захочет заблокировать первый пакет, входящий в bridge0 из ethA , команда будет выглядеть так:

iptables -N log-and-drop        # create new chain
iptables -A log-and-drop -j LOG --log-level 6 --log-prefix SOMEREALLYUNIQUESTRING     # log received packet into syslog with some string unique enough
iptables -A log-and-drop -j DROP # drop the packet

# rules for every single interface in the bridge
iptables -A FORWARD  -m physdev --physdev-in ethA -m statistic --mode nth --every 1000000 --packet 0 -j log-and-drop

Это создаст цепочку log-and-drop которая будет использоваться для регистрации и отбрасывания полученного пакета. Затем он пройдет первый проходящий пакет (а затем каждый миллионный пакет) и отбросит его.

Последнее, что нам нужно сделать, - это создать "скрипт наблюдения", который будет ждать появления этой уникальной строки в журнале и затем удалит все правила iptables.

if tail /var/log/messages  | grep -m 1 SOMEREALLYUNIQUESTRING ; then
    iptables -D FORWARD  -m physdev --physdev-in ethA -m statistic --mode nth --every 1000000 --packet 0 -j log-and-drop
    iptables -F log-and-drop
    iptables -X log-and-drop
fi

Это не очень красивое решение, но это единственное, что мне удалось выяснить. Если кто-то может найти лучшее решение, я с нетерпением жду его увидеть :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .