首先,我对网络和 Unix/Ubuntu/Linux 发行版都很陌生。请注意,任何设置/代码可能看起来有点丑陋。
基本上,我的最终目标是成功地将 AirPlay Mirror 从我的 iPhone 在不同 WiFi 网络或 LTE 上传输到远程 Ubuntu 服务器。
TL;DR:使用 mdns-repeater/avahi-daemon 和 OpenVPN,我仍然无法将 mDNS 请求从 eth0 传递到 tun0。
首先,我知道我需要一个支持镜像的 Ubuntu/Linux/Unix 操作系统的 AirPlay 接收器(希望是开源的)。我找到了一个,大多数适用于 Mac OS/Windows,或者根本不支持镜像。经过一番搜索,我发现魔镜中的奴隶,一个可以运行和工作的开源 Linux AirPlay 服务器/接收器(基于我的调试,因为我无法物理访问我运行它的服务器)。
现在,我知道 AirPlay 只能在 LAN 上运行(当时不理解 Bonjour 为何只能在同一个子网上工作),所以我研究了一些 VPN 选项。OpenVPN 似乎是最灵活且最容易设置的。为了加快速度并确保在设置 OpenVPN 时不会犯任何错误,我使用了来自这里。经过测试,运行完美,VPN 连接无 DNS 泄漏,所有流量均成功通过 VPN 路由。
我有 VPN,就好像我的设备现在在服务器的 LAN 上一样,并且 Magic Mirror(AirPlay 服务器)中的 Slave 已成功运行。所以它现在应该可以正常工作了,对吧?毫不奇怪,它没有工作,因为我不明白 AirPlay 服务器实际上会发出 mDNS/Bonjour 请求(或探测?真正的术语现在我记不清了……)。作为家庭常规用户,由于这些 mDNS 请求是零配置(零配置),这真是太棒了!但作为企业或商业用户,很难跨 VLAN 工作。
通过研究,我最终得出的结论是,我需要某种 mDNS 中继器/代理/桥接设置。我最终选择了 mDNS 中继器。我尝试使用了一些程序。
Avahi 守护进程 Avahi 似乎是最受关注和记录最多的,所以我决定使用它。我编辑了配置文件以允许 配置位置 /etc/avahi/avahi-daemon.conf
[reflector]
enable-reflector=yes
和
[server]
allow-point-to-point=yes
乍一看,在调试模式下运行 Avahi Daemon(avahi-daemon --debug)似乎有效,但是一旦运行 Magic Mirror 中的 Slave(在 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-repeater eth0 tun0 -f
只需添加您想要重复请求的接口和用于前台/调试的 -f。就是这样!我在 Magic Mirror 中运行了 Slave,mdns-repeater 成功检测并重复了请求(至少根据其日志)。但遗憾的是,运行tcpdump
与所见相同的命令,请求仍然没有通过隧道(tun0)。
现在,从我的调试结果来看,我只能得出这样的结论:要么是 iptables/防火墙的原因,要么是 OpenVPN 以某种方式过滤了端口或请求。在 OpenVPN 的配置中找不到与过滤相关的任何内容,于是我转向了 iptables 理论。但运行iptables -L
没有任何结果,实际上 iptables 中没有任何规则。
我对 iptables 了解甚少,不知道这是否是原因。为了我自己的调试,我添加了所有我能找到的与允许 mDNS / Bonjour / AirPlay 相关的不同 iptables 规则。似乎没有什么帮助。
非常感谢大家的帮助!我知道这篇文章很长,我不希望任何小问题被忽略。
TL;DR:使用 mdns-repeater/avahi-daemon 和 OpenVPN,我仍然无法将 mDNS 请求从 eth0 传递到 tun0。
答案1
不知道答案,但首先 tun 接口不支持广播。如果你使用 tap,它们会支持。虽然 OVPN 文档中似乎使用 tap 进行桥接,但你可以在使用 tun 的配置中使用它们。它们的行为几乎相同,但当你使用 ifconfig 时,它们会指示 BROADCAST 为支持的选项。