VirtualBoxでHostOSとGuestOSで相互にMySQLに接続してみる。

VirtualBox上で、GuestOS(CentOS)からHostOS(Windows)のMySQLに接続してみる。また逆にHostOS(Windows)からGuestOS(CentOS)のMySQLに接続してみたい。ネットワークは、デフォルトでNAT(Network Address Translation)になっていて、IPアドレスやポート番号の置換を行ってくれる。この設定によりGuestOSからただちにインターネットも利用できるが、この設定だけではHostOSからGuestOSへのアクセスができないようだ。NATでは、ゲートウェイ(HostOS側)が 10.0.2.2 で、DNSが 10.0.2.3、GuestOS側のアドレスが 10.0.2.15 になっている。このアドレスは固定らしい。(※変更できるのかもしれないが、触れないことにする)
WindowsからCentOSに接続するには、新たにVirtualBox Host-Only Networkを設定する必要がある。手順をメモしておく。

(1) アダプタにVirtualBox Host-Only Networkを追加する。

  • VirtualBoxマネージャでCentOSを選択し、設定-->ネットワークを開く。
  • アダプタ2タブを選択し、「ネットワークアダプターを有効化」をチェックし、「ホストオンリーアダプタ」を選択する。
  • VirtualBoxマネージャで、ファイル-->環境設定-->ネットワーク-->ホストオンリーネットワークタブを開く。
  • ホストオンリーネットワークの編集ボタンを押し、IPアドレスが確認できる。192.168.56.1 になっている。 
  • CentOSを起動し、root権限でログインする。
  • /etc/sysconfig/network-scripts/を覗いてみる。デフォルトで「ifcfg-enp0s3」というのがある。「enp0s3」はCentOS7.0から登場したものらしい。以前の「eth0」に相当するものらしい。以下のように修正しておく。


# cd /etc/sysconfig/network-scripts
# vi ifcfg-enp0s3
・・・
BOOTPROTO=static
IPV6INIT=no
ONBOOT=yes
・・・

  • そして配下に、ifcfg-eth1 を新規に作成する。ネット情報を参考に以下のようにした。「eth1」ではなく「enp0s8」とするのがCentOS7.0らしいのかもしれない。とりあえず「eth1」としておいた


# cd /etc/sysconfig/network-scripts
# vi ifcfg-eth1
DEVICE=eth1
TYPE=Ethernet
ONBOOT=yes
BOOTPROTO=static
HWADDR=08:00:27:21:F5:FD
NAME="Adapter2 eth1"
IPADDR=192.168.56.101
NETMASK=255.255.255.0
NETWORK=192.168.56.0

# systemctl restart network
# systemctl status network

  • IPADDRの101は適当に。1より大きければよさそう。
  • HWADDRは、VirtualBoxマネージャの「設定-->ネットワーク-->アダプタ2-->Macアドレス」で事前に確認しておく。私の環境では、08002721F5FDとなっていた。HWADDRは、08:00:27:21:F5:FDのように指定する。
  • Windowsでifconfigしてみる。

・・・
イーサネット アダプター VirtualBox Host-Only Network:

接続固有の DNS サフィックス . . . . .:
リンクローカル IPv6 アドレス. . . . .: fe80::dcb4:ab27:522c:9b3b%12
IPv4 アドレス . . . . . . . . . . . .: 192.168.56.1
サブネット マスク . . . . . . . . . .: 255.255.255.0
デフォルト ゲートウェイ . . . . . . .:

Windows(HostOS)側からSSH接続を確認してみた。私はTeraTermをインストールしているのでそれを使った。192.168.56.101 にSSH接続して、CentOSにログインできた。

(2) ファイアウォールMySQL用ポート=3306を設定する。

  • CentOSで、アプリケーション-->諸ツール-->ファイアウォールを開き、ゾーンタブをクリックして、publicゾーンのmysqlにチェックを入れる。
  • サービスタブでクリックして、mysqlを選択し、ポート=3306、プロトコル=tcpが設定されていることを確認する。

ここでちょっと確認しておこう。Adapter1:NATとAdapter2:VirtualBox Host-Only Networkの設定により、IPアドレスは以下のようになった。MySQLでは、これらのIPアドレスをホストとして指定して、ポート=3306でHostOSとGuestOS間でアクセスを可能にしたいのだ。


Adapter1:NAT
Windows(HostOS) = 10.0.2.2 <-- CentOSからアクセスする際に指定する
CentOS(GuestOS) = 10.0.2.15 <-- 明示的には利用しない
Adapter2:VirtualBox Host-Only Network
Windows(HostOS) = 192.168.56.1 <-- CentOSからアクセスする際に指定する
CentOS(GuestOS) = 192.168.56.101 <-- Windowsからアクセスする際に指定する

(3) WindowsMySQLCentOSからアクセスする。

Windows(HostOS)のMySQLには、CentOS(GuestOS)からは、NATを使って 10.0.2.2 でアクセスできる。またVirtualBox Host-Only Networkを使って 192.168.56.1 でもアクセスできる。Windows(HostOS)のMySQLに「dummy」というDBを作っているとしよう。リモートであるCentOS(GuestOS)からrootおよびdummyというユーザーで権限を設定してみよう。まずWindows側でmysqlコンソールを使う。パスワードは任意に。


# mysql -uroot -p mysql
mysql> grant all privileges on dummy.* to root@'10.0.2.2' identified by 'xxx' with grant option;
mysql> grant DELETE,INSERT,SELECT,UPDATE on dummy.* to dummy@'10.0.2.2' identified by 'xxx' with grant option;
mysql> grant all privileges on dummy.* to root@'192.168.56.1' identified by 'xxx' with grant option;
mysql> grant DELETE,INSERT,SELECT,UPDATE on dummy.* to dummy@'192.168.56.1' identified by 'xxx' with grant option;
mysql> flush privileges;
mysql> select host,user,password from user;
リモートのユーザーが登録できた。すべてのテーブルに対して、*.* を指定したり、すべてのリモートとして root@'%'や dummy@'%'のように指定してもいいはずだ。ただ私は理解を容易にするために、明示的にDBやホストを指定するようにしておく。では、CentOS(GuestOS)から接続を試みよう。

# mysql -h10.0.2.2 -uroot -p dummy
mysql> show tables;
mysql> exit;

# mysql -h192.168.56.1 -uroot -p dummy
mysql> show tables;
mysql> exit;

どちらもうまくいく。NATでもVirtualBox Host-Only NetworkでもWindows(HostOS)のMySQLにアクセスできた。

(4) CentOSMySQLWindowsからアクセスする。

今度は、CentOS(GuestOS)のMySQLに「dummy」というDBを作っておく。Windows(HostOS)からアクセスできるようにrootおよびdummyというユーザーで権限を設定してみる。先ほどの逆方向だ。まずCentOS側でmysqlコンソールを使う。Windows(HostOS)からはVirtualBox Host-Only Networkを使って 192.168.56.101 でアクセスできるはずだ。NATでは接続できないので、10.0.2.15 は使えない。


# mysql -uroot -p mysql
mysql> grant all privileges on dummy.* to root@'192.168.56.1' identified by 'xxx' with grant option;
mysql> grant DELETE,INSERT,SELECT,UPDATE on dummy.* to dummy@'192.168.56.1' identified by 'xxx' with grant option;
mysql> flush privileges;
mysql> select host,user,password from user;
リモートのユーザーが登録できた。CentOSのIPは 192.168.56.101 だが、HostOS=192.168.56.1 からのアクセスを許可する。では、Windows(HostOS)から接続を試みよう。GuestOS=192.168.56.101 に HostOS=192.168.56.1 から接続する。

# mysql -h192.168.56.101 -uroot -p dummy
mysql> show tables;
mysql> exit;
うまくいった。VirtualBox Host-Only NetworkでWindowsからCentOSMySQLにアクセスできた。