VirtualBoxのネットワーク鉄板設定 — NAT + Host-only

VirtualBoxをFreeBSDで使う場合、実は一つ大きな問題があります。 それは、bridgedネットワークに問題が存在するということです。

bridgedネットワークは、VMのネットワークをLANのHUBに直接差し込んで使うようなわかりやすさがあり、かつてはVMwareでもVirtualBoxでも定番のネットワーク設定でした。 しかし、最近のVirtualBoxではNATネットワークが標準になっています。 これは、自動設定が容易であるということと、VMの影響がホスト内にとどまり、物理ネットワークに影響を与えないというメリットがあるからです。

しかしNATネットワークでは、ホストからゲストへのSSHログインなどができないため、ゲストへログインしたい場合に、bridgedネットワークを選択したくなります。
ところが、FreeBSDホストでbridgedを使うと、奇妙な問題が起こります。LAN内の別のマシンからゲストへはSSHでログインできるのに、肝心のホスト自身からはつながらないのです。
FreeBSDホストでのbridgedの不具合は多数の報告が上がっていますが、原因の特定には至っていないようです。

そこで、これから紹介するNAT + host-onlyという2つのネットワーク経路を使った設定が広く利用されています。 この設定は、FreeBSDのbridgedネットワーク問題の回避というよりは、より安全な設定ということで、FreeBSD以外のホストでも標準的な構成として知られているものです。
Windows や Linux のホストの場合もこの設定をオススメします。

また、本格的なサーバー運用でも、サービス用のネットワークとサーバー管理用のネットワークを物理的に分離する設定が通常行われていて、今回紹介する設定はそれと似た安全な構成となっています。

なお、この記事では、NAT / host-only / bridgedの解説は行いません。それについては、こちらの記事をご覧ください。

もう少し詳しく知りたい場合は、こちらがオススメです。

公式ページはこちら

設定の概要

この設定を簡単に説明すると、NATを出口、host-onlyを入り口として使うものです。 ブラウザでWebを見たり、ftpでファイルを取得したりする場合に使う外界への出口としてNATを利用し、SSHでゲストにログインする場合にhost-onlyを利用するというものです。

VirtualBox側の設定(ホストで行う)

Adapter1はデフォルトでNATに設定されていると思います。

Adapter 1

Adapter2を有効にして、Host-only Adapter(ホストオンリー・アダプター)を選択します。

Adaper 2

Adapter Typeは、Intel PRO/1000 MT Desktop (82540EM) のままでOKです。

設定後、[OK]をクリックするのを忘れないでください。OKをクリックした時点で自動的にvboxnet0が作られますが、OKをクリックしないと作られないので、ネットワーク設定が完了しません。(既に作成済みの場合を除く)
vboxnet0 がないと、VMがエラーで起動しません。
VirualBox をバージョンアップしたときにVMが起動しないのはたいてい原因がこれで、その場合はこのメニューを開いて[OK]をクリックするだけで vboxnet0 が作られて起動するようになります。覚えておくと良いでしょう。

ゲスト側の設定

注意点としては、ゲストの設定で両方をDHCPにしないことです。host-onlyについては、SSHでアクセスするため固定IPにします。

  • Adapter1 — NAT — DHCP(IP自動割当)

  • Adapter2 — host-only — 固定IP

両方DHCPにしてしまうと、gatewayを両方に設定しようとして取り合いとなり、ルーティングがうまく機能しません。

host-onlyに割り当てるIPアドレスですが、host-onlyのvboxnet0のネットワークはデフォルトで192.168.56.xになっているので、xには1以外の任意の数値(2〜254の範囲)を割り当てます。192.168.56.1はホストのアドレスになっています。ちなみに、vboxnet1は192.168.57.x、vboxnet2は192.168.58.xという具合になっていて、ホストマシンの中に複数のネットワークを構築できるようになっています。

gatewayはNAT側で自動的に設定されるので、host-only側には設定する必要はありません。

FreeBSDゲストの設定

FreeBSDでは、Intel PRO/1000 MT Desktop (82540EM) はemというデバイス名になります。

  • em0 — NAT

  • em1 — host-only

ネットワークの設定は、/etc/rc.conf に以下の行を追加することで行います。

ifconfig_em0="DHCP"
ifconfig_em1="inet 192.168.56.x"
sshd_enable="YES"

192.168.56.xの x には任意の数値(2〜254)を入れます。 編集が終わったら、

$ doas service netif restart

で有効化できます。(sudoをお使いの場合は、doasをsudoに置き換えてください)

これで、ホストからは ssh 192.168.56.x でアクセスできるようになります。 /etc/hostsに適当なホスト名を登録しておくと、ssh ホスト名 でアクセスできて楽になります。

/etc/hostsへの追記例:

192.168.56.x fbsd

$ ssh fbsd

Ubuntuゲストの設定

FreeBSDではrc.confに数行追加するだけで済みましたが、Ubuntuのネットワーク手動設定はかなり厄介です。

Ubuntuでは、NICのデバイス名が環境によって異なります。まず現在のインターフェース名を確認してください。

$ ip link show

出力例:

1: lo: ...
2: enp0s3: ...
3: enp0s8: ...

通常、Adapter1(NAT)がenp0s3、Adapter2(host-only)がenp0s8になります。

UbuntuはNetplanでネットワークを管理しています。設定ファイルは/etc/netplan/以下にあります。ファイル名は環境によって異なりますが、00-installer-config.yamlまたは50-cloud-init.yamlが多いです。

既存の設定ファイルを確認し、以下の内容になるよう編集します。

$ sudo nano /etc/netplan/50-cloud-init.yaml

内容:

network:
  version: 2
  ethernets:
    enp0s3:
       dhcp4: true
    enp0s8:
       dhcp4: false
       addresses: - 192.168.56.xx/24

enp0s3がNAT(DHCP)、enp0s8がhost-only(固定IP)です。xxには任意の数値(2〜254)を入れます。host-only側にはroutesの設定は不要です。gatewayはNAT側が担います。

YAMLはインデントが重要です。スペースの数を変えないよう注意してください。

編集が終わったら、設定を適用します。

$ sudo netplan apply

これで、ホストからは ssh 192.168.56.x でアクセスできるようになります。 FreeBSDと同様に、/etc/hostsにホスト名を登録しておくと便利です。

/etc/hostsへの追記例(ホスト側):

192.168.56.x ubuntu

$ ssh ubuntu

また、初回接続時にパスワード認証が必要な場合は、Ubuntuゲスト側でsshdが有効になっているか確認してください。

$ sudo systemctl enable --now ssh

まとめ

今回紹介した設定で、VirtualBoxでのネットワーク利用については、ほとんどの場合に問題なく使えると思います。特段の必要がなければ、全てこの設定にしておくことをオススメします。

メリットとしては、VMへのアクセスがホストからに限定され、外部からのアクセスが遮断されているので、ファイアーウォールなどの設定が不要になることです。

bridgedネットワークだと構成は単純でネットワーク機能がフルに使えるのですが、ゲストでファイアーウォールなどセキュリティ設定に気を使う必要があります。

FreeBSDホストのVirtualBoxではbridgedアダプターで問題が発生することを説明しましたが、bridgedを必要とするような本格的なネットワークでは、VirtualBoxではなくbhyveという別の仮想化技術のほうが向いていると思います。実用上、今回紹介した設定をテンプレートとして覚えておけば問題ないでしょう。

VirtualBoxをFreeBSDで使う方法はこの記事で

いいなと思ったら応援しよう!