Edited at

vagrantのネットワークについて

More than 3 years have passed since last update.

Vagrantfileの実例を交えつつvagrantのネットワークについてまとめます。

ここに記載の内容はこのブログにほぼ全て記載されています。

言葉
意味

ホスト
vagrantコマンドを実行するホスト

ゲスト
vagrantコマンドで作成されたVM

内部ネットワーク
vagrant内のネットワーク

外部ネットワーク
ホスト外のネットワーク

Vagrantfileのnode1はゲスト1、node2はゲスト2。


ホストオンリーアダプタ

仮想ネットワークインタフェースを作成し、ホストとゲストの間での閉じたネットワークを形成。ゲストとホスト間のみ通信可能。ゲスト同士の通信はできない。


Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "centos65-x86_64-20140116"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

config.vm.define :node1 do |node|
node.vm.box = "centos65-x86_64-20140116"
end

config.vm.define :node2 do |node|
node.vm.box = "centos65-x86_64-20140116"
end
end


ifconfig抜粋(ゲスト1)

eth0      Link encap:Ethernet  HWaddr 08:00:27:4F:B8:06

inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2429 errors:0 dropped:0 overruns:0 frame:0
TX packets:1469 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:208257 (203.3 KiB) TX bytes:173198 (169.1 KiB)

vagrant ssh node1vagrant ssh node2 でそれぞれのゲストにアクセス可能。

eth0のネットワークを利用。それぞれのゲストで全て同じアドレス。


プライベートネットワーク

内部ネットワークを利用してホストとゲスト、ゲスト間同士の通信が可能。


Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "centos65-x86_64-20140116"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

config.vm.define :node1 do |node|
node.vm.box = "centos65-x86_64-20140116"
node.vm.network :private_network, ip:"192.168.33.11"
end

config.vm.define :node2 do |node|
node.vm.box = "centos65-x86_64-20140116"
node.vm.network :private_network, ip:"192.168.33.12"
end
end


ifconfig抜粋(ゲスト1)

eth0      Link encap:Ethernet  HWaddr 08:00:27:4F:B8:06

inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2429 errors:0 dropped:0 overruns:0 frame:0
TX packets:1469 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:208257 (203.3 KiB) TX bytes:173198 (169.1 KiB)

eth1 Link encap:Ethernet HWaddr 08:00:27:22:92:33
inet addr:192.168.33.11 Bcast:192.168.33.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:44 errors:0 dropped:0 overruns:0 frame:0
TX packets:50 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4314 (4.2 KiB) TX bytes:5534 (5.4 KiB)

ホストオンリーアダプタ以外に、内部ネットワーク経由でホストからnodeXに ssh -l vagrant 192.168.33.1X で接続可能。node1, node2の間も接続可能。

外部ネットワークからはアクセス出来ない。


仮想内部ネットワーク

ゲストとホストはホストオンリーアダプタでのみアクセス可能。

内部ネットワークはゲスト同士は接続できるが、ホストからゲストへはアクセス出来ない。


Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "centos65-x86_64-20140116"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

config.vm.define :node1 do |node|
node.vm.box = "centos65-x86_64-20140116"
node.vm.network :private_network, ip:"192.168.33.11", virtualbox__intnet: "test_net"
end

config.vm.define :node2 do |node|
node.vm.box = "centos65-x86_64-20140116"
node.vm.network :private_network, ip:"192.168.33.12", virtualbox__intnet: "test_net"
end

end

ホストからゲストへは vagrant ssh nodeX でアクセス可能。ホストからゲストへ ssh -l vagrant 192.168.33.1X でアクセス出来ない。ゲスト間の閉じたネットワーク(仮想内部ネットワーク)同士のみアクセス可能。

virtualbox__intnet を指定することでゲスト同士の仮想内部ネットワークを構築できる。値 test_net は任意の文字列でよい。


ポートフォワーディング

ホストの特定のポートへのアクセスをゲストへ転送する。外部ネットワークからアクセス可能。


Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "centos65-x86_64-20140116"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

config.vm.define :node1 do |node|
node.vm.box = "centos65-x86_64-20140116"
node.vm.network :forwarded_port, guest:22, host:2001, id:"ssh"
node.vm.network :forwarded_port, guest:80, host:8080, id:"http"
node.vm.network :private_network, ip:"192.168.33.11"
end

end

ホストオンリーアダプタ以外に、ホストから ssh -l vagrant -p 2001 127.0.0.1 もしくは ssh -l vagrant -p 22 192.168.33.11 でsshアクセス可能。

ホストから http://127.0.0.1:8080 もしくは http://192.168.33.11:80 でhttpアクセス可能。

実際ホスト側で lsof -i :2001lsof -i :8080 を実行するとLISTEN状態になっている。


パブリックネットワーク

外部ネットワークから直接ゲストにアクセス可能。

ホストはiPhoneのテザリングを利用してネットに接続しているものとする。


Vagrantfile

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "centos65-x86_64-20140116"
config.vm.box_url = "https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box"

config.vm.define :node1 do |node|
node.vm.box = "centos65-x86_64-20140116"
node.vm.network :public_network
end
end

vagrant up を実行し、どのインタフェースを使うか選択する。(この例ではWi-Fi (AirPort))

IPアドレスはDHCPで自動で割り当てられるのでVM起動後ホストオンリーアダプタでアクセスして

アドレスを確認する。ゲストでhttpdが動いている場合、アイフォンのWebブラウザにゲストのIPアドレスを入力すると、ブラウザにゲストのWebページが表示される。

IPアドレスを指定して起動することもできるが、ゲスト側ではちゃんと設定できているように見えてもホストや外部ネットワークからは接続できなかった。IPを指定せず、DHCPで自動的に割り当てられたIPアドレスだとアクセスできた。


リンク