[ИЗМЕНЕНО: это была моя первоначальная версия, но теперь она заменена версией с MACVLAN ниже] У меня была задача на одном объекте: нужно было, чтобы устройства в VLAN2 видели Chromecasts, AppleTV и Airprint, которые находятся в VLAN1. Используя несколько идей, которые возникли у меня при подготовке поста про mDNS через Wireguard, я решил попробовать. Похоже, что у Mikrotik есть в разработке решение для mDNS в ROS, но пока его ждать нужно; а пока… На объекте стоит коммутатор CRS354 с IGMP snooping и роутер с PIM-SM, но, разумеется, это не помогает для mDNS между VLAN. Также в некоторых комнатах у меня есть hEX’ы, работающие как управляемые коммутаторы (с VLAN-фильтрацией), поэтому я попробовал на одном из hEX сделать следующее:
hEX имеет мост с VLAN-фильтрацией, где VLAN1 и VLAN2 размечены на Eth1, а на остальных портах — без тегов, как нужно. Я создал новый мост с именем BridgemDNS. Создал два VLAN-интерфейса (VLAN1 и VLAN2), родительским у которых был общий VLAN-фильтрованый мост. Порты из этих VLAN добавил в новый мост и настроил фильтрацию:
/interface bridge
add name=BridgemDNS protocol-mode=none
/interface bridge port
add bridge=BridgemDNS frame-types=admit-only-untagged-and-priority-tagged interface=VLAN1 pvid=1001
add bridge=BridgemDNS frame-types=admit-only-untagged-and-priority-tagged interface=VLAN2 pvid=1001
/interface bridge vlan
add bridge=BridgemDNS untagged=VLAN1,VLAN2 vlan-ids=1001
/interface bridge filter
add action=accept chain=forward comment="Allow mDNS" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-port=5353
add action=drop chain=forward in-bridge=BridgemDNS out-bridge=BridgemDNS
/interface bridge nat
add action=src-nat chain=srcnat dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF to-src-mac-address=CC:2D:E0:14:64:AD
Итак, видно, что в первой части создаётся новый мост и порты VLAN настроены так, чтобы присоединиться к нему с PVID 1001. Таким образом, управляющий трафик второго уровня из VLAN1 и VLAN2 становится связанным. Очень важно, чтобы была фильтрующая drop-правила, которая блокирует весь двухсторонний L2-трафик, иначе был бы полный хаос. Правило перед drop — основное волшебное, которое пропускает только mDNS-трафик, а потом drop отбрасывает всё остальное.
Поначалу не происходило ничего заметного, пока я не сделал SRCNAT по MAC-адресу кадров, уходящих в сеть, используя MAC основного VLAN-фильтрованного моста (не моста mDNS) — CC:2D:E0:14:64:AD. Думаю, это связано с IGMP snooping, раздачей трафика на порты и гарантией того, что MAC известен в этой сети.
В итоге это сработало — mDNS широковещательный трафик пошёл в обе стороны. Основной роутер разрешил отправлять трафик с VLAN2 на VLAN1, и тогда Airplay заработал: Macbook в VLAN2 смог соединиться с AppleTV в VLAN1.
Дальше я проверил, можно ли разрешить только определённый mDNS-трафик между VLAN’ами:
/interface bridge filter
add action=accept chain=forward comment="Allow mDNS VLAN1" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS in-interface=VLAN1 ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-mac-address=34:FD:6A:03:A1:8B/FF:FF:FF:FF:FF:FF src-port=5353
add action=drop chain=forward comment="Drop all other mDNS from VLAN1" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS in-interface=VLAN1 ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-port=5353
add action=accept chain=forward comment="Allow mDNS" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-port=5353
add action=drop chain=forward in-bridge=BridgemDNS out-bridge=BridgemDNS
/interface bridge nat
add action=src-nat chain=srcnat dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF to-src-mac-address=CC:2D:E0:14:64:AD
Первое фильтрующее правило пропускает mDNS-трафик с VLAN1 на VLAN2 лишь с SRCMAC 34:FD:6A:03:A1:8B — это конкретный AppleTV. Следующее правило сбрасывает весь остальной mDNS-трафик с VLAN1 на VLAN2. Третье разрешает весь оставшийся mDNS-трафик, который идёт только с VLAN2 на VLAN1. И в конце идёт основное drop-правило, которое блокирует всё прочее в обе стороны, плюс SRCNAT по MAC.
На этом этапе Macbook видит только один AppleTV, а Airprint-принтер становится недоступен. Я продолжаю тестировать, но выглядит достаточно надёжно. IP-адреса VLAN-интерфейсам я не назначал. Может быть, тут есть какие-то побочные эффекты, хотя карта пакетов показывает, что пакеты через мост обрабатываются раньше, чем IP-пакеты.
Советую попробовать это на отдельном устройстве Routerboard в своей сети, как сделал я, а не на основном роутере и коммутаторах.
hEX имеет мост с VLAN-фильтрацией, где VLAN1 и VLAN2 размечены на Eth1, а на остальных портах — без тегов, как нужно. Я создал новый мост с именем BridgemDNS. Создал два VLAN-интерфейса (VLAN1 и VLAN2), родительским у которых был общий VLAN-фильтрованый мост. Порты из этих VLAN добавил в новый мост и настроил фильтрацию:
/interface bridge
add name=BridgemDNS protocol-mode=none
/interface bridge port
add bridge=BridgemDNS frame-types=admit-only-untagged-and-priority-tagged interface=VLAN1 pvid=1001
add bridge=BridgemDNS frame-types=admit-only-untagged-and-priority-tagged interface=VLAN2 pvid=1001
/interface bridge vlan
add bridge=BridgemDNS untagged=VLAN1,VLAN2 vlan-ids=1001
/interface bridge filter
add action=accept chain=forward comment="Allow mDNS" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-port=5353
add action=drop chain=forward in-bridge=BridgemDNS out-bridge=BridgemDNS
/interface bridge nat
add action=src-nat chain=srcnat dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF to-src-mac-address=CC:2D:E0:14:64:AD
Итак, видно, что в первой части создаётся новый мост и порты VLAN настроены так, чтобы присоединиться к нему с PVID 1001. Таким образом, управляющий трафик второго уровня из VLAN1 и VLAN2 становится связанным. Очень важно, чтобы была фильтрующая drop-правила, которая блокирует весь двухсторонний L2-трафик, иначе был бы полный хаос. Правило перед drop — основное волшебное, которое пропускает только mDNS-трафик, а потом drop отбрасывает всё остальное.
Поначалу не происходило ничего заметного, пока я не сделал SRCNAT по MAC-адресу кадров, уходящих в сеть, используя MAC основного VLAN-фильтрованного моста (не моста mDNS) — CC:2D:E0:14:64:AD. Думаю, это связано с IGMP snooping, раздачей трафика на порты и гарантией того, что MAC известен в этой сети.
В итоге это сработало — mDNS широковещательный трафик пошёл в обе стороны. Основной роутер разрешил отправлять трафик с VLAN2 на VLAN1, и тогда Airplay заработал: Macbook в VLAN2 смог соединиться с AppleTV в VLAN1.
Дальше я проверил, можно ли разрешить только определённый mDNS-трафик между VLAN’ами:
/interface bridge filter
add action=accept chain=forward comment="Allow mDNS VLAN1" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS in-interface=VLAN1 ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-mac-address=34:FD:6A:03:A1:8B/FF:FF:FF:FF:FF:FF src-port=5353
add action=drop chain=forward comment="Drop all other mDNS from VLAN1" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS in-interface=VLAN1 ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-port=5353
add action=accept chain=forward comment="Allow mDNS" dst-address=224.0.0.251/32 dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF dst-port=5353 in-bridge=BridgemDNS ip-protocol=udp mac-protocol=ip out-bridge=BridgemDNS src-port=5353
add action=drop chain=forward in-bridge=BridgemDNS out-bridge=BridgemDNS
/interface bridge nat
add action=src-nat chain=srcnat dst-mac-address=01:00:5E:00:00:FB/FF:FF:FF:FF:FF:FF to-src-mac-address=CC:2D:E0:14:64:AD
Первое фильтрующее правило пропускает mDNS-трафик с VLAN1 на VLAN2 лишь с SRCMAC 34:FD:6A:03:A1:8B — это конкретный AppleTV. Следующее правило сбрасывает весь остальной mDNS-трафик с VLAN1 на VLAN2. Третье разрешает весь оставшийся mDNS-трафик, который идёт только с VLAN2 на VLAN1. И в конце идёт основное drop-правило, которое блокирует всё прочее в обе стороны, плюс SRCNAT по MAC.
На этом этапе Macbook видит только один AppleTV, а Airprint-принтер становится недоступен. Я продолжаю тестировать, но выглядит достаточно надёжно. IP-адреса VLAN-интерфейсам я не назначал. Может быть, тут есть какие-то побочные эффекты, хотя карта пакетов показывает, что пакеты через мост обрабатываются раньше, чем IP-пакеты.
Советую попробовать это на отдельном устройстве Routerboard в своей сети, как сделал я, а не на основном роутере и коммутаторах.
