さくらのVPSをハイブリッド接続に対応した話

# これ、本当に使う人いるんだろうかと思いながらも・・

さくらのVPS(石狩第1ゾーン)をハイブリッド接続サービスに対応しました！
2016/10/3より申込受付、提供を開始しております。

![img_01.png](https://qiita-image-store.s3.amazonaws.com/0/108990/b69906f7-1453-8379-9267-33c94060d114.png)

▽プレスリリース(2016/9/20配信)
https://www.sakura.ad.jp/press/2016/0920_hybrid/

▽申込方法
http://vps-news.sakura.ad.jp/2016/10/03/hybrid-add-vps/

ハイブリッド接続サービスとは、さくらインターネットの多種多様なサービスをL2でローカル接続するものです。物理サーバやハウジングラックへの持ち込み機材、クラウドをはじめとする仮想サーバなどを組み合わせたシステムを、お客様にて構築しやすくするためのネットワークオプションです。

**L2なので全てが同じセグメントで見えます(gkbr**

このハイブリッド接続、最初は4年前の2012年10月3日に石狩データセンター内の一部サービス(クラウド、専用サーバ、リモートハウジング)に対応する形でリリースしました。その後、**VXLANを使いながら閉域網を無理やり東京にも広げ**、今日に至るまで順次対応サービスを拡大してきました。

|ハイブリッド接続<br>対応日|サービス名|ゾーン、拠点名|
|:-----------:|:------------:|:------------:|
|2012/10/03 |さくらのクラウド   |石狩第1ゾーン|
|           |さくらの専用サーバ |石狩第1ゾーン|
|           |リモートハウジング |石狩リージョン|
|2013/11/01 |さくらのクラウド   |石狩第2ゾーン|
|2014/01/23 |さくらの専用サーバ |石狩第2ゾーン|
|2015/04/15 |さくらのクラウド   |東京第1ゾーン|
|2015/08/03 |プライベートリンク |KDDI大手町, Equinix TY4|
|2015/12/01 |さくらの専用サーバ |東京第1ゾーン|
|2016/03/01 |ハウジング         |西新宿データセンター|
|           |ハウジング         |代官山データセンター|
|2016/04/01 |ハウジング         |東新宿データセンター|
|2016/06/30 |プライベートリンク |for ARTERIA|
|2016/07/01 |プライベートリンク |SINET接続オプション(SINET5)|
|2016/10/03 |さくらのVPS        |石狩第1ゾーン|
|2017/01/12 |さくらのVPS        |東京第2ゾーン|

今後はさくらのVPS **東京リージョン** への対応を予定しています(後日追記：2017/01/12に対応しました)。
あと、**大阪にもそのうち広げていきたいなー**と勝手に企んでます :smile:

# VPSの特殊？なネットワーク

実はさくらのVPS、ローカル側のネットワークは若干特殊な形態になっており、**QinQ(VLANタグを2段含む)が使われています**。

1ユーザあたり[10個まで無料で「スイッチ」を作成できる](http://vps.sakura.ad.jp/feature/lnw.html)というサービス仕様上、**VLAN IDの枯渇が当初から予測されていた**ためかと考えられます。普通のVLANですと4,000ユーザ程度しかマルチテナントできません。一方、QinQであれば24bitのID空間を活用することができ、**未来永劫不足することはないでしょう**(ちょっと言い過ぎ？)。

さくらのVPSで使われているQinQは以下のようなフレームフォーマットをしています。Outer VLANもInner VLANもTPIDとして0x8100が使われています。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/108990/2806cea7-ba8e-275e-b761-b80ac1eac461.png)

※ 本来、[802.1adで定められているTPIDはOuter側に0x88a8を使用する](https://en.wikipedia.org/wiki/IEEE_802.1Q)ことになっています。したがって、正確にはDual Tagですが、本稿ではQinQと表記します :smile:

tcpdumpすると以下のようにVLANが2個見えます。

```
00:34:22.485305 xx:xx:xx:xx:xx:xx > yy:yy:yy:yy:yy:yy, ethertype 802.1Q (0x8100),
 length 106: vlan 1901, p 0, ethertype 802.1Q, vlan 1000, p 0, ethertype IPv4,
 10.0.0.2 > 10.0.0.1: ICMP echo request, id 10251, seq 1, length 64
```

この場合、Outer VLANが1901、Inner VLANが1000です。

このQinQフレームは、ハイパーバイザ上のLinuxブリッジで解かれてVMに渡されています。Linuxでは以下のように簡単に使用することができます。

```
! CentOS6系だと物理IFのMTUを4バイト増やす必要がある
$ ip link set eth0 mtu 1504

! Outerのサブインターフェイスを作る
$ vconfig add eth0 1900
Added VLAN with VID == 1900 to IF -:eth0:-

! Innerのサブインターフェイスを作る
$ vconfig add eth0.1900 1000
Added VLAN with VID == 1000 to IF -:eth0.1900:-

$ ip addr show dev eth0.1900.1000
ip link show eth0.1900.1000
15: eth0.1900.1000@eth0.1900: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1504 qdisc noqueue state UP
    link/ether 00:1b:21:74:5a:f8 brd ff:ff:ff:ff:ff:ff

! Linuxブリッジに追加
$ brctl addif br0 eth0.1900.1000
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.001b21745af8       no              eth0.1900.1000
```

このように、**vconfigを2回叩くだけ**です。後はいつもどおりbr0にVMのtapインターフェイスを接続すればOKです。

# QinQはそのままハイブリッド接続できない

このように簡単につかえて便利なQinQですが、ハイブリッド接続は各サービスで持っている**VLANの島**を接続する仕組みになっています。QinQをいきなり接続することはできません。したがって、このQinQフレームを何らかの方法で**一旦VLANに直してから**ハイブリッド接続収容機器に接続する必要がありました。

▽ 参考資料：2016.7.6 さくらの夕べ＠沖縄 さくらインターネットの「閉域網サービス」の裏側
http://www.slideshare.net/ShuichiOhkubo/201676-63799088

# 当初はQinQ VLAN Translationサーバを使って接続

案外QinQのタグ2段を一気に付け外しできる装置って**ハイエンドモデルのルータ機器**になるんですね。JuniperさんのMXシリーズとか、CiscoさんのASRシリーズあたりでは動作しますが、**これってすごくお高いんですね**。

安く作れないかなと思ってたところ、既に**弊社のワカモノがLinuxサーバでQinQとVLANの変換装置を実装していました。**さくらのVPSベアメタルプランのネットワークで動いています。

▽ ホスティングサービスに関する当社の同行と取り組み(WIDE夏のBoard合宿2016)
http://www.slideshare.net/hirokiito969952/widebordsummercamp2016

※ 伊東くんが作ったので、**社内では伊東バコ**と呼ばれています。

私のような老害としては、**ネットワークトラフィックをサーバで運ぶことにとても抵抗がある**んですが、ワカモノに負けじとこの仕組を使うことにしました。

# 冗長化が課題

**元祖伊東バコ**ではPacemakerを用いた冗長化が行われていました。しかし、設定が複雑であったり中途半端に故障した場合のフェイルオーバや、切り替り時のMACテーブルのフラッシュが懸念点としてありました。

考えた結果、今回はハイブリッド接続側とVPS側のL2スイッチでマルチシャーシLAGを組み、**LACPを伊東バコに貫通させることで冗長化**をすることにしました。

![fig2.png](https://qiita-image-store.s3.amazonaws.com/0/108990/92d03c7d-2782-474f-e512-1d7f15a52be7.png)

伊東バコが故障した時は、L2スイッチ間のLACPの疎通が途絶えることでフェイルオーバします。

# LACPが意外とクセモノ！？

上記の構成をラボ環境で組んでみたところ、**動きませんでした！**

LACPが伊東バコをうまく通過してくれません。原因を調べたところ、**Linux BridgeはLACPを通さない**ようです。一方、**Open vSwitch**では以下のようなオプション指定することでLACP等のBPDU全般の転送が可能でした。

```
% ovs-vsctl set bridge br0 other_config=forward-bpdu=true
```

Open vSwitchは[さくらのクラウド](http://cloud.sakura.ad.jp/)でも動作実績があるのでこちらを使うことにしました。

# 各システムと連携して完成

ハイブリッド接続では、各サービスで持っているDBとAPI連携をしており、VLAN IDの自動取得、所有会員ID等の整合性チェックを行っています。VPSについてもAPI連携を行い、お客様の**「スイッチコード」**から、内部的にアサインされているQinQのIDを取得するようにしました。その情報を元に伊東バコやその他装置に自動的に設定を投入するようにしています。

![fig3.png](https://qiita-image-store.s3.amazonaws.com/0/108990/837230fc-ec89-929e-9603-a71cf8d7bbf7.png)

# ということで

せっかく作ったので是非ご活用ください！

お申込方法はこちらからどうぞ :smile:
http://vps-news.sakura.ad.jp/2016/10/03/hybrid-add-vps/

~~現在、書面申し込みにしか対応していないのですが、そのうち**さくらのクラウドのコンパネ**から(VPSではなく。。)オンデマンドに接続/切断できるようになりますのでご期待下さい。~~

2016/10/20より、さくらのクラウドコンパネの「ブリッジ」にて、VPSのスイッチの接続/切断が今すぐできるようになりました :smile: 
http://cloud-news.sakura.ad.jp/2016/10/20/bridge-vps-switch/