Повторение запросов mDNS / Bonjour от eth0 через туннель (tun0)
3471
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
Запуск демона 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.
Предписанный способ обнаружения службы DNS в разных широковещательных доменах - использование одноадресного, а не многоадресного DNS. Apple называет это "Областью Bonjour". DNS-SD через одноадресный DNS требует использования динамического обновления DNS. Apple поставила (и, я полагаю, с открытым исходным кодом) демон POSIX под названием "dnsextd" для запуска вместе с "именованным" DNS-сервером BIND и реализации динамического обновления DNS и других вещей, необходимых для работы одноадресного dns-sd.
Spiff 9 лет назад
1
@Spiff, не могли бы вы связаться и помочь мне это настроить? Буду очень признателен.
Pyrology 9 лет назад
0
@Spiff, у пары источников, о которых я упоминал, на самом деле есть пользователи, которые успешно используют именно этот метод, возможно, они не упомянули что-то еще, что они используют?
Pyrology 9 лет назад
0
Я уверен, что у людей есть успех с ретрансляцией mDNS за пределы предполагаемой многоадресной рассылки, но это все еще своего рода восходящий поток. Для получения дополнительной информации о настройке одноадресной передачи dns-sd см. [Dns-sd.org] (http://dns-sd.org/). Это сайт Стюарта Чешира, который является создателем Bonjour (ранее Rendezvous) в Apple, и членом IETF / IAB, который включил mDNS и DNS-SD в RFC для отслеживания стандартов через рабочую группу IETF ZeroConf.
Spiff 9 лет назад
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 на ваш сервер. Для моего примера подключения я бы использовал ...
... где 192.0.2.23заменяется IP-адрес вашего сервера трансляции, а все остальное копируется из того, что вы получаете dns-sd -Z. При этом клиенты AirPlay должны видеть ваш сервер.
Примечание: dns-sdкоманда, которую я здесь использую, поставляется с macOS. Насколько я знаю, это не доступно для Linux, но вы могли бы сделать что-то подобное с Avahi.