Help us understand the problem. What is going on with this article?

VirtualBox上ゲストOSにssh接続する&ゲストOSからインターネット接続できるようにする。

More than 1 year has passed since last update.

目標

VirtualBox上OSで作業するとき、ホストOSとの画面の切り替えがめんどくさかったり、ゲストOS内でブラウザの処理が遅かったり、言語などのOS設定のカスタマイズが必要だったり、案外手間が多い。そこで、VirtualBoxからはバックグラウンドでOSを立ち上げ、puttyなどでゲストOSに接続する方法を紹介する。その際、ゲストOSがインターネット接続可能な設定を行う。また、最後に、ゲストOSを jupyter notebook のサーバとして動作させる例を挙げる。

設定の概略

ホストOS-ゲストOS間に二つのネットワーク設定を構築する.一つは,ホストOSからゲストOSにssh接続する用のネットワーク "Host-Only Adapter" ,もう一つは,ゲストOSからインターネットに接続するためのネットワーク "NAT" である.本ブログではこれらの設定の仕方を解説する.

実行環境

  • ホストOS: Windows 10
  • ゲストOS: Ubuntu18
  • VirtualBox version 5.2.7 ※ 今回はUbuntで設定しましたが,Linux系OS であればほぼ同様の操作で同じことができるはずです.

VirtualBox上の設定

(i) まず,VirtualBoxマネージャーの画面から,「ファイル」->「環境設定」->「ネットワーク」とたどり,"ホストオンリーネットワーク" のタブを開き,既に存在する "VirtualBox Host-only Ethernet Adapter" を右クリックし,「ホストオンリーネットワークを編集」を選択する.もし,存在しない場合は,右のアイコンから新しく作っておく.
(追記)新しい Virtual Box のバージョンでは,マネージャーを立ち上げて,右上のグローバルツールからホストネットワークマネージャーを開く.

host-network-manager.png

次の二つの操作を行う.
1. 「アダプター」タブの "IPv4" のアドレスをメモしておく.また, "IPv4 ネットマスク" が "255.255.255.0" になっていることを確認する.
2. 「DHCPサーバ」タブを開き,「サーバーを有効化」のチェックを外す.これはゲストOSのネットワーク設定を手動で設定するときに,DHCPで設定されたIPアドレスと被ることを防止するために一応設定しておく.

(ii) 次に,VirtualBox でゲストOSのネットワーク設定を開く.Adapter 1のタブを開き,"NAT"にする.

VM-nat.png

(iii) 次に,Adapter 2のタブを開き, "ホストオンリーアダプター" に設定する。"高度" の項目は特に変更を加えていない。

VM-host.png

ゲストOS上の設定

まずは,VirtualBox上で設定した二つのネットワークにつながっているゲストOS上のネットワークアダプタの名前を知る必要がある.
$ ip aコマンドでネットワークデバイスの情報を確認する.

ip-a.png

"enp0sx" のようなアダプタが二つあり,番号の若いほうが "NAT" で,大きいほうが"ホストオンリーアダプタ"と思ってよい.次は "ホストオンリーアダプタ" である "enp0s8" の設定を変更する.

今回は設定を変更する方法を三つ紹介する.どれかひとつをやればよい.
1. GUI を使ってサクッと変更する.
2. Ubuntu のバージョン16 以下の設定方法(/etc/network/interfaces)
3. Ubuntu のバージョン17 以上の設定方法(/etc/systemd/network/nep0s8.network)
CentOSでは "/etc/sysconfig/network-scripts/ifcfg-enp0s8" を編集する方法があるらしい.


1: GUI でホストオンリーネットワーク設定

Ubuntu の場合,右上のメニューからネットワークインターフェース (この例ではenp0s8)を選択して,Address を変更する.Gateway は空で,DNS はホストネットワークマネージャーで見たアドレスにする.

enp0s8.png

設定を反映するためネットワークを再起動する.

$ sudo service networking restart # centOS の場合はsystemctl restart network.service

ip aでネットワーク設定を確認してみて,まだ変わってない場合はシステムごと再起動する.

2: GUI 使わないでUbuntu 16 以上の設定

"/etc/network/interfaces" を次のように変更する.

interfaces.png

ここでポイントとなるのは,
1. address に設定したい IP アドレスを指定すること
1. dns-nameservers にホストネットワークマネージャーでみたアドレスを設定すること
2. gateway はあえて設定しない.デフォルトゲートウェイは NAT のenp0s3 の方を使いたいから.
2. 他は適切に設定する

設定を反映するためネットワークを再起動する.

$ sudo service networking restart # centOS の場合はsystemctl restart network.service

ip aでネットワーク設定を確認してみて,まだ変わってない場合はシステムごと再起動する.

3: GUI 使わないでUbuntu 17 以上の設定

"/etc/systemd/network/enp0s8.network" というファイルを作り,次のように記入する.

[Match]
enp0s8

[Network]
Address=192.168.151.100
DNS=192.168.151.1

設定を反映するためネットワークを再起動する.

$ sudo service networking restart # centOS の場合はsystemctl restart network.service

ip aでネットワーク設定を確認してみて,まだ変わってない場合はシステムごと再起動する.

ネットワークが正しく設定できているか確認

最後にネットワークの設定を確認してみる.route コマンドで,デフォルトゲートウェイが "NAT" ネットワークに接続している "eth03"のみになっていることを確認する.もしデフォルトゲートウェイが二つ以上ある場合,(特にeth08に設定されている場合)間違ったルーティングでパケットを送信してしまうため,インターネット接続が確立できない場合がある.

route.png

インターネット接続を試してみる.

ping google.com 等で接続を試す.ネットワークがつながってない場合,NAT 側のルーティングに問題があることが考えられる.

ssh 接続できるか試してみる.

Tera Term などの ssh アプリケーションでログインを試してみる.
ログイン先は,ネットワーク設定で変更したアドレスで,上の例では 192.168.151.100 に当たる.

teraterm.png

もしもssh接続できない場合

  • openssh-serverをインストールしてあるか確認する。
  • SELinuxを無効にし,ファイアウォールの設定を無効にしてあるか確認する.下の「鍵認証で"refused"される場合」を参照
  • ゲストOSのsshの認証設定(鍵認証orパスワード認証)が認識とあっているか確認する.

おまけ:鍵認証で"refused"される場合

puttyで鍵認証ログインするとき、正しく公開鍵を設定したにもかかわらず拒否される場合がある。getenforceコマンドでEnforcingとなっている場合、SELinuxが原因となっている可能性がある。setenforce 0コマンドでSELinuxを一時的に無効にしたり、

# vi /etc/selinux/config
SELINUX=disabled

で永続的に無効にしたりすると治る。
(参考:https://eng-entrance.com/linux-selinux、http://next49.hatenadiary.jp/entry/20140620/p1)

おまけ:ゲストOSをバックグラウンドで立ち上げる方法

ゲストOSはssh経由で操作するため、ゲストOSの画面は使わない。画面を起動するだけむだにグラフィック処理が走る。そこで、VirtualBoxでゲストOSの画面を立ち上げずにバックグラウンドでゲストOSを起動する。

「起動」の脇のメニューから、「ヘッドレス起動」を選択することで、バックグラウンドでOSを立ち上げることができる。
vm07.png

おまけ:Jupyter notebook を使う例

ゲストOSでjupyter notebook のサーバを立ち上げて、ホストOSのウェブブラウザから表示することができる。
まず、ゲストOS上で、8888ポートからの接続を受け付けるようにFireWallの設定を変更する必要がある。

$ sudo firewall-cmd --add-port=8888/tcp --zone=public --permanent
success
$ sudo firewall-cmd --reload
success

また,SELinuxをオフにすれば,FireWallもオフのままになるはず.基本的にオフっておけ.

ゲストOSでjupyter サーバを立ち上げる。

jupyter notebook --ip=[IP Address] --no-browser

すると、ホストOSから、http://[IP Address]:8888で接続できる。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした