まず、私はネットワーキングとUnix/Ubuntu/Linuxディストリビューションの両方でまったく新しいです。ただの警告です。セットアップ/コードは少し見苦しいかもしれません。
基本的に、私の最終目標は、別のWi-FiネットワークまたはLTE上のiPhoneからリモートUbuntuサーバーへのAirPlayミラーリングを正常に行うことです。
TL; DR:mdns-repeater/avahi-daemonとOpenVPNを使用しても、eth0からtun0にmDNS要求を渡すことができません。
始めに、ミラーリング(そしてできればオープンソース)をサポートするUbuntu/Linux/UnixベースのOS用のAirPlayレシーバーが必要だとわかっていました。私は、ほとんどがMac OS/Windows用のカップルを見つけたか、ミラーリングをまったくサポートしていませんでした。もう少し検索したところ、 Slave in the Magic Mirror 、実行および動作するオープンソースのLinux AirPlayサーバー/レシーバー(実行したサーバーに物理的にアクセスできないため、デバッグに基づく)が見つかりました。それをオンにします)。
今、私はAirPlayがLAN上でのみ実行されることを知っていたので(当時、Bonjourが同じサブネット上でのみどのように機能するかを理解していませんでした)、いくつかのVPNオプションを調べました。 OpenVPNは、最も柔軟でセットアップが最も簡単なようでした。処理を高速化し、OpenVPNの設定を間違えないようにするために、 ここ から作成済みのスクリプトを使用しました。テストされ、完璧に機能し、VPNはDNSリークなしで接続し、すべてのトラフィックルートはVPNを介して正常に接続されます。
VPNを使用して、デバイスがサーバーのLAN上にあるかのように動作し、マジックミラー(AirPlayサーバー)のスレーブが正常に実行されています。だから今はうまくいくはずですよね?当然のことながら、AirPlayサーバーが実際にmDNS/Bonjourリクエスト(またはプローブ?本当の用語は今私の心を滑らせている..)を送信することを理解していなかったので、そうではありませんでした。家庭の従来のユーザーとして、これらのmDNS要求はzeroconf(ゼロ構成)であるため、これは驚くべきことです!しかし、企業またはビジネスユーザーとして、これをVLAN間で機能させることは困難です。
調査を通じて、ある種のmDNSリピーター/プロキシ/ブリッジタイプのセットアップが必要であるという最終結果を思いつきました。私はmDNSリピーターに行き着きました。私が使おうとした2つのプログラムがありました。
Avahi 最も話題になり、最も文書化されているようだったので、それを使用することにしました。設定ファイルを編集して、設定場所/etc/avahi/avahi-daemon.confを許可しました
[reflector]
enable-reflector=yes
そして
[server]
allow-point-to-point=yes
デバッグモード(avahi-daemon --debug)でAvahiデーモンを実行すると、一見機能しているように見えましたが、マジックミラーのスレーブ(eth0インターフェイスで実行、tun0インターフェイスで実行されているOpenVPN)が実行されると、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-repeater が次のオプションです。そして、これは正しく機能しているようです。 mdns-repeaterを
mdns-repeater eth0 tun0 -f
リクエストを繰り返し実行するインターフェースと、フォアグラウンド/デバッグ用の-fを追加するだけです。それでおしまい!マジックミラーでスレーブを実行すると、mdns-repeaterがリクエストを正常に検出して繰り返しました(少なくともそのログによると)。しかし悲しいことに、上記と同じtcpdump
コマンドを実行しても、リクエストはまだトンネル(tun0)を通過していません。
私のデバッグから、それはiptables /ファイアウォールまたはOpenVPNがポートまたはリクエストを何らかの形でフィルタリングしている原因であると結論付けることしかできません。 OpenVPNでのフィルタリングに関連する設定で何も見つからなかったので、iptables理論に移りました。しかし、実行中iptables -L
何ももたらさず、文字通りiptablesにはルールがありません。
Iptablesについてはほとんど知らないので、これが原因かどうかはわかりません。私自身のデバッグのために、mDNS/Bonjour/AirPlayを許可することで何かに関連して見つけることができるすべての異なるiptablesルールを追加しました。何も役に立たないようです。
ありとあらゆる助けに感謝します!私はこれが長い間読まれたことを知っています、私はどんな小さな問題も通り抜けたくありませんでした。
TL; DR:mdns-repeater/avahi-daemonとOpenVPNを使用しても、eth0からtun0にmDNS要求を渡すことができません。
MDNS要求を繰り返す代わりに、dns-sd
を使用してプロキシサービスレコードを作成できます。 mDNSレコードが利用可能なネットワークでdns-sd -Z _raop._tcp
を実行すると、次のようになります。
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
はAirplayサーバーのIPアドレスに置き換えられ、その他はすべてdns-sd -Z
から取得したものからコピーされます。これにより、AirPlayクライアントはサーバーを認識できるようになります。
注:ここで使用しているdns-sd
コマンドはmacOSに付属しています。私の知る限り、Linuxでは利用できませんが、avahiで同様のことを行うことができます。