えんでぃの技術ブログ

えんでぃの技術ブログ

ネットワークエンジニアの視点で、IT系のお役立ち情報を提供する技術ブログです。

【VirtualBox】VirtualBoxの基本と仮想ネットワークを紹介

f:id:stopendy:20181027131833p:plain

前の記事

「そもそも仮想化って何?」という方は、先にこちらをご覧ください。

endy-tech.hatenablog.jp

本記事で紹介すること

本記事では、VirtualBoxを使いこなすうえで必要となる、基本概念を紹介します。

仮想化の基礎知識と、VirtualBoxの仮想ネットワークを中心に紹介します。

具体的な操作手順は別記事に譲り、ここでは概念を紹介します。

VirtualBoxの概要

VirtualBoxとは

WindowsやMacに対応する無料のサーバー仮想化ソフトです。

Windowsの場合、他にVMware Workstation Playerも無料の仮想化ソフトとして使えます。
Macの場合、有償ですがVMware Fusionという製品があります。

サーバー仮想化とは

いわゆるVM (Virtual Machine: 仮想マシン) を作る機能です。

あるOSの中に別のOSを立ち上げることができます。

サーバー仮想化にもホスト型、ハイパーバイザ型、コンテナ型などいくつか種類があります。
VirtualBoxは、サーバー仮想化の中でも「ホスト(OS)型」に分類されています。

各種サーバ仮想化ソリューションの構成は、下図のようになっています。
VirtualBoxはホストPC上のアプリケーションとして動作し、VMを管理する役割を持っています。

f:id:stopendy:20180930181027p:plain

仮想化のタイプ別のメリット/デメリットの概要は以下になります。

f:id:stopendy:20181006114446p:plain

VirtualBoxを含むホストOS型の仮想化は無償の製品が多く手軽に導入できます。
世の中でも多くの人が使っており、先人の知恵が多く蓄積されています。
ホストOS型の仮想化製品は、まさに学習用途にうってつけなのです。

VirtualBoxの仮想ネットワークについて

サマリ

VirtualBoxの操作方法は別記事で紹介することとして、ここではVirtualBoxで唯一の難しい概念である仮想ネットワークについて説明します。

仮想ネットワークには以下のバリエーションがあります。

  • NAT
  • 内部ネットワーク
  • ホストオンリーアダプター
  • NATネットワーク
  • ブリッジアダプター
  • 汎用ドライバー

多くの場合、ホストオンリー、NAT、ブリッジがあれば事足ります。

機能のサマリは以下のようになっています。

f:id:stopendy:20181027125427p:plain

これだけ種類があると、どう使ったものか迷ってしまいますよね。
私は以下のように使い分けています。
どの機能も必要な場合、1つのVMに3つのネットワークインターフェースを追加しています。

  • Host PCからVMに通信させたいとき (SSH接続や、サーバを立てた後にブラウザで試験的にアクセスする時のため)。VM同士を通信させたいとき (ホストオンリーはどんな場合でも追加すべきです) → ホストオンリー
  • VMからHost PCの外部 (特にインターネット) に通信させたいとき (外部からVMにはアクセスさせない) → NAT
  • VM同士を通信させる、かつホストオンリーとはネットワークセグメントを分けたいとき (仮想マシンでルーティングやNAT、プロキシさせたいときなど) → 内部ネットワーク

外部からVMにアクセスさせたい場合は、以下のどちらかで対処します。

  • 基本的には ブリッジ を利用する
  • Host PCが属するネットワークのIPアドレスをVMに割り当てられない場合 (例えば、自分が管理していないネットワークから固定のIPアドレスをアサインされているとき) → NAT + ポートフォワーディング を利用する

NATネットワークと汎用ドライバーについては、恐らく今後も利用することはないと思います。

次に、各仮想ネットワークの詳細を説明します。

NAT

説明

VMがHost PCの外部 (インターネットなど) にアクセスするために利用します。

NATに指定したインターフェースのIPアドレスは、VirtualBoxに組み込まれたDHCPサーバ機能によって自動的にアサインされます。
ユーザはどのIPがアサインされるかを意識する必要はありません。

ホストPCの物理インターフェースのIPアドレスにNAPTしていますので、デフォルトの設定ではHost PC外部からVMに通信を開始することはできません (できるのは折り返し通信のみ)。

最後に注意点ですが、NATに設定したインターフェースで、VM同士は互いに通信できません。
VM同士通信させたい場合は、ホストオンリーか内部ネットワークのインターフェースを使うのが一般的です。

(参考) ポートフォワーディングによってホストPCとVMのIPアドレスとポート番号を紐づけることで、インターネットからVMにアクセスできるようになります。
IPアドレスの部分を空白にすると、any扱いとできるようです
https://www.virtualbox.org/manual/ch06.html#natforward
https://blogs.oracle.com/scoter/networking-in-virtualbox-v2#NAT-PF

公式マニュアルによると、NATには制限があるとのことなので、こちらも目を通しておいた方が良さそうです。
私は今までに困ったことはありませんが、ポートフォワーディングでホストPC側の1023以下のポート番号を設定してもうまく動かないなどあるとのことです。
https://www.virtualbox.org/manual/ch06.html#nat-limitations

論理構成

f:id:stopendy:20180930184305p:plain

設定方法

NATを使うための事前設定は不要です。
ホストPCが外部ネットワークと通信可能な状態であり、VM側でDHCPを利用する設定さえすれば通信できます。

ここからは参考情報です。

NATインターフェースに振られるIPアドレスは10.0.x.0/24から払い出されるのがデフォルトですが、この払い出し元のIPアドレスは変更することができます。
この設定変更はVirtualBoxのGUIからはできず、VBoxManageというCLIプログラムを使って変更します。
どうしても変更できない既存のIPアドレスと重複している場合を除き、この設定は基本的に不要です。

(参考) 公式マニュアル https://www.virtualbox.org/manual/ch09.html#changenat

以下にコマンドサンプルを載せます。
コマンドの存在は確認済みですが、実際には使ったことはありません。

# Windowsの場合
# --natnet の後の数値には、1以上の数値が入る。インターフェース番号と対応する
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" modifyvm "<仮想マシン名>" --natnet1 "192.168.100.0/24"

# (参考) VBoxManageのヘルプ
"C:\Program Files\Oracle\VirtualBox\VBoxManage.exe" 

ホストオンリー

説明

ホストオンリーは、VM - Host PC間、VM間の通信を実現するネットワークです。

特殊な事情がなければ、全てのVMにホストオンリーのインターフェースを1つは搭載すべきです。
ホストPCからSSHアクセスすればコピペできますし、SCPでファイルのやりとりをすることもできます。
多くの検証では、VM間の通信もできた方が都合が良いと思います。

ホストオンリーに設定したインターフェースには、固定のIPアドレスを振ることもDHCPで動的にIPアドレスを振ることもできます。

論理構成

f:id:stopendy:20181027130037p:plain

設定方法

ホストオンリーネットワークは、使用する前に事前にサブネットやDHCPサーバの設定を定義する必要があります。

ファイル > ホストネットワークマネージャーから設定できます。
(または、画面右上のグローバルツール > ホストネットワークマネージャー)

まだ1つもホストオンリーネットワークがない場合は、「作成」ボタンから追加しましょう。
設定項目は以下の通りです。

アダプターにはHost PC側のIPアドレスの設定を入れます。

f:id:stopendy:20181027125424p:plain

上記のサンプル設定では、VMに対して静的なIPアドレスを192.168.10.2-199の範囲で割り振ることができます。
VM側でDHCPを利用する設定とした場合、192.168.10.200-254の範囲でアドレスが割り振られます。

内部ネットワーク

説明

VM同士が通信する専用のネットワーク設定です。
このインターフェースでは、同じ内部ネットワークに所属するVMとは通信できますが、他のホストとは一切通信できません。

VM同士で通信させるだけなら、ホストオンリー (、NATネットワーク、ブリッジ) でも可能です。
多くの場合、ホストオンリーをVMに搭載すれば十分に要件を満たすでしょう。
ホストオンリーとは別に、内部ネットワークを追加で利用する場面は ネットワークセグメントを分割したいときだけ です。

論理構成

f:id:stopendy:20180930184316p:plain

設定方法

内部ネットワークを利用するための事前設定は不要です。

設定箇所は、 仮想マシンの設定 > ネットワーク > 名前 のみです。
複数のVMで同じ名前の内部ネットワークに接続すれば相互に通信可能、異なる内部ネットワーク間では通信不可です。

デフォルトの名前はintnetなので、特に理由がなければこの名前を使いましょう。

名前と紐づけて、ネットワークアドレスやサブネットマスクを設定することはありません。
VM上で任意のIPアドレス、サブネットマスクを固定で割り当ててください。

NATネットワーク

説明

※当ブログでは、NATネットワークは未検証です。ご了承ください。

NATネットワークは、NATとほぼ同じ機能です。
VMからホストPCの外部 (インターネットなど) にアクセスできますが、外部からVMにはアクセスできません。

NATと異なるところは、同じNATネットワークに所属するVM同士は、NATネットワーク越しに相互に通信できることです。
そして、NATネットワーク内部では静的にIPアドレスを割り当てることができます (DHCPも利用可能です)。

いつもNATインターフェースとホストオンリーインターフェースの組み合わせで賄っています。
このあたりは、純粋に好みの問題だと思います。

NATネットワークを設定すると、論理構成は以下のようになります。

論理構成

f:id:stopendy:20180930193616p:plain

設定方法

NATネットワークは、使用する前に事前にネットワーク名やサブネット情報を設定する必要があります

NATネットワークの設定は、VirtualBoxのファイル > 環境設定 > ネットワーク から変更できます。

ネットワーク名とネットワークアドレス、DHCPの有効化有無を設定できます。
デフォルトゲートウェイのアドレスや、DHCPの割り当て範囲については記載がありません。
公式マニュアルを確認しましたが、部分的にしかわかりませんでした。

"ゲートウェイのアドレスは、原則として先頭のアドレスが使用される。
しかし、変更される場合もある。"

https://www.virtualbox.org/manual/ch06.html#network_nat_service

DHCPの割り当て範囲については言及無し。
やはりこの機能は使いたくありません。。。

ブリッジアダプター

説明

VMがHost PCの物理インターフェースとL2スイッチ越しに接続されている (ブリッジ接続されている) かのような状況を作り出せます。
スタンドアロンの検証環境とHost PCを直結し、VMと検証環境で通信させたいときに便利でしょう。
家にネットワーク機器を購入しているエンジニアの方はよく使うと思います。

NATや内部ネットワークとの違いは、以下の通りです。

  • 通信に制限がない
    • NATはVM同士で通信できない。外部にアクセスできるが、外部からVMへはアクセスできない (ポートフォワーディングすれば別)
    • 内部ネットワークはVM同士しか通信できない
    • ブリッジは外部と双方向通信できる。ブリッジ設定したインターフェース越しに、VM同士も通信できる。ポート番号も変換不要で、そのまま使える

ブリッジの特徴は、VMがホストPCとは完全に独立しているかのように振舞えることです。

ブリッジネットワークに接続されたVMは外部 (インターネットなど) と双方向に通信でき、ポート番号も自由に使えます。

その分、気を付けなければならないこともあります。

外部からVMに直接アクセスできてしまうので、インターネットに接続する場合はVMのセキュリティを万全にしておく必要があります。

また、 ブリッジインターフェースと紐づいた物理ポートがLink Down (ケーブルを抜くなど) すると、ブリッジインターフェースも同時に使えなくなってしまいます。
従って、個人的にはブリッジインターフェースを利用する場合にも、ホストオンリーインターフェースを別途設定することをお勧めしています。
そうすれば、PCからケーブルが抜けた状態でも、ホストPCからVM間にSSHログインできる状態が継続されます。

VMのブリッジ設定したインターフェースにIPアドレスを設定するときですが、Host PCの物理インターフェースと同じネットワークのIPアドレスを割り振る必要があります。
IPアドレスの枯渇には注意してください。
自宅外のように、プライベートIPアドレスを自由にアサインできない環境では、ブリッジインターフェースの利用に不向きです (後述のようにDHCPでアドレスを受け取ることはできますが、そのような環境ではそもそもNATで十分でしょう)。

ブリッジインターフェースには、VirtualBox自体がDHCPサーバ機能を提供することはありません。
しかし、ブリッジ接続したネットワークにもともとDHCPサーバが存在した場合、VMもDHCPによってIPアドレスを受け取ることができます。

(参考) ブリッジインターフェースの説明
https://blogs.oracle.com/scoter/networking-in-virtualbox-v2#Bridged

論理構成

f:id:stopendy:20180930193627p:plain

設定方法

ブリッジを設定する前の事前設定は不要です。

ブリッジインターフェースをVMに設定するときに気を付けるポイントがあるので、そこだけ補足します。

まず、仮想マシンの設定 > ネットワーク > 割り当てで「ブリッジアダプター」を指定します。
その後、「名前」にブリッジアダプターと紐づけたいホストPCのインターフェースのドライバ名を指定します。

ブリッジは「ホストPCのインターフェースとL2接続する」仮想ネットワーク機能です。
ホストPCが複数のインターフェースを持っていた時に、どのインターフェースと紐づけるかを指定するためにこの工程があります。

ホストPCがインターフェースを1つしか持っていない場合は悩むことはありませんが、複数あると厄介です。

その場合は...頑張って調べてください。
Windowsの場合、コマンドプロンプトからipconfig /allで調べられます。
命名について、Windowsの場合、多くは「Realtek」という文字列を含んでいると思います。
Macの場合、Thunderboltなど接続規格の名前がついていると思います。

最後に

VirtualBoxは、無料で簡単に仮想マシンによる検証環境を作ることができる便利なデスクトップ仮想化製品です。
多くの設定は直観的に理解できると思いますが、仮想ネットワークだけは難解なのでここで説明してみました。

皆さんの自習に役立てばうれしいです。

質問は大歓迎です。
記事の改善のため、皆さんの疑問や感想、アドバイスを聞かせてください。
お願いします。