3

Начнем с того, что я новичок как в сетевых, так и в дистрибутивах 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-ретранслятор успешно обнаружил и повторил запросы (по крайней мере, по его журналам). Но, к сожалению, при выполнении тех же команд 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.

1 ответ1

2

Вместо повторения запросов 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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .