LINUX.ORG.RU
решено ФорумAdmin

Отфильтровать трафик на выходе из моста от самого моста

 , , , ,


1

1

Всем привет!

Такое дело. Есть несколько небольших сеток с выходом Internet. Они соединены между собой openvpn, интерфейс самого OVpn включен с обеих сторон в мост в котором так же ещё физический интерфейс смотрящий в каждую из сетей. Основная задача такой городульки - прозрачное виденье UPnP медиа-сервера устройствами во всех сетях. Это даже работает. Понятно, что в тунель трафик ограничен, и он только для UPnP. На самих же «роутерах» так же подняты UPnP сервера для управления NAT, в частности чтобы Торрент клиенты внутри сетей и им подобные могли открыть себе порты. это тоже работает. Но есть одно но. Хочется чтобы эти самые UPnP были видны только внутри своей маленькой сети. SSDP протокол, на котором они общаются, использует мультикаст пакеты UDP:1900.

В итоге. я не могу запретить выходить мультикаст пакетам с самого «роутера» во вне. Я делаю так:
На роутере (192.168.60.201 его адресс на br0, br0 = tap0+eth0):

# iptables -I OUTPUT -o br0 -m physdev --physdev-out tap0 -p udp -s 192.168.60.201 --dport 1900 -j DROP

С другой стороны (192.168.60.137 на br0, br0 = tap0+eth0)

# tcpdump -i tap0 -n dst port 1900
16:03:47.902167 IP 192.168.60.201.47940 > 239.255.255.250.1900: UDP, length 453
16:03:47.902714 IP 192.168.60.201.47940 > 239.255.255.250.1900: UDP, length 414
16:03:47.903290 IP 192.168.60.201.47940 > 239.255.255.250.1900: UDP, length 485
т.е. 60.201 переодически информирует о себе. Он сам инициатор пакетов, т.е. Local Process

Я пробовал разные конфигурации правила дабы понять что я делаю не так, но так и не понял :)
iptables -I OUTPUT -m physdev --physdev-out tap0 -p udp -s 192.168.60.201 --dport 1900 -j DROP
iptables -I OUTPUT -o br0 -m physdev --physdev-out tap0 -p udp --dport 1900 -j DROP
iptables -I OUTPUT -o br0 -m physdev --physdev-out tap0 -p udp -s 192.168.60.201 --dport 1900 -j DROP
iptables -I OUTPUT -m physdev --physdev-out tap0 -p udp -j DROP
и так далее. Ничего не получается, счётчик пакетов не меняется - всегда 0. Может пакет вообще не проходит через OUTPUT? А как это? Где он тогда проходит?
Руководствуюсь http://ebtables.netfilter.org/br_fw_ia/PacketFlow.png

Что мешает воспользоваться ebtables и резать МС там в filter/output ? Это будет более правильно, если нужно отрезать МС только через один из портов моста.

На мой взгляд iptables в filter/OUTPUT еще не знает physdev-out, да и в случае с МС это будут все порты моста. Есть подозрение, что либо документация неполная, либо она устарела. Для ядра 3.18 physdev-out будет работать только если в ядре включено CONFIG_BRIDGE_NETFILTER и только для пакетов прошедших через FORWARD. Попробуй добавить в iptables/filter/OUTPUT правило -j LOG для твоего МС-пакета. Если в логах будет виден «PHYSOUT=», то я не прав.

А картинка у тебя неудачная. Вот читаемая схема.

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

У меня пока нет ebtabls в роутере :) Но оно собирается уже. т.е. правильнее будет ловить «пакеты» уже в ebtables/filter/output? Не совсем понятно в каком месте пакеты разделяются по интерфейсам. На сколько я понял в iptables/filter/output пакет всё ещё «один» и его выход br0, затем он проходит по цепочке и «превращается» в «два» у каждого из которых phydev уже конкретный интерфейс. Так? Так вот где это место?

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

Правильно понял.

Если верить схеме, то после iptables/filter/OUTPUT становится ясно через какой интерфейс будет передаваться пакет.

Дублирование пакетов в порты - это функция моста, а фильтрация на уровне моста - это ebtables.

В iptables эти дублированные пакеты похоже уже не видно. Интересно, если включить TRACE для таких пакетов - что мы увидем?

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

В iptables эти дублированные пакеты похоже уже не видно.

Я не пробовал, но разве критерий iptables physdev не поможет?

Хотя он как раз транзитный трафик отловит, а не трафик от самой машины, где мост...

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

В итоге сделал так:

-A OUTPUT -p IPv4 -o tap0 --ip-proto igmp -j DROP
-A OUTPUT -p IPv4 -o tap0 --ip-proto udp --ip-sport 1900 -j DROP
-A OUTPUT -p IPv4 -o tap0 --ip-proto udp --ip-dport 1900 -j DROP
попутно igmp, тоже, прибил

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

Я не пробовал, но разве критерий iptables physdev не поможет?

Хотя он как раз транзитный трафик отловит, а не трафик от самой машины, где мост...

Я пошел в man iptables-extensions, прочитал, не поверил.

Погрепал в исходниках physoutdev которое используется в проверке physdev-out. Единственное место, где присваивается значение nf_bridge->physoutdev - это net/bridge/br_netfilter.c br_nf_forward_ip(), которая вызывается только в forward.

Для себя я сделал вывод, что документация сильно не соответствует реальности.

IMHO physdev-out вообще нельзя использовать для не unicast пакетов.

С другой стороны, nf_bridge->physoutdev это конкретное устройство (а не список) которое проверяется в physdev-out, но если мы не знаем на каком порту моста находится МАС, то мост будет пихать его во все порты и проверка physdev-out превращается в непонятно что.

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

Единственное место, где присваивается значение nf_bridge->physoutdev - это net/bridge/br_netfilter.c br_nf_forward_ip(), которая вызывается только в forward.

Ну сам я эту штуку не пробовал(всё-таки ebtables не зря существует же), но за предупреждение - спасибо

Pinkbyte ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.