一気に移せば何の問題もないのだけど、徐々に移そうとすると、内部のみのネットワークなので、旧ハイパーバイザに残ったVMと新ハイパーバイザに移し終わったVMで通信ができなくなってしまう。
どうしたらいけるかなと考えた結果、「イーサネットフレームを中継するVMを用意すればよくね?」ということで、それを可能にするL2TPv3と、L2TPv3を簡単に使えそうなVyOS (Vyattaのfork)を使って試してみた。
今回の話を図にすると、以下のとおり。
環境 / 利用ソフトウェア
- 仮想マシンハイパーバイザ 2台。
- VyOS v1.1 Helium (開発版なので注意:今回はVyOS-virt-livecd-1407022200-7e8544a-i386.isoを利用)
設定方法
VyOS インストール
まず、それぞれのハイパーバイザにVyOS をインストールする必要があるが、これはISOイメージでブートしてvyos / vyosでログイン、install imageと打てば指示に従うだけでOK。こちらのブログが絵が張ってあってわかりやすそうなので参考に→『Vyatta』からフォークした『VyOS』をインストールしてみた | 俺的備忘録 〜なんかいろいろ〜
あとはホストとしての設定をする必要があるが、とりあえずこんな感じだけやればSSHでログインできる(ブリッジするだけのホストとして考えているので、インターネットに出していくのは想定していない)。
$ configure # set interfaces ethernet ethX address '192.168.XXX.YYY/24' (あとで出てくるので値は省略) # set system host-name vybridge1 (あるいはvybridge2) # set service ssh port 22 # commit # save以下、saveは省略するが、適宜保存する。
vybridge1の設定
まずeth0インタフェースにIPアドレスを振る。$ configure # set interfaces ethernet eth0 address '192.168.100.241/24'
次に「l2tpeth0」インタフェースを構成する。トンネルID/セッションIDは好きに決めてOK.
# set interfaces l2tpv3 l2tpeth0 # set interfaces l2tpv3 l2tpeth0 local-ip 192.168.100.241 # set interfaces l2tpv3 l2tpeth0 remote-ip 192.168.100.242 # set interfaces l2tpv3 l2tpeth0 tunnel-id 41 # set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 42 # set interfaces l2tpv3 l2tpeth0 session-id 1 # set interfaces l2tpv3 l2tpeth0 peer-session-id 2 # set interfaces l2tpv3 l2tpeth0 source-port 5000 # set interfaces l2tpv3 l2tpeth0 destination-port 5001
いったん適用して様子を見る。
# commit # exit $ show interfaces l2tpv3 detail l2tpeth0:l2tpeth0ができていることを確認する。mtu 1488 qdisc pfifo_fast state UNKNOWN group default qlen 1000 link/ether XX:XX:XX:XX:XX:XX brd ff:ff:ff:ff:ff:ff inet6 XXXX::XXXX:XXXX:XXXX:XXXX/64 scope link valid_lft forever preferred_lft forever RX: bytes packets errors dropped overrun mcast 0 0 0 0 0 0 TX: bytes packets errors dropped carrier collisions 738 7 0 0 0 0
br0を構成し、eth1とブリッジする。
$ configure # set interfaces bridge br0 # set interfaces ethernet eth1 bridge-group bridge br0 # set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0 # commit # exit $ show interfaces Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down Interface IP Address S/L Description --------- ---------- --- ----------- br0 - u/u eth0 192.168.100.241/24 u/u eth1 - u/u l2tpeth0 - u/u lo 127.0.0.1/8 u/u ::1/128 $ show bridge br0 bridge name bridge id STP enabled interfaces br0 0000.xxxxxxxxxxxx no eth1 l2tpeth0br0ができていて、eth1とl2tpeth0が入っていることがわかる。
なお、eth1にはIPを振っていない。
これで、vybridge1の準備は終了。
vybridge2の設定
vybridge2の設定もほぼ同様。$ configure # set interfaces ethernet eth0 address '192.168.100.242/24'
vybridge2の「l2tpeth0」インタフェースには、基本的にはvyatta1と対照にする。
# set interfaces l2tpv3 l2tpeth0 # set interfaces l2tpv3 l2tpeth0 local-ip 192.168.100.242 # set interfaces l2tpv3 l2tpeth0 remote-ip 192.168.100.241 # set interfaces l2tpv3 l2tpeth0 tunnel-id 42 # set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 41 # set interfaces l2tpv3 l2tpeth0 session-id 2 # set interfaces l2tpv3 l2tpeth0 peer-session-id 1 # set interfaces l2tpv3 l2tpeth0 source-port 5001 # set interfaces l2tpv3 l2tpeth0 destination-port 5000
br0を構成し、eth1とブリッジする。
$ configure # set interfaces bridge br0 # set interfaces ethernet eth1 bridge-group bridge br0 # set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0 # commit
これでおしまい。あとは、新ハイパーバイザのVMから、旧ハイパーバイザのVMに通信してみて通信できればOK。
備考
実際のところ、今回の要件では一気に移行すればいいだけだったので、こんなことは必要ない。必要な場合であっても、Production環境でこのような使い方をするのであれば、L2VPNはオーバーヘッドが大きいのでパフォーマンスの検証をすべきと思う。(そもそも今のところVyOSの開発版についている機能のようなので、安定版では使えないのだけど)なお、今回の構成では暗号化はされないので、もし必要ならIPSecの上に乗せるなど、別途考える必要がある。
しかしながら、かなりお手軽にL2ブリッジを構成できるので覚えておいて損はないと思う。
参考
- VyattaでL2TPv3 ethernet pseudowire を使ってみる | Blog的な何か
- 今回の機能そのものが、ここで書かれているものが取り込まれたものらしい。取り込まれたものは若干コマンド(sport→source-portとか)が違うので注意。
- L2TPv3を用いたL2VPN
- 例によって自社機器の設定だけでなく技術詳細までわかりやすいYAMAHAさんのページ。