Повторение запросов mDNS / Bonjour от eth0 через туннель (tun0)

3431
Pyrology

Начнем с того, что я новичок как в сетевых, так и в дистрибутивах Unix / Ubuntu / Linux. Просто предупреждение, для любой установки / кода может выглядеть немного некрасиво.

По сути, моя конечная цель - успешно установить AirPlay Mirror на удаленный сервер Ubuntu с моего iPhone в другой сети Wi-Fi или на LTE.

TL; DR: С mdns-repeater / avahi-daemon и OpenVPN я все еще не могу передать запросы mDNS из eth0 в tun0.

Для начала я знал, что мне нужен приемник AirPlay для ОС на основе Ubuntu / Linux / Unix, которая поддерживает зеркалирование (и, надеюсь, с открытым исходным кодом). Я нашел пару, большинство для Mac OS / Windows, или вообще не поддерживал зеркалирование. После небольшого поиска я обнаружил Slave в Magic Mirror, сервере / приемнике Linux AirPlay с открытым исходным кодом, который работает и работает (на основе моей отладки, поскольку у меня нет физического доступа к серверу, на котором я его запускал).

Теперь я знал, что AirPlay работает только по локальной сети (в то время не понимая, как Bonjour работает только в одной подсети), поэтому я рассмотрел некоторые параметры VPN. OpenVPN оказался наиболее гибким и простым в настройке. Чтобы ускорить процесс и гарантировать, что я не совершу никаких ошибок при настройке OpenVPN, я использовал готовый скрипт отсюда . Проверено и работало безупречно, VPN соединяется без утечек DNS и всех маршрутов трафика успешно через VPN.

У меня есть VPN, чтобы действовать так, как будто мое устройство сейчас находится в локальной сети моего сервера, и у меня успешно работает Slave в Magic Mirror (сервер AirPlay). Так что это должно сработать сейчас, верно? Неудивительно, что этого не произошло, так как я не понимал, что сервер AirPlay на самом деле отправляет запросы mDNS / Bonjour (или зонды? Реальный термин сейчас ускользает от меня…). Как домашний обычный пользователь, так как эти запросы mDNS имеют нулевое значение (нулевая конфигурация), это удивительно! Но как корпоративному или бизнес-пользователю, это трудно работать через VLAN.

В результате исследований я пришел к конечному результату, что мне нужна какая-то настройка типа ретранслятора / прокси / моста mDNS. Я закончил с ретранслятором mDNS. Были две программы, которые я пытался использовать.

Avahi-демон

Авахи, казалось, был самым обсуждаемым и наиболее задокументированным, поэтому я решил использовать это. Я отредактировал файл конфигурации, чтобы разрешить расположение конфигурации /etc/avahi/avahi-daemon.conf

[reflector] enable-reflector=yes 

а также

[server] allow-point-to-point=yes 

Как объяснено здесь и здесь .

Запуск демона Avahi в режиме отладки (avahi-daemon --debug), на первый взгляд, работает, но как только Slave в Magic Mirror (работает на интерфейсе eth0, OpenVPN работает на интерфейсе tun0), он каким-то образом видит пакеты mDNS но всегда выводит кучу таких:

Received packet from invalid interface. Received packet from invalid interface. Received packet from invalid interface. Received packet from invalid interface. 

Принуждение Avahi использовать только eth0 и tun0, при многих других изменениях и настройках всегда будет выводить это.

Чтобы убедиться, что это не просто ошибка вывода, я запустил

tcpdump -i eth0 udp port 5353 и tcpdump -i tun0 udp port 5353 (порт, через который проходят запросы mDNS) eth0 успешно получает пакеты от фильтра, а tun0 не получает ни одного. Так что не ошибка вывода. Я даже попробовал это на порту 7000 (порт, который сервер AirPlay слушает для Зеркального отображения)

Не имея успеха в Avahi, я подозревал, что это может быть просто потому, что он не обновлялся с 2011 года.

MDNS-ретранслятор

Без конфигурационных файлов или настроек, mdns-repeater - следующий вариант, который я выбрал . И, кажется, это работает правильно. Запустите MDNS-репитер с

mdns-repeater eth0 tun0 -f 

Просто добавьте интерфейсы, для которых вы хотите повторять запросы, и -f для переднего плана / отладки. Это оно! Я запустил Slave в Magic Mirror, и mdns-repeater успешно обнаружил и повторил запросы (по крайней мере, по его журналам). Но, к сожалению, при выполнении тех же tcpdumpкоманд, что и выше, запросы по-прежнему не проходят через туннель (tun0).

Теперь из своей отладки я могу только заключить, что это является причиной либо iptables / firewall, либо OpenVPN, фильтрующей порты или запросы каким-либо образом. Не найдя ничего в конфигурации, связанной с фильтрацией в OpenVPN, я перешел к своей теории iptables. Но бег iptables -Lничего не приносит, буквально никаких правил в iptables нет.

Зная немного о iptables, я не знаю, является ли это причиной. Для своей собственной отладки я добавил все различные правила iptables, которые я мог найти, связанные с чем угодно, с разрешением mDNS / Bonjour / AirPlay. Кажется, ничто не поможет.

Любая помощь приветствуется! Я знаю, что это было долгое чтение, я не хотел, чтобы какая-то маленькая проблема провалилась.

TL; DR: С mdns-repeater / avahi-daemon и OpenVPN я все еще не могу передать запросы mDNS из eth0 в tun0.

3
Предписанный способ обнаружения службы DNS в разных широковещательных доменах - использование одноадресного, а не многоадресного DNS. Apple называет это "Областью Bonjour". DNS-SD через одноадресный DNS требует использования динамического обновления DNS. Apple поставила (и, я полагаю, с открытым исходным кодом) демон POSIX под названием "dnsextd" для запуска вместе с "именованным" DNS-сервером BIND и реализации динамического обновления DNS и других вещей, необходимых для работы одноадресного dns-sd. Spiff 8 лет назад 1
@Spiff, не могли бы вы связаться и помочь мне это настроить? Буду очень признателен. Pyrology 8 лет назад 0
@Spiff, у пары источников, о которых я упоминал, на самом деле есть пользователи, которые успешно используют именно этот метод, возможно, они не упомянули что-то еще, что они используют? Pyrology 8 лет назад 0
Я уверен, что у людей есть успех с ретрансляцией mDNS за пределы предполагаемой многоадресной рассылки, но это все еще своего рода восходящий поток. Для получения дополнительной информации о настройке одноадресной передачи dns-sd см. [Dns-sd.org] (http://dns-sd.org/). Это сайт Стюарта Чешира, который является создателем Bonjour (ранее Rendezvous) в Apple, и членом IETF / IAB, который включил mDNS и DNS-SD в RFC для отслеживания стандартов через рабочую группу IETF ZeroConf. Spiff 8 лет назад 1

1 ответ на вопрос

2
g.rocket

Вместо того чтобы повторять запросы mDNS, вы можете использовать dns-sdдля создания записи службы прокси. Если вы работаете dns-sd -Z _raop._tcpв сети с доступной записью mDNS, вы должны получить что-то вроде этого:

Browsing for _raop._tcp DATE: ---Mon 21 May 2018--- 1:29:38.528 ...STARTING...  ; To direct clients to browse a different domain, substitute that domain in place of '@' lb._dns-sd._udp PTR @  ; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names. ; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local ; names with the correct fully-qualified (unicast) domain name of the target host offering the service.   _raop._tcp PTR 054D66DDCDBB@Gavin\032speakers._raop._tcp 054D66DDCDBB@Gavin\032speakers._raop._tcp SRV 0 0 5000 boxen.local. ; Replace with unicast FQDN of target host 054D66DDCDBB@Gavin\032speakers._raop._tcp TXT "pw=false" "txtvers=1" "vn=3" "sr=44100" "ss=16" "ch=2" "cn=0,1" "et=0,1" "ek=1" "sm=false" "tp=UDP" 

Вы можете использовать это для создания прокси-записи для направления клиентов AirPlay на ваш сервер. Для моего примера подключения я бы использовал ...

dns-sd -P '054D66DDCDBB@Gavin speakers' '_raop._tcp' 'local.' 'boxen.local' '192.0.2.23' "pw=false" "txtvers=1" "vn=3" "sr=44100" "ss=16" "ch=2" "cn=0,1" "et=0,1" "ek=1" "sm=false" "tp=UDP" 

... где 192.0.2.23заменяется IP-адрес вашего сервера трансляции, а все остальное копируется из того, что вы получаете dns-sd -Z. При этом клиенты AirPlay должны видеть ваш сервер.

Примечание: dns-sdкоманда, которую я здесь использую, поставляется с macOS. Насколько я знаю, это не доступно для Linux, но вы могли бы сделать что-то подобное с Avahi.

Похожие вопросы