Wiederholen von mDNS / Bonjour-Anforderungen von eth0 durch einen Tunnel (tun0)

3276
Pyrology

Zu Beginn bin ich sowohl bei Netzwerken als auch bei Unix / Ubuntu / Linux-Distributionen ziemlich neu. Nur eine Warnung, für jedes Setup / Code kann etwas hässlich aussehen.

Im Grunde ist es mein Endziel, AirPlay Mirror von meinem iPhone in einem anderen WLAN-Netzwerk oder über LTE auf einen Ubuntu-Remote-Server zu übertragen.

TL; DR: Mit mdns-repeater / avahi-daemon und OpenVPN kann ich die mDNS-Anforderungen von eth0 nicht an tun0 weiterleiten.

Zu Beginn wusste ich, dass ich einen AirPlay-Empfänger für Ubuntu / Linux / Unix-basiertes Betriebssystem brauchte, das Spiegelung (und hoffentlich Open-Source) unterstützte. Ich habe ein paar gefunden, die meisten für Mac OS / Windows oder die Spiegelung überhaupt nicht. Nach etwas mehr Suche fand ich Slave im Magic Mirror, einem Open-Source-Linux-AirPlay-Server / -Empfänger, der ausgeführt wird und funktioniert (basierend auf meinem Debugging, da ich keinen physischen Zugriff auf den Server habe, auf dem ich ihn ausgeführt habe).

Jetzt wusste ich, dass AirPlay nur über LAN lief (zu der Zeit, als ich nicht wusste, wie Bonjour nur in demselben Subnetz funktioniert), also habe ich einige VPN-Optionen untersucht. OpenVPN schien am flexibelsten und am einfachsten einzurichten. Zur Beschleunigung Dinge und zu garantieren, dass ich mache keine Fehler Einstellung OpenVPN verbrauchen ich einen vorgefertigten Skript von hier . Getestet und fehlerfrei, verbindet sich VPN ohne DNS-Leak und alle Verkehrswege erfolgreich über VPN.

Ich habe mein VPN so, als würde sich mein Gerät jetzt im LAN meines Servers befinden, und ich habe Slave im Magic Mirror (AirPlay-Server) erfolgreich ausgeführt. Also sollte es jetzt einfach funktionieren, oder? Es ist nicht überraschend, dass dies nicht der Fall war, da ich nicht wusste, dass der AirPlay-Server tatsächlich mDNS / Bonjour-Anfragen sendet (oder Sonden? Der eigentliche Begriff fällt mir gerade in den Sinn ...). Als herkömmlicher Benutzer für zu Hause ist dies erstaunlich, da diese mDNS-Anforderungen null sind (Zero Configuration). Als Unternehmen oder Geschäftsbenutzer ist es jedoch schwierig, mit VLAN zusammenzuarbeiten.

Durch Nachforschungen kam ich zu dem Ergebnis, dass ich eine Art mDNS-Repeater / Proxy / Bridge-Typ-Setup benötige. Ich endete mit dem mDNS-Repeater. Es gab zwei Programme, die ich verwenden wollte.

Avahi-Daemon

Avahi schien am meisten besprochen und dokumentiert zu sein, also entschied ich mich, das zu verwenden. Ich habe die Konfigurationsdatei bearbeitet, um den Konfigurationsort /etc/avahi/avahi-daemon.conf zuzulassen

[reflector] enable-reflector=yes 

und

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

Wie hier und hier erklärt .

Das Ausführen des Avahi-Daemons im Debug-Modus (avahi-daemon --debug) schien auf den ersten Blick zu funktionieren, aber sobald Slave im Magic Mirror (läuft auf der eth0-Schnittstelle, OpenVPN auf der tun0-Schnittstelle) ausgeführt wird, werden die mDNS-Pakete irgendwie angezeigt gibt jedoch immer einen Haufen davon aus:

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

Wenn Avahi gezwungen wird, nur eth0 und tun0 zu verwenden, wird dies bei vielen anderen Änderungen und Einstellungen immer ausgegeben.

Um zu überprüfen, dass es nicht nur ein Ausgabefehler war, den ich ausgeführt habe

tcpdump -i eth0 udp port 5353 und tcpdump -i tun0 udp port 5353 (Port, an dem mDNS-Anforderungen durchlaufen) empfängt eth0 erfolgreich Pakete vom Filter, während tun0 keine empfängt. Also kein Ausgabefehler. Ich habe es sogar an Port 7000 ausprobiert (Port, auf dem der AirPlay-Server die Spiegelung abhört).

Ohne Erfolg mit Avahi hatte ich den Verdacht, dass es vielleicht nur daran liegt, dass es seit 2011 nicht aktualisiert wurde.

Mdns-Repeater

Da keine Konfigurationsdateien oder Einstellungen erforderlich sind, ist der mdns-repeater die nächste Option, die ich gewählt habe. Und es scheint, dass dies richtig funktioniert. Mdns-Repeater mit ausführen

mdns-repeater eth0 tun0 -f 

Fügen Sie einfach die Schnittstellen hinzu, bei denen die Anforderungen wiederholt werden sollen, und -f für Vordergrund / Debugging. Das ist es! Ich lief Slave im Magic Mirror und mdns-repeater erkannte erfolgreich und wiederholte die Anfragen (zumindest laut Protokoll). Wenn Sie jedoch die gleichen tcpdumpBefehle ausführen wie oben, laufen die Anforderungen immer noch nicht durch den Tunnel (tun0).

Jetzt kann ich aus meinem Debugging nur schließen, dass entweder die Ursache dafür liegt, dass iptables / firewall oder OpenVPN die Ports oder Anfragen irgendwie filtert. Ich fand nichts in der Konfig mit Filterung in OpenVPN und ging zu meiner iptables-Theorie über. Aber Laufen iptables -Lbringt nichts, buchstäblich keine Regeln in iptables.

Ich weiß nicht viel über Iptables und weiß nicht, ob dies die Ursache ist. Für mein eigenes Debugging habe ich jede andere iptables-Regel hinzugefügt, die ich finden konnte, wenn mDNS / Bonjour / AirPlay zugelassen wird. Nichts scheint hilfreich zu sein.

Jede Hilfe wird geschätzt! Ich weiß, das war eine lange Lektüre, ich wollte nicht, dass ein kleines Problem durchkommt.

TL; DR: Mit mdns-repeater / avahi-daemon und OpenVPN kann ich die mDNS-Anforderungen von eth0 nicht an tun0 weiterleiten.

3
Die vorgeschriebene Methode für die DNS-Dienstermittlung in separaten Broadcastdomänen ist die Verwendung von Unicast- und nicht von Multicast-DNS. Apple nennt dies "Wide Area Bonjour". dns-sd über Unicast-DNS erfordert die Verwendung des dynamischen DNS-Updates. Apple lieferte einen POSIX-Dämon namens "dnsextd", der neben BINDs "named" -DNS-Server ausgeführt werden sollte und ein dynamisches DNS-Update implementieren sollte, und andere notwendige Dinge, damit Unicast dns-sd funktioniert. Spiff vor 8 Jahren 1
@Spiff Würdest du bereit sein, mit mir in Kontakt zu treten und mir bei der Einrichtung zu helfen? Ich wäre sehr dankbar. Pyrology vor 8 Jahren 0
@Spiff auch, die paar Quellen, die ich erwähnt habe, haben tatsächlich Benutzer, die mit dieser Methode Erfolg haben. Haben sie vielleicht nicht etwas anderes erwähnt, das sie ausführen? Pyrology vor 8 Jahren 0
Ich bin sicher, dass die Leute mit der Weiterleitung von mDNS über die beabsichtigten Multicast-Grenzen hinweg Erfolg haben, aber es ist immer noch eine Art Upstream. Weitere Informationen zum Einrichten von Unicast dns-sd finden Sie unter [dns-sd.org] (http://dns-sd.org/). Es ist eine Seite von Stuart Cheshire, der sowohl der Schöpfer von Bonjour (geb. Rendezvous) bei Apple als auch das IETF / IAB-Mitglied ist, das mDNS und DNS-SD über die IETF-ZeroConf-Arbeitsgruppe in Standard-Tracking-RFCs integriert hat. Spiff vor 8 Jahren 1

1 Antwort auf die Frage

2
g.rocket

Anstatt die mDNS-Anforderungen zu wiederholen dns-sd, können Sie einen Proxy-Service-Datensatz erstellen. Wenn Sie dns-sd -Z _raop._tcpim Netzwerk mit dem verfügbaren mDNS-Datensatz laufen, sollten Sie etwa Folgendes erhalten:

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" 

Sie können dies verwenden, um einen Proxy-Datensatz zu erstellen, um AirPlay-Clients an Ihren Server zu leiten. Für meine Beispielverbindung würde ich verwenden ...

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" 

... wo 192.0.2.23durch die IP-Adresse Ihres Airplay-Servers ersetzt wird und alles andere von dem kopiert wird, was Sie erhalten dns-sd -Z. Damit sollten AirPlay-Clients Ihren Server sehen können.

Hinweis: Der dns-sdBefehl, den ich hier verwende, wird mit macOS geliefert. Soweit mir bekannt ist, ist es nicht für Linux verfügbar, aber mit avahi könnte man wahrscheinlich etwas Ähnliches machen.