Mengulangi permintaan mDNS / Bonjour dari eth0 melalui terowongan (tun0)

3

Sebagai permulaan, saya cukup baru di kedua jaringan dan distro Unix / Ubuntu / Linux. Hanya peringatan, untuk pengaturan / kode apa pun mungkin terlihat agak jelek.

Pada dasarnya, tujuan akhir saya adalah berhasil AirPlay Mirror ke server remote Ubuntu dari iPhone saya di jaringan wifi yang berbeda atau di LTE.

TL; DR: Dengan mdns-repeater / avahi-daemon dan OpenVPN, saya masih tidak bisa meneruskan permintaan mDNS dari eth0 ke tun0.

Untuk memulai, saya tahu saya membutuhkan penerima AirPlay untuk OS berbasis Ubuntu / Linux / Unix yang mendukung mirroring (dan semoga open-source). Saya menemukan pasangan, kebanyakan untuk Mac OS / Windows, atau tidak mendukung mirroring sama sekali. Setelah sedikit pencarian, saya menemukan Slave di Magic Mirror , server / receiver Linux open-source open source yang beroperasi dan berfungsi (berdasarkan debugging saya, karena saya tidak memiliki akses fisik ke server tempat saya menjalankannya).

Sekarang, saya tahu AirPlay hanya berlari di LAN (pada saat itu tidak mengerti bagaimana Bonjour hanya bekerja pada subnet yang sama) jadi saya melihat ke beberapa opsi VPN. OpenVPN tampaknya paling fleksibel dan termudah untuk diatur. Untuk mempercepat dan menjamin bahwa saya tidak membuat kesalahan dengan mengatur OpenVPN, saya menggunakan skrip yang sudah dibuat sebelumnya dari sini . Diuji dan berfungsi dengan sempurna, VPN terhubung tanpa kebocoran DNS dan semua rute lalu lintas berhasil melalui VPN.

Saya memiliki VPN untuk bertindak seolah-olah perangkat saya ada di LAN server saya sekarang, dan Slave in the Mirror Mirror (AirPlay server) berjalan dengan sukses. Jadi itu seharusnya hanya berfungsi sekarang, kan? Tidak mengherankan, ternyata tidak, karena saya tidak mengerti server AirPlay benar-benar mengirimkan permintaan mDNS / Bonjour (atau probe? Istilah sebenarnya menyelinap di pikiran saya sekarang ..). Sebagai rumah, pengguna konvensional, karena permintaan mDNS ini adalah zeroconf (konfigurasi nol), ini luar biasa! Tetapi sebagai pengguna perusahaan atau bisnis, ini sulit untuk bekerja di VLAN.

Melalui penelitian saya menemukan hasil akhir bahwa saya memerlukan semacam setup tipe repeater / proxy / bridge mDNS. Saya berakhir dengan repeater mDNS. Ada dua program yang saya coba gunakan.

avahi-daemon

Avahi tampaknya yang paling banyak dibicarakan dan paling banyak didokumentasikan, jadi saya memutuskan untuk menggunakannya. Saya mengedit file config untuk mengizinkan Config location /etc/avahi/avahi-daemon.conf

[reflector]
enable-reflector=yes

dan

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

Seperti yang dijelaskan di sini dan di sini .

Menjalankan Avahi Daemon dalam mode debug (avahi-daemon --debug) tampaknya berfungsi pada pandangan pertama tetapi segera setelah Slave di Cermin Ajaib (berjalan pada antarmuka eth0, OpenVPN berjalan pada antarmuka tun0) dijalankan melihat paket mDNS entah bagaimana tetapi selalu menghasilkan banyak dari ini:

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

Memaksa Avahi untuk menggunakan hanya eth0 dan tun0, setelah banyak perubahan dan pengaturan lainnya akan selalu menghasilkan ini.

Untuk memverifikasi itu bukan hanya bug yang saya jalankan

tcpdump -i eth0 udp port 5353 dan tcpdump -i tun0 udp port 5353 (port tempat permintaan mDNS melalui) eth0 berhasil menerima paket dari filter sementara tun0 tidak menerima. Jadi bukan bug keluaran. Saya bahkan mencobanya pada port 7000 (port yang didengarkan AirPlay server untuk Mirroring)

Tanpa keberhasilan dengan Avahi, saya menduga itu mungkin karena belum diperbarui sejak 2011.

repeater mdns

Tanpa file konfigurasi atau pengaturan yang diperlukan, mdns-repeater adalah opsi berikutnya yang saya ambil. Dan sepertinya ini berfungsi dengan benar. Jalankan mdns-repeater dengan

mdns-repeater eth0 tun0 -f

Tambahkan saja antarmuka yang Anda inginkan agar permintaan berulang dan -f untuk foreground / debugging. Itu dia! Saya menjalankan Slave di Magic Mirror dan mdns-repeater berhasil mendeteksi dan mengulangi permintaan (setidaknya sesuai dengan log-nya). Namun sayangnya, menjalankan tcpdumpperintah yang sama seperti yang terlihat di atas, permintaan masih belum melewati terowongan (tun0).

Sekarang dari debugging saya, saya hanya bisa menyimpulkan itu adalah penyebab iptables / firewall atau OpenVPN memfilter port atau permintaan entah bagaimana. Tidak menemukan apa pun di konfigurasi yang terkait dengan pemfilteran di OpenVPN, saya beralih ke teori iptables saya. Tetapi berlari iptables -Ltidak membawa apa-apa, secara harfiah tidak ada aturan di iptables.

Mengetahui sedikit tentang iptables, saya tidak tahu apakah ini penyebabnya. Untuk debugging saya sendiri, saya menambahkan setiap aturan iptables yang berbeda yang dapat saya temukan terkait dengan apa pun dengan mengizinkan mDNS / Bonjour / AirPlay. Sepertinya tidak ada yang bisa membantu.

Setiap dan semua bantuan sangat dihargai! Saya tahu ini sudah lama dibaca, saya tidak ingin ada masalah kecil yang gagal.

TL; DR: Dengan mdns-repeater / avahi-daemon dan OpenVPN, saya masih tidak bisa meneruskan permintaan mDNS dari eth0 ke tun0.

Pirologi
sumber
1
Cara yang ditentukan untuk melakukan Penemuan Layanan DNS di seluruh domain siaran terpisah adalah dengan menggunakan DNS unicast, bukan multicast. Apple menyebutnya "Wide Area Bonjour". dns-sd via unicast DNS membutuhkan penggunaan pada Pembaruan Dinamis DNS. Apple mengirim (dan bersumber terbuka, saya percaya) sebuah daemon POSIX yang disebut "dnsextd" untuk berjalan bersama server DNS "bernama" BIND dan mengimplementasikan Pembaruan Dinamis DNS dan hal-hal lain yang diperlukan agar unicast dns-sd berfungsi.
Spiff
@Spiff apakah Anda bersedia menghubungi dan membantu saya mengatur ini? Saya akan sangat berterima kasih.
Pirologi
@Spiff juga, sumber pasangan yang saya sebutkan sebenarnya memiliki pengguna yang sukses dengan metode yang tepat ini, apakah mereka mungkin tidak menyebutkan hal lain yang sedang mereka jalankan?
Pirologi
1
Saya yakin orang-orang sukses merelayarkan mDNS di luar batas multicast yang dimaksud, tetapi masih seperti berenang di hulu. Untuk informasi lebih lanjut tentang pengaturan unicast dns-sd, lihat dns-sd.org . Ini adalah situs dari Stuart Cheshire, yang merupakan pencipta Bonjour (née Rendezvous) di Apple, dan anggota IETF / IAB yang menggembalakan mDNS dan DNS-SD ke dalam RFC-track standar melalui kelompok kerja IETF ZeroConf.
Spiff

Jawaban:

2

Anda bisa, alih-alih mengulangi permintaan mDNS, gunakan dns-sduntuk membuat catatan layanan proxy. Jika Anda menjalankan dns-sd -Z _raop._tcpdi jaringan dengan catatan mDNS tersedia, Anda harus mendapatkan sesuatu seperti ini:

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"

Anda dapat menggunakan ini untuk membuat catatan proxy untuk mengarahkan klien AirPlay ke server Anda. Untuk koneksi contoh saya, saya akan menggunakan ...

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"

... di mana 192.0.2.23diganti dengan alamat IP server airplay Anda dan yang lainnya disalin dari apa yang Anda dapatkan dns-sd -Z. Dengan ini, klien AirPlay harus dapat melihat server Anda.

Catatan: dns-sdperintah yang saya gunakan di sini datang dengan macOS. Sejauh yang saya tahu itu tidak tersedia untuk linux, tetapi Anda mungkin bisa melakukan sesuatu yang mirip dengan avahi.

g.jaket
sumber