garbagetown

個人の日記です

VirtualBox (3)

仮想マシンにインストールしたゲスト OS は、デフォルトの設定のまま物理 LAN やインターネットに接続できますが、ホスト OS からゲスト OS にアクセスすることはできません。
このままでは不便なので、ホスト OS からゲスト OS にアクセスできるようゲスト OS にネットワーク設定を追加します。

VirtualBox のネットワークアダプタ

VirtualBox 3.1.6 時点では、仮想マシンに対して下記四つのうちいずれかのタイプのネットワークアダプタを設定できます。

  • NAT
  • ブリッジネットワーク
  • 内部ネットワーク
  • ホストオンリー ネットワーク

これらのうち複数のネットワークアダプタを設定することも可能で、各ネットワークアダプタの動作は下記の通りです。

NAT

VirtualBox のデフォルトの設定です。その名の通りゲスト OS は自身のアドレスをホスト OS にて NAT 変換することで物理 LAN やインターネットに接続します。
NAT を使用する場合、ネットワークアダプタに設定される IP アドレスは仮想 LAN に閉じたものが設定されるため、物理 LAN の IP アドレスを消費しません。
VirtualBox の場合、NAT ネットワークアダプタには 10.0.2.0/24 の IP アドレスが割り当てられ、ゲスト OS から見える ホスト OS の IP アドレスには 10.0.2.2 が設定される仕様のようです。
このため、ゲスト OS から 10.0.2.2 に対して ping を発行するとホスト OS から応答がありますが、ホスト OS には 10.0.2.0/24 系のネットワークインタフェースが存在しないため、ゲスト OS は見えません。当然、ホスト OS が存在する物理 LAN 上の他のマシンからもゲスト OS は見えません。

ブリッジネットワーク

ゲスト OS はホスト OS のネットワーク設定をブリッジしてホスト OS と同じネットワークに接続します。
ゲスト OS は物理 LAN の IP アドレスを消費するので、大学や企業内など IP アドレスの使用に制限がある環境では使用できないことが多いでしょう。
ゲスト OS はホスト OS と同じネットワークに接続するので、ホスト OS はもちろん、ホスト OS が存在する物理 LAN 上の他のマシンからもゲスト OS が見えます。

内部ネットワーク

仮想マシンを複数起動したときに各マシン間を繋ぐためのネットワークアダプタらしいのですが、後述するホストオンリーネットワークで事足りてしまったので検証していません。

ホストオンリーネットワーク

ホスト OS と ゲスト OS を双方向に接続するネットワークアダプタです。
VirtualBox をインストールするとホスト OS にホストオンリーネットワーク用に「VirtualBox Host-Only Network」という仮想ネットワークインタフェースが作成され、ホスト OS はこの仮想 NIC を使用して仮想 LAN に接続します。
VirtualBox の場合、ホストオンリーネットワークアダプタには 192.168.56.0/24 の IP アドレスが割り当てられ、ゲスト OS から見える ホスト OS の IP アドレスには 192.168.56.1 が設定される仕様のようです。
このため、ゲスト OS から 192.168.56.1 に対して ping を発行するとホスト OS から応答があります。また、NAT ネットワークアダプタとは異なり、ホスト OS にも 192.168.56.0/24 系の仮想ネットワークインタフェースが存在するため、IP アドレスを指定してゲスト OS にアクセスすることが可能です。

NAT とホストオンリーネットワーク

企業内LAN 等において、ゲスト OS を Web アプリケーション等の検証用に用いる場合の要件は下記の通りです。

  • ゲスト OS は物理 LAN の IP アドレスを消費しない
  • ゲスト OS から物理 LAN およびインターネットに接続可能
  • ホスト OS からゲスト OS に IP アドレスを指定して接続可能

仮想マシンのネットワークアダプタ 1 に「NAT」を、ネットワークアダプタ 2 に「ホストオンリーネットワーク」を設定することで、この要件を満たすことが可能です。
ゲスト OS は NAT ネットワークアダプタを使用して物理 LAN やインターネットに接続するため、物理 LAN の IP アドレスを消費しません。
ゲスト OS とホスト OS はホストオンリーネットワークアダプタを使用することで IP アドレスを指定して双方向に通信可能です。

ネットワークアダプタの設定

仮想マシンにネットワークアダプタを追加します。[設定] をクリックします。



仮想マシンの設定ダイアログが表示されるので、画面左側のメニューから「ネットワーク」を選択し、「アダプタ 2」タブをクリックします。



「ネットワークアダプタを有効化」にチェックを入れ、「割り当て」に「ホストオンリー アダプタ」を選択します。名前やアダプタタイプ、MAC アドレスはデフォルトのままから変更する必要はありません。
内容を確認したら [OK] をクリックします。



仮想マシンの詳細情報にネットワークアダプタ 2 が追加されたことを確認したら [起動] をクリックします。



ゲスト OS が起動したらユーザ名とパスワードを入力してシステムにログインします。


ネットワークの設定

ホスト OS から IP アドレスを指定してゲスト OS にアクセスできるようにするため、ゲスト OS の IP アドレス設定を DHCP から静的アドレス指定に変更します。
以下の通り /etc/network/interfaces を編集します。address の末尾は自由に設定して構いません。ここではそれぞれ 10.0.2.101 と 192.168.56.101 を設定しました。

$ sudo cp -p /etc/network/interfaces /etc/network/interfaces.org
$ sudo vi /etc/network/interfaces
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet static
address 10.0.2.101
netmask 255.255.255.0
network 10.0.2.0
broadcast 10.0.2.255
gateway 10.0.2.2

# The secondary network interface
auto eth1
iface eth1 inet static
address 192.168.56.101
netmask 255.255.255.0
network 192.168.56.0
broadcast 192.168.56.255

/etc/network/interfaces を編集したらネットワークを再起動します。

$ sudo /etc/init.d/networking restart
 * Reconfiguring network interfaces...                  [ OK ]

ネットワークが再起動したら設定を確認します。

$ sudo ifconfig
eth0      Link encap:イーサネット  ハードウェアアドレス 08:00:27:f5:be:6c
          inetアドレス:10.0.2.101  ブロードキャスト:10.0.2.255  マスク:255.255.255.0
          inet6アドレス: fe80::a00:27ff:fef5:be6c/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:65 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:107 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:5438 (5.4 KB)  TXバイト:10852 (10.8 KB)
          割り込み:10 ベースアドレス:0xd020

eth1      Link encap:イーサネット  ハードウェアアドレス 08:00:27:2a:0a:cf
          inetアドレス:192.168.56.101  ブロードキャスト:192.168.56.255  マスク:255.255.255.0
          inet6アドレス: fe80::a00:27ff:fe2a:acf/64 範囲:リンク
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:141 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:167 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:1000
          RXバイト:13951 (13.9 KB)  TXバイト:21114 (21.1 KB)
          割り込み:9 ベースアドレス:0xd240

lo        Link encap:ローカルループバック
          inetアドレス:127.0.0.1  マスク:255.0.0.0
          inet6アドレス: ::1/128 範囲:ホスト
          UP LOOPBACK RUNNING  MTU:16436  メトリック:1
          RXパケット:77 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:77 エラー:0 損失:0 オーバラン:0 キャリア:0
          衝突(Collisions):0 TXキュー長:0
          RXバイト:22331 (22.3 KB)  TXバイト:22331 (22.3 KB)

eth0 や eth1 が認識されていない場合は、ゲスト OS が仮想 NIC の MAC アドレスをキャッシュしている可能性があります。
以下の通り /etc/udev/rules.d/70-persistent-net.rules を編集してください。

$ sudo cp -p /etc/udev/rules.d/70-persistent-net.rules /etc/udev/rules.d/70-persistent-net.rules.org
$ sudo vi /etc/udev/rules.d/70-persistent-net.rules

SUBSYSTEM=="net"で始まる行を削除し、/etc/udev/rules.d/70-persistent-net.rules を次のような状態に編集します。

# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

/etc/udev/rules.d/70-persistent-net.rules を編集したら、再度ネットワークを再起動し、ネットワークの設定を確認します。

$ sudo /etc/init.d/networking restart
 * Reconfiguring network interfaces...                  [ OK ]

$ sudo ifconfig
(snip)

以上でネットワークの設定は完了です。ホスト OS から TeraTrem 等でゲスト OS にリモートログインできることを確認します。