LoginSignup
10
8

More than 5 years have passed since last update.

Vagrant (provider Virtualbox) で network の promiscuous を設定する。

Last updated at Posted at 2016-07-16

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使えるんですよね……

10
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
8