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に設定されていると思います。

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

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で使う方法はこの記事で
