ネットワーク上の名前

このページでは 2 つの名前について説明します。Mac が名前でゲストに到達できるようにする、ゲスト自身の .local 名と、ゲストが解決するこの Mac の .local 名です。

ゲストの名前(mDNS)

標準ではオフです。オンにすると、名前でゲストに到達できます。

vphone-cli vm config <name> --mdns on
ping <vm-name>.local
設定効果
--mdns onゲストが <vm-name>.local に応答します。仮想マシン名の英字と数字以外の文字はハイフンになります:ipad_pro.13 は ipad-pro-13.local になります。
--mdns <name>ゲストが、選んだ別の名前に応答します。
--mdns offゲスト本来の名前に戻ります。

名前は none も含め、すべてのモードで使えます。

モード<name>.local の解決先
nat共有ネットワーク上のゲストのアドレスと、USB リンクのアドレス
bridgedLAN 上のすべてのデバイスからはゲストの LAN アドレス、Mac からは USB リンクのアドレスも
tunnel、noneゲストの USB リンクのアドレス(Mac からのみ)

ゲストには、ネットワークカードのほかに、USB で接続した iPhone が Mac に提供するのと同じネットワークリンクがあります。これは Mac 上で 169.254 のアドレスを持つ en インターフェースとして表示されます。このアドレスはリンクローカルですが、Mac はこのアドレスで直接ゲストに到達できるため、tunnel モードでも <name>.local への接続はポート転送なしでゲストのサービスに届きます。

知っておくべきこと:

  • ほかのデバイスがすでにその名前を使っている場合、mDNS はゲストの名前を変更します(name-2)。
  • vm rename は、--mdns on で仮想マシン名から作られた名前を変更します。手動で選んだ名前はそのまま残ります。
  • vm stop やウィンドウを閉じて停止した仮想マシンは、自身のアナウンスを取り消せません。Mac のリゾルバは、キャッシュされたレコードの期限が切れるまで古いアドレスを返し続けます。ホストアドレスの場合、これは 75 分(TTL 4500 秒)です。

vphoned は、vphone-vm が接続するたびにゲストのネットワーク設定(LocalHostName)に名前を設定し、ゲストの mDNSResponder がすべてのリンクでそれをアナウンスします。

ゲスト内でのこの Mac の名前

標準ではオンです。ゲストは、この Mac の mDNS 名(scutil --get LocalHostName に .local を付けたもの)を、ゲストが Mac に到達するためのアドレスにすぐに解決します。

モードゲスト内での <Mac>.local
nat共有ネットワーク上の Mac。通常は 192.168.65.1(--nat-peers off の場合は 192.168.64.1)
tunnelゲートウェイ(標準は 192.168.127.1)。ここへの接続は、QEMU や VirtualBox の 10.0.2.2 と同じように、Mac のループバック(127.0.0.1)に届きます
bridgedブリッジしたインターフェース上の Mac のアドレス

これを無効にするには:

vphone-cli vm config <name> --mac-name off

ゲストのリゾルバが返す内容と、各アドレスに接続できるかどうかを確認するには:

vphone-launchpad-cli guest rpc <name> network.resolve '{"host":"<Mac>.local","family":"ipv4","port":8000}'

必要な理由

mDNS だけでは、ゲスト内での Mac の名前の IPv4 検索が失敗することがありました。ゲストは USB リンク上でも Mac の応答を受け取りますが、そこでは Mac に IPv4 アドレスがないため「そのようなレコードはない」と応答します。最初に応答したリンクで検索結果が決まるため、IPv4 アドレスを必要とするアプリは、別のリンクからの正しい応答がキャッシュされるまでエラーを受け取っていました。また、検索結果では USB リンク上の Mac の 169.254 アドレスが先頭に来ていました。iOS は 169.254.0.0/16 をプライマリインターフェース経由でルーティングするため、そのアドレスに接続する通常のソケットは、何も応答しない en0 から送り出され、タイムアウトまで待たされることがありました。

vphoned は、/etc/hosts の行と同じように、ゲスト自身の mDNSResponder にローカルレコードとして名前を登録します。これにより、ネットワークに問い合わせることも、キャッシュした応答を使うこともなく、IPv4 の検索にその 1 つのアドレスですぐに応答します。登録は vphone-vm が接続するたびに行われ、vphoned の起動時にも行われるため、再起動後にアプリが動き出す前に名前が用意されます。ゲストのシステムボリュームは読み取り専用なので、/etc/hosts そのものは編集されず、どのネットワークにも何もアナウンスされません。IPv6 の検索は引き続き mDNS に送られます。

関連項目