VXLAN食わず嫌いがvyosでVXLANを試してみたら案外サクっと出来た

この記事は[SFC-RGアドベントカレンダー](https://qiita.com/advent-calendar/2018/sfc-rg)の17日目です。

# 背景
## キッカケ
VXLAN、一通り流行り終わった感あるけど試してみないまま生きていくのは敗北な気がする。
ここらで一つ食わず嫌いを克服したい。

## 本記事の対象者
- 「VXLANって聞いたことあるけど実際触ったことがない」な人
- 「VXLANで便利らしいけどマジなの？」な人
- 「何事も最初は無料で試したい。」な人

## 環境 
- シミュレーター環境： GNS3
    - VM on ESXi6.7
    - GNS3クライアント
    - 構築 起動方法などは先人に任せます。
    - kvmが使える環境じゃないと駄目かも。
- VTEP: vyos 1.1.8
- 検証用PC: Alpine Linux 3.8

# 前提知識
## VXLANについて
- L3でL2でトンネリングをする。
- 複数のDC間で同じセグメントを作って管理を効率化することが出来るっぽい。

参考：[GoBGPでEVPN/VXLANを試す](http://skjune12.hatenadiary.com/entry/2017/12/09/235550)

### 用語
#### VNI(VXLAN Network ID)
セグメントを区別するための識別子。24bit長なのでVLANより自由に使えそう。
#### VTEP(VXLAN Tunnel End Point)
VXLANトンネルの末端のホスト。トンネルの出口。
#### Multicast-group
IPv4マルチキャストのアドレス。シグナリング用パケットの伝送に使う。


## VXLANの種類
VXLANがVTEP間のシグナリングには３つのプロトコルがある。以下に雑に情報をまとめておく。

|名前|特徴|用途|
|:--:|:--|:--|
|VXLAN EVPN|MP-BGP(BGPの拡張)を利用してVTEPを見つける。無料で気軽に使える実装が少ない。|インターネットを超えてVTEPを接続したい場合。DC間を接続したい時など。|
|OVSDB|専用のコントローラーによってVTEP同士が出会う。アプライアンス製品であることが多い。|集中管理したい場合。~~高価~~素敵なアプライアンスを買える場合|
|Multicast（Flood＆Learn）|単純にマルチキャストを使う。簡単に使える一方でVTEP間でマルチキャストをルーティングしなくてはならないため実用は難しい。|ゼロからネットワークを設計する場合。気軽に試したい場合。|

参考：[Cisco Nexus スイッチで VXLAN EVPN ファブリックを作ろう！](https://gblogs.cisco.com/jp/2017/04/create-vxlan-evpn-fabric-with-cisco-nexus-switch/)


# 構成
## 作るもの
![vxlan-demo.png](https://qiita-image-store.s3.amazonaws.com/0/94774/6a466fc4-8b74-1c30-e965-8e7d2d499517.png)

今回は```PC-1```がつながっているセグメントと```PC-2```がつながっているセグメントをつなげる。


### VXLANのパラメーター：
今回は以下の様にする。設定するパラメータは案外少ない。。

- **種類**： Multicast（Flood＆Learn）
    - 一番カンタンなやつ。
    - vyosが喋れるのがこれだけだったというオチ。
- **VID**: 100
- **Multicast-group**: 239.0.0.1
- **VTEP**:
    - **vyos1**: ```10.0.0.1/30```
    - **vyos2**: ```10.0.0.2/30```
- **各インターフェースについて**
    - ```eth0```: アンダーレイ
    - ```eth2```: クライアントPCがつながるインターフェース
    - ```vxlan0```: VXLANが利用するトンネルグインターフェース
    - ```br0```: ```eth2```と```br0```を繋ぐためのブリッジインターフェース。繋げたいセグメントのIPを振る。（振らなくてもPC間は通信できる）



# 設定
とりあえずvyosを立ち上げる。
## 下準備
vyosの使い方はGoogleで検索。
設定を入れたらcommitしてsave

### アンダーレイの作成。
アンダーレイのIPは```10.0.0.0/30```とした。
今回は単純なP2Pリンクなので静的経路などは不要。

```shell-session:vyos1
vyos@vyos2# set interfaces ethernet eth0 address 10.0.0.1/30
```

```shell-session:vyos2
vyos@vyos2# set interfaces ethernet eth0 address 10.0.0.2/30
```

### ブリッジの作成
今回はVXLAN用のインターフェースにIPアドレスを振らずに、ブリッジインターフェースにIPアドレスを振る。

```shell-session:vyos1
vyos@vyos1# set interfaces bridge br0 address 192.168.0.1/24
```

```shell-session:vyos2
vyos@vyos2# set interfaces bridge br0 address 192.168.0.2/24
```

### VXLANインターフェースの作成
VXLANに用いる諸所の情報を入れる。このインターフェースにはアドレスを振らないため二台とも全く一緒で良い。

```shell-session:vyos1
# set interfaces vxlan vxlan0 bridge-group bridge 'br0'
# set interfaces vxlan vxlan0 group '239.0.0.1'
# set interfaces vxlan vxlan0 link 'eth0'
# set interfaces vxlan vxlan0 vni '100'
```


###　完成
まとめるとこんな感じ。

```configuration:vyos1
 interfaces {
     bridge br0 {
         address 192.168.0.1/24
     }
     ethernet eth0 {
         address 10.0.0.1/30
         hw-id 0c:eb:d3:79:96:00
     }
     ethernet eth1 {
         hw-id 0c:eb:d3:79:96:01
     }
     ethernet eth2 {
         bridge-group {
             bridge br0
         }
         hw-id 0c:eb:d3:79:96:02
     }
     loopback lo {
     }
     vxlan vxlan0 {
         bridge-group {
             bridge br0
         }
         group 239.0.0.1
         link eth0
         vni 100
     }
 }
```

出来た。試してみよう。

```shell-session:vyos2
vyos@vyos2:~$ ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=3.59 ms
64 bytes from 192.168.0.1: icmp_req=2 ttl=64 time=1.52 ms
```


ルーティングの設定を全く書かないで直接接続されていないはずのセグメントに通信が出来たことがわかる。

### 動作確認
せっかくなのでPCをつないでみよう。Alpin Linux(コンテナ用の軽量なLinux)をvyos1,vyos2につないでみた。


```shell-session:PC-1
/ # ip add add 192.168.0.100/24 dev eth0
/ # ping 192.168.0.200
PING 192.168.0.2 (192.168.0.2): 56 data bytes
64 bytes from 192.168.0.200: seq=0 ttl=64 time=6.485 ms
64 bytes from 192.168.0.200: seq=1 ttl=64 time=3.253 ms
```



# まとめ
偉大なるVXLANの恩恵を感じてほしい。:angel:
(ちなみに今回のアンダーレイは同じセグメント同士なのでマルチキャスト用のルーティングを全く気にする必要がないのでラクラクだった。マルチキャストルーティングが絡むと大変だと思う。）


# 参考
https://jedipunkz.github.io/blog/2014/12/16/vyos-vxlan/
https://wiki.vyos.net/wiki/VXLAN