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

Vagrantfileの実例を交えつつvagrantのネットワークについてまとめます。
ここに記載の内容は[このブログ](http://labs.septeni.co.jp/entry/20140707/1404670069)にほぼ全て記載されています。

![スクリーンショット 2014-08-11 22.43.18.png](https://qiita-image-store.s3.amazonaws.com/0/20474/8084271b-1627-dc59-f1a7-8e9a7664573a.png)

| 言葉 | 意味 |
|:-----:|:---------:|
| ホスト | vagrantコマンドを実行するホスト |
| ゲスト | vagrantコマンドで作成されたVM |
| 内部ネットワーク | vagrant内のネットワーク |
| 外部ネットワーク | ホスト外のネットワーク |
Vagrantfileのnode1はゲスト1、node2はゲスト2。

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

![スクリーンショット 2014-08-11 22.51.28.png](https://qiita-image-store.s3.amazonaws.com/0/20474/a539d603-8a66-3ed9-4410-aafa6e810c4f.png)

### 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 node1` や `vagrant ssh node2` でそれぞれのゲストにアクセス可能。
eth0のネットワークを利用。それぞれのゲストで全て同じアドレス。

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

![スクリーンショット 2014-08-11 23.25.11.png](https://qiita-image-store.s3.amazonaws.com/0/20474/825974e0-c592-aacc-28b4-e2ecc8357dd7.png)

### 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の間も接続可能。
外部ネットワークからはアクセス出来ない。

## 仮想内部ネットワーク
ゲストとホストはホストオンリーアダプタでのみアクセス可能。
内部ネットワークはゲスト同士は接続できるが、ホストからゲストへはアクセス出来ない。

![スクリーンショット 2014-08-11 23.20.50.png](https://qiita-image-store.s3.amazonaws.com/0/20474/69931471-339e-a438-fb5d-96eff68f1cc7.png)

### 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` は任意の文字列でよい。

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

![スクリーンショット 2014-08-12 0.04.01.png](https://qiita-image-store.s3.amazonaws.com/0/20474/9e4b54a5-253a-bad2-75bd-0467af86a4fb.png)

### 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 :2001` や `lsof -i :8080` を実行するとLISTEN状態になっている。

## パブリックネットワーク
外部ネットワークから直接ゲストにアクセス可能。
ホストはiPhoneのテザリングを利用してネットに接続しているものとする。

![スクリーンショット 2014-08-12 0.24.02.png](https://qiita-image-store.s3.amazonaws.com/0/20474/968a3fb0-5659-f7d4-c1e0-1bca43e86a28.png)

### 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アドレスだとアクセスできた。

## リンク
* [Vagrantのネットワーク周りのあれこれ](http://labs.septeni.co.jp/entry/20140707/1404670069)