VirtualBox 5.0.24 & Vagrant 1.8.3 現在くらいのお話です。
Vagrantで普通にNetworkの設定をすると、
VirtualBoxではpromiscuousのモードが拒否になっていて、VMで仮想MacAddressを使ったりするとアクセスできないことがあります。
そこで、Vagrantfileでpromiscuousモードを設定してしまおうという話です。
どんなオプションで設定できるのかはVirtualBoxの公式ドキュメントを見ると
--nicpromisc<1-N> deny|allow-vms|allow-all
とあります。
これをVagrantfileに書けば良いのですが、NIC番号<1-N>が必要になります。
NIC番号ってどれでしたっけ?となるので、当該NIC番号がどれかを判断することがひつようになります。
まず、Vagrantが接続するために1番目のNICを使います。
2番目以降にコンフィグで設定したものが追加されていきます。
例えば
Vagrant.configure(2) do |config|
config.vm.define "default" do |box|
box.vm.network "private_network", ip: "192.168.56.10"
box.vm.network "private_network", ip: "192.168.57.10"
end
end
こんなVagrantfileですと、2,3番目のNICが作成されます。
で、これらに先ほどのVirtualBoxへの設定を行うのですが、それを追加すると
Vagrant.configure(2) do |config|
config.vm.define "default" do |box|
box.vm.network "private_network", ip: "192.168.56.10"
box.vm.network "private_network", ip: "192.168.57.10"
box.vm.provider :VirtualBox do |vb|
vb.customize ["modifyvm", :id, "--nicpromisc2", "allow-all",
"--nicpromisc3", "allow-all"]
end
end
end
こんな感じになるわけです。
NICを増やすとまた1行増やす……
それはないわーとなりますね。
そこでとりあえず追加するNIC全部にprimiscuous allow-allを設定したい!みたいなときは
Vagrant.configure(2) do |config|
config.vm.define "default" do |box|
box.vm.network "private_network", ip: "192.168.56.10"
box.vm.network "private_network", ip: "192.168.57.10"
(1..box.vm.networks.count {|nw| !nw.include? :forwarded_port}).each do |i|
box.vm.provider :VirtualBox do |vb|
vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
end
end
end
end
みたいなことをするのです。
config.vm.network
には今のところNICを作らない設定はforwarded_port
くらいっぽいので、大体このやり方でうまくいくかと思います。
NICが作られる順番は上から順なので、forwarded_port
の設定を必ず最後にやる、みたいなことを決めていれば、private_network
だけ設定したいときは
(1..box.vm.networks.count).zip(box.vm.networks).each do |i,nw|
if nw and nw.include? :private_network then
box.vm.provider :VirtualBox do |vb|
vb.customize ["modifyvm", :id, "--nicpromisc#{i+1}", "allow-all"]
end
end
end
みたいな書き方をしてみるとか、
特定のIPアドレスのものだけをというときは、IPアドレスを変数にしてしまって、
条件として指定するとかできますね。
こんなの普通はハマらないんですけど、たまたまVMでルータを動かしてVRRPを利用したら仮想IPアドレスが仮想MacAddress持ってる状況で、仮想IPアドレスへ通信できないという事態に遭遇したので忘備録として残しておきます。
LinuxのHAで使われる仮想IPアドレスによる冗長化する場合はkeepalivedを使うとおもいますが、これ完全なVRRPじゃなくて、仮想MacAddressを持たないのでprimiscuousモードが拒否でもハマらないのです。(LinuxはNICが2つのMacAddressを持てない仕様なんでしたっけ?)
BSD系だと仮想MacAddress使えるんですよね……