Это руководство по настройке работы mDNS (Bonjour) и SSDP (для DLNA) через интерфейс Wireguard, связывающий два роутера Mikrotik на ROS7.7 и выше, без всяких сложностей вроде IGMP Proxy/PIM/Avahi/контейнеров. Во вложении показана реализация. Жирным шрифтом над флагом указаны реальные интерфейсы. Толстые вертикальные линии — общий сетевой уровень. Мосты роутеров не используют VLAN-фильтрацию, так как обычно она не нужна в таких домашних условиях.
Wireguard Сторона A:
/interface wireguard
add listen-port=13231 mtu=1412 name=Wireguard
/interface wireguard peers
add allowed-address=172.16.200.0/24 endpoint-address=site-b.com endpoint-port=13231 interface=Wireguard public-key="<side a's public key>"
/ip route
add disabled=no distance=1 dst-address=172.16.200.0/24 gateway=Wireguard pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
Сторона B:
/interface wireguard
add listen-port=13231 mtu=1412 name=Wireguard
/interface wireguard peers
add allowed-address=172.16.100.0/24 endpoint-address=site-a.com endpoint-port=13231 interface=Wireguard public-key="<side b's public key>"
/ip route
add disabled=no distance=1 dst-address=172.16.100.0/24 gateway=Wireguard pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
Это типовая конфигурация Wireguard, не забудьте разрешить в фаерволе входящий UDP на порт 13231 для трафика Wireguard. У меня MTU установлен на 1412 вместо дефолтных 1420, так как с одной стороны PPPoE. Подстройте под свою линию. Маршруты нужны, чтобы роутеры видели подсети друг друга.
EoIP Сторона A:
/interface eoip
add !keepalive local-address=172.16.100.254 mtu=1500 name=EoIP remote-address=172.16.200.254 tunnel-id=1
Сторона B:
/interface eoip
add !keepalive local-address=172.16.200.254 mtu=1500 name=EoIP remote-address=172.16.100.254 tunnel-id=1
Здесь настраиваем интерфейс EoIP. IPSEC не нужен, так как трафик идёт через Wireguard. Не забудьте добавить порт EoIP в основной мост на каждом конце.
Стороны A и B:
/interface bridge port
add bridge=BridgeMain interface=EoIP
Фильтрация моста
На этом этапе оба моста объединены в широковещательную домену, что может привести к беде — любые широковещательные запросы, включая DHCP, будут идти в обе стороны. Нам нужно пропускать только mDNS и SSDP, и ничего лишнего — это делается через Bridge Filter, мощную, но редко используемую функцию ROS.
Стороны A и B:
/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 ip-protocol=udp mac-protocol=ip out-interface=EoIP src-port=5353
add action=accept chain=forward comment="Allow SSDP" dst-address=239.255.255.250/32 dst-mac-address=01:00:5E:7F:FF:FA/FF:FF:FF:FF:FF:FF dst-port=1900 ip-protocol=udp log-prefix=SSDP mac-protocol=ip out-interface=EoIP
add action=drop chain=forward out-interface=EoIP
add action=drop chain=output out-interface=EoIP
Такая фильтрация сохраняет исходные MAC-адреса ethernet-кадров, начинающиеся с 01:, что нужно для правильного распространения в сети на другой стороне. Трафик mDNS, кажется, полностью идёт широковещательно. В пакетах mDNS есть IP-адреса сервисов, и после обнаружения клиент связывается с сервисом по обычному маршруту Wireguard на уровне 3. SSDP (DLNA) — это широковещательные запросы клиента для поиска серверов. Сервер отвечает юникастом на уровне 3, отправляя UDP-пакет обратно на тот IP и UDP-порт, с которых пришёл запрос.
В моём случае DLNA сервер — MythTV, но из-за проблемы безопасности 2014 года он отвечает только на широковещательные запросы из своих подсетей. Возможно, у других DLNA серверов похожая логика. Мне пришлось сделать DSTNAT и SRCNAT правила, чтобы обмануть его.
На роутере со стороны MythTV были такие NAT-правила. У роутера адрес шлюза 172.16.100.254, для удобства добавил адрес 172.16.100.253. ТВ на другой стороне — 172.16.200.237, MythTV — 172.16.100.200.
Правило src-nat заставляет IP ТВ выглядеть как из той же подсети, что и MythTV, когда проходит широковещательный запрос, при этом MAC-адрес остается исходным (01:...), позволяя распространить кадры в подсеть. Правило dst-nat переписывает юникаст-ответ MythTV, который думает, что отвечает на 172.16.100.253 (второй адрес роутера), на адрес ТВ 172.16.200.237, дальше по Wireguard. Все дальнейшие общения MythTV с ТВ идут уже по обычному маршруту и NAT не нужен.
/ip firewall nat
add action=src-nat chain=srcnat comment="SSDP broadcast" dst-address=239.255.255.250 src-address=172.16.200.237 to-addresses=172.16.100.253
add action=dst-nat chain=dstnat comment="SSDP unicast reply" dst-address=172.16.100.253 src-address=172.16.100.200 to-addresses=172.16.200.237
На основе этого примера можно попробовать использовать другие варианты, но это уже вне рамок данного руководства.
EoIP: VLANX, VPLS (?), OpenVPN TAP
Wireguard: L2TP, PPP, IPSec, OpenVPN TUN, GRE
Ссылки:
Wireguard:
EoIP:
Bridge Firewall:
mDNS:
SSDP:
Обсуждение на форуме:
Wireguard Сторона A:
/interface wireguard
add listen-port=13231 mtu=1412 name=Wireguard
/interface wireguard peers
add allowed-address=172.16.200.0/24 endpoint-address=site-b.com endpoint-port=13231 interface=Wireguard public-key="<side a's public key>"
/ip route
add disabled=no distance=1 dst-address=172.16.200.0/24 gateway=Wireguard pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
Сторона B:
/interface wireguard
add listen-port=13231 mtu=1412 name=Wireguard
/interface wireguard peers
add allowed-address=172.16.100.0/24 endpoint-address=site-a.com endpoint-port=13231 interface=Wireguard public-key="<side b's public key>"
/ip route
add disabled=no distance=1 dst-address=172.16.100.0/24 gateway=Wireguard pref-src="" routing-table=main scope=30 suppress-hw-offload=no target-scope=10
Это типовая конфигурация Wireguard, не забудьте разрешить в фаерволе входящий UDP на порт 13231 для трафика Wireguard. У меня MTU установлен на 1412 вместо дефолтных 1420, так как с одной стороны PPPoE. Подстройте под свою линию. Маршруты нужны, чтобы роутеры видели подсети друг друга.
EoIP Сторона A:
/interface eoip
add !keepalive local-address=172.16.100.254 mtu=1500 name=EoIP remote-address=172.16.200.254 tunnel-id=1
Сторона B:
/interface eoip
add !keepalive local-address=172.16.200.254 mtu=1500 name=EoIP remote-address=172.16.100.254 tunnel-id=1
Здесь настраиваем интерфейс EoIP. IPSEC не нужен, так как трафик идёт через Wireguard. Не забудьте добавить порт EoIP в основной мост на каждом конце.
Стороны A и B:
/interface bridge port
add bridge=BridgeMain interface=EoIP
Фильтрация моста
На этом этапе оба моста объединены в широковещательную домену, что может привести к беде — любые широковещательные запросы, включая DHCP, будут идти в обе стороны. Нам нужно пропускать только mDNS и SSDP, и ничего лишнего — это делается через Bridge Filter, мощную, но редко используемую функцию ROS.
Стороны A и B:
/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 ip-protocol=udp mac-protocol=ip out-interface=EoIP src-port=5353
add action=accept chain=forward comment="Allow SSDP" dst-address=239.255.255.250/32 dst-mac-address=01:00:5E:7F:FF:FA/FF:FF:FF:FF:FF:FF dst-port=1900 ip-protocol=udp log-prefix=SSDP mac-protocol=ip out-interface=EoIP
add action=drop chain=forward out-interface=EoIP
add action=drop chain=output out-interface=EoIP
Такая фильтрация сохраняет исходные MAC-адреса ethernet-кадров, начинающиеся с 01:, что нужно для правильного распространения в сети на другой стороне. Трафик mDNS, кажется, полностью идёт широковещательно. В пакетах mDNS есть IP-адреса сервисов, и после обнаружения клиент связывается с сервисом по обычному маршруту Wireguard на уровне 3. SSDP (DLNA) — это широковещательные запросы клиента для поиска серверов. Сервер отвечает юникастом на уровне 3, отправляя UDP-пакет обратно на тот IP и UDP-порт, с которых пришёл запрос.
В моём случае DLNA сервер — MythTV, но из-за проблемы безопасности 2014 года он отвечает только на широковещательные запросы из своих подсетей. Возможно, у других DLNA серверов похожая логика. Мне пришлось сделать DSTNAT и SRCNAT правила, чтобы обмануть его.
На роутере со стороны MythTV были такие NAT-правила. У роутера адрес шлюза 172.16.100.254, для удобства добавил адрес 172.16.100.253. ТВ на другой стороне — 172.16.200.237, MythTV — 172.16.100.200.
Правило src-nat заставляет IP ТВ выглядеть как из той же подсети, что и MythTV, когда проходит широковещательный запрос, при этом MAC-адрес остается исходным (01:...), позволяя распространить кадры в подсеть. Правило dst-nat переписывает юникаст-ответ MythTV, который думает, что отвечает на 172.16.100.253 (второй адрес роутера), на адрес ТВ 172.16.200.237, дальше по Wireguard. Все дальнейшие общения MythTV с ТВ идут уже по обычному маршруту и NAT не нужен.
/ip firewall nat
add action=src-nat chain=srcnat comment="SSDP broadcast" dst-address=239.255.255.250 src-address=172.16.200.237 to-addresses=172.16.100.253
add action=dst-nat chain=dstnat comment="SSDP unicast reply" dst-address=172.16.100.253 src-address=172.16.100.200 to-addresses=172.16.200.237
На основе этого примера можно попробовать использовать другие варианты, но это уже вне рамок данного руководства.
EoIP: VLANX, VPLS (?), OpenVPN TAP
Wireguard: L2TP, PPP, IPSec, OpenVPN TUN, GRE
Ссылки:
Wireguard:
EoIP:
Bridge Firewall:
mDNS:
SSDP:
Обсуждение на форуме:
