VagrantでのDHCPを有効にしたhost only networkの作成に失敗する

これはなに

表題の件でvagrant upに失敗したので、原因究明の軌跡と解決策をメモしておく。

環境

問題

あるvagrantfileがあるディレクトリ下でvagrant upを実行したところ、下記のエラーがおきた。

$ vagrant up
# 前略
==> default: Clearing any previously set network interfaces...
A host only network interface you're attempting to configure via DHCP
already has a conflicting host only adapter with DHCP enabled. The
DHCP on this adapter is incompatible with the DHCP settings. Two
host only network interfaces are not allowed to overlap, and each
host only network interface can have only one DHCP server. Please
reconfigure your host only network or remove the virtual machine
using the other host only network.

DHCPを有効にして設定しようとしているホストオンリーネットワークインターフェースには、すでにDHCPが有効なホストオンリーアダプターが作成されており、競合しています。
このアダプターが接続しているDHCPは、DHCP設定との互換性がありません。 ホストオンリーネットワークインターフェースは重複できません。また、それぞれのホストオンリーネットワークインターフェースは1つのDHCPサーバーとしか接続できません。 ホストオンリーネットワークを再構成するか、他のホストオンリーネットワークを使用している仮想マシンを削除してください。

原因究明

ref. dhcp private_network fails on virtualbox · Issue #3083 · hashicorp/vagrant
こちらのIssueで原因の解説がしてあった。
以下は上記PRの解説を、補足を交えながら日本語訳したものである。

Vagrantfileでの設定

vagrantfileを覗いてみると、ホストオンリーネットワークをDHCPを有効にして設定しようとしている。

 # Create a private network, which allows host-only access to the machine
 # using a specific IP.
 # config.vm.network "private_network", ip: "192.168.33.10"
 config.vm.network "private_network", type: "dhcp"

VirtualBoxのネットワーク設定

VirtualBoxには組み込みDHCPサーバーを持っており、デフォルトで以下の設定がされている。

$ VBoxManage list dhcpservers
NetworkName:    HostInterfaceNetworking-vboxnet0
Dhcpd IP:       192.168.56.100
LowerIPAddress: 192.168.56.101
UpperIPAddress: 192.168.56.254
NetworkMask:    255.255.255.0
Enabled:        Yes
Global Configuration:
    minLeaseTime:     default
    defaultLeaseTime: default
    maxLeaseTime:     default
    Forced options:   None
    Suppressed opts.: None
        1/legacy: 255.255.255.0
Groups:               None
Individual Configs:   None

$ VBoxManage list hostonlyifs
# empty

この状態でvagrant upをした際、type: "dhcp"のprivate_networkに遭遇すると、ホストオンリーネットワークが作成され、インターフェースに以下が設定される。

$ VBoxManage list hostonlyifs
Name:            vboxnet0
GUID:            786f6276-656e-4074-8000-0a0027000000
DHCP:            Disabled
IPAddress:       172.28.128.1
NetworkMask:     255.255.255.0
IPV6Address:
IPV6NetworkMaskPrefixLength: 0
HardwareAddress: 0a:00:27:00:00:00
MediumType:      Ethernet
Wireless:        No
Status:          Up
VBoxNetworkName: HostInterfaceNetworking-vboxnet0

ホストオンリーネットワークとDHCPサーバーは同じネットワークHostInterfaceNetworking-vboxnet0にあるにもかかわらず、ホストオンリーアダプタのIPは172.28.128.1、対してDHCPサーバーのIPは192.168.56.100と、別のネットワークのIPが設定されてしまっている。
ここで、アダプターのネットワーク外のアドレスをDHCPサーバーには割り当てられないぞ!と怒られているらしい。

解決策

デフォルトで設定されてしまっているdhcpserverの設定を削除し、そのままvagrant upを再試行したところ、仮想マシンが無事に起動した。

 $ VBoxManage dhcpserver remove --netname HostInterfaceNetworking-vboxnet0
 $ VBoxManage list dhcpservers
 # empty
 
 $ vagrant up
 # success!

念のため再度DHCPサーバーの設定をみると、

$ VBoxManage list dhcpservers
NetworkName:    HostInterfaceNetworking-vboxnet0
Dhcpd IP:       172.28.128.2
LowerIPAddress: 172.28.128.3
UpperIPAddress: 172.28.128.254
NetworkMask:    255.255.255.0
Enabled:        Yes
Global Configuration:
    minLeaseTime:     default
    defaultLeaseTime: default
    maxLeaseTime:     default
    Forced options:   None
    Suppressed opts.: None
        1/legacy: 255.255.255.0
Groups:               None
Individual Configs:   None

今度はちゃんとホストオンリーネットワークと同じネットワーク内のIPが設定されているのがわかる。

後記

VirtualBoxの初期設定とVagrantのホストオンリーネットワーク作成の仕様が若干マッチしないことによるバグのようでした。
一度対応すればおそらく二度と起こらない問題な気はしますが、バグの直接原因とエラーメッセージの内容も若干齟齬っているのでめちゃくちゃハマりポイントですね…
こういうIssueの作成者には頭が下がるばかりです。