Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away