1月 242015
 

離れた二点間で IPv6 を L2 で利用したいなぁ。と、ずっと思っていたんだけど、中々手段がなかった。 FreeBSD の gif トンネルを使うと L3 接続になるし gre を使うと bridge が利用できないのでややこしいネットワークになってしまうし、そもそも FreeBSD の gre は IPv6 の L2 抜けが 10.0-RELEASE になってもできないみたいだし・・。

と、いうことで今回は離れた二点間で同一の /64 の IPv6 セグメントを利用できるようなネットワークを構築してみたいと思います。
ただ、ネットワーク機器としての FreeBSD の利用は今回あきらめました。今回は VyOS 1.1.1 を利用してみました。
VyOS 1.1.1 はフリーで利用できる仮想環境用のルータ OS です。

VyOS のインストールについてはここでは記載しないので他のウェブサイトでご確認頂ければと思います。

 
でもって、今回構築するネットワーク環境は以下になります。

IPv6_L2TPv3_2

ちょっと説明を。

  • 既存ネットワークのセグメント1: 10.123.1.0/24
  • 既存ネットワークのセグメント2: 192.168.123.0/24
  • 上記二つの異なる IPv4 のセグメントにおいて 2001:470:fc1e:10::/64 の IPv6 セグメントを利用したい。
  • IPv4 は 172.16.101.0/24 もあるけど、ついでに利用できるのであればそれはそれで嬉しい;-)。

と、いうような感じ。 IPv4 を L2 で抜けるソリューションは色々あるようなんだけど IPv6 の L2 抜けってのはどうも対応してない OS があったりして中々手強いモノがあったのであります。

セグメント2 側に IPv6 が無いので L2 で抜けて行って IPv6 使えるようにしましょう。ってのが今回の要件でしょうかね。

dtcp を利用した gif インターフェース使えば良いじゃん。と、いうソリューションもあるのですが、その場合 dtcps を起動する側には /48 が必要で dtcpclient 側に /64 を配布。って形になるので /64 しか無い場合には L2 抜けしてあげないとちょっとつらいんですね。

 
と、いうことで上の図は構成図です。物理的にはセグメント1 にもセグメント2 にも VMwareESXi 5.1 がいます。そこにサーバ(今回は FreeBSD をチョイス。と、いうか、いつも FreeBSD だけど;-)と VyOS が入っている状態です。

  • セグメント1: FreeBSD-01・FreeBSD-02・VyOS-01
  • セグメント2: FreeBSD-03・VyOS-02

では以下に手順を書いていきます。

 
1). VMWareESXi 5.1 の設定
サーバと VyOS が vSwitch で接続された状態にします。そして vSwitch ではプロミスキャス・モード (promiscuous mode) を有効にしておく必要があります。
日本語版では「無差別モード」と言っているようですが。

以下は VMWareESXi の vSwitch の設定のキャプチャです。

IPv6_L2TPv3_1

[構成]タブ -> ネットワーク -> vSwitch のプロパティを開きます。
[ポート]タブの「編集」ボタンを押します。
表示されたウィンドの[セキュリティ]タブの「無差別モード」を “承認” にします。

以上で準備は完了です。これをやっておかないとあとで痛い目にあいますX-(。

 
2). VyOS-01 側の設定
VyOS のインストールが済んで、ログインユーザ名とパスワードの設定が完了した状態からの設定です。

まずはホスト名の設定と ssh を有効にしておきましょうかねぇ。

set system host-name VyOS-01
set service ssh port 22

 
続いて既存ネットワークのセグメント1 側の IPv4 アドレスを指定します。

set interfaces ethernet eth0 address 10.123.1.11/24

 
続いてブリッジインターフェースを作成します。

set interfaces bridge br0

 
そして、新規 IPv6 ネットワークに接続する eth1 をブリッジグループに入れます。 eth1 にはアドレスを付加しません。ブリッジするのでイーサーネットインターフェースとして利用します。

set interfaces ethernet eth1 bridge-group bridge br0

 
ここまで各セグメントに接続するインターフェースの設定が完了しましした。
続いて二つのセグメントを接続するための L2 トンネル部分の設定をします。今回は VyOS の L2TPv3 を利用します。
一応 VyOS の gre でも試してみたのですが bridge-group のメニューが出てこないのでブリッジグループに入れることができません。以前の vyatta では gre も bridge-group に入れることができたようなのですけどねぇ。まぁ、 IP インターフェースは bridge-group に入れることはできない。と、いうことなのでしょうなぁ。

さて。 L2TPv3 を利用するために以下のコマンドを投入します。

set interfaces l2tpv3 l2tpeth0
set interfaces l2tpv3 l2tpeth0 local-ip 10.123.1.11
set interfaces l2tpv3 l2tpeth0 remote-ip 192.168.123.21
set interfaces l2tpv3 l2tpeth0 session-id 10
set interfaces l2tpv3 l2tpeth0 peer-session-id 11
set interfaces l2tpv3 l2tpeth0 tunnel-id 20
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 21
set interfaces l2tpv3 l2tpeth0 source-port 2030
set interfaces l2tpv3 l2tpeth0 destination-port 2031
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

 
ちょっと説明しますと、

  • interfaces l2tpv3 を l2tpeth0 として create します。
  • local-ip は自分の IPv4 アドレスを、 remote-ip は接続先 IPv4 アドレスを指定します。
  • session-id は好きな数値を、 peer-session-id は接続先の session-id を指定します。
  • tunnel-id と peer-tunnel-id も上記と同じルールで指定します。
  • source-port と destination-port も同じ要領で指定します。それにしてもどうして peer-source-port じゃないんだろ?;-)
  • encapsulation は udp にしました。他には ip も指定できるようです。
  • 最後に l2tpeth0 を ブリッジグループに登録します。

以上で L2TPv3 トンネルの設定が完了しました。最後に commit して save して exit すれば configure モードを抜けます。
VyOS-02 側にも同じ設定を入れるとトンネルが張られます。

eth1 と l2tpeth0 はブリッジされたのでこれで IPv6 が L2 でズドーンと抜けられるようになります。

 
3). VyOS-02 の設定
まぁ、基本的には VyOS-01 で設定したのと一緒です。サクサク行きます;-)。

ホスト名と ssh の設定と eth0 に IPv4 アドレスを付加する設定。

set system host-name VyOS-02
set service ssh port 22
set interfaces ethernet eth0 address 192.168.123.21/24

 
ブリッジグループの設定

set interfaces bridge br0
set interfaces ethernet eth1 bridge-group bridge br0

 
L2TPv3の設定。


set interfaces l2tpv3 l2tpeth0
set interfaces l2tpv3 l2tpeth0 local-ip 192.168.123.21
set interfaces l2tpv3 l2tpeth0 remote-ip 10.123.1.11
set interfaces l2tpv3 l2tpeth0 session-id 11
set interfaces l2tpv3 l2tpeth0 peer-session-id 10
set interfaces l2tpv3 l2tpeth0 tunnel-id 21
set interfaces l2tpv3 l2tpeth0 peer-tunnel-id 20
set interfaces l2tpv3 l2tpeth0 source-port 2031
set interfaces l2tpv3 l2tpeth0 destination-port 2030
set interfaces l2tpv3 l2tpeth0 encapsulation udp
set interfaces l2tpv3 l2tpeth0 bridge-group bridge br0

 
session-id・peer-session-id と tunnel-id・peer-tunnel-id そして source-port・destination-port は VyOS-01 で指定したものと値を逆にします。

以上で設定が完了ですね。

 
4). 確認方法
VyOS-01 と VyOS-02 の間で無事に L2TPv3 インターフェースが接続できているかの確認方法は以下になります。

vyos@VyOS-02:~$ show bridge br0 macs
port no mac addr                is local?       ageing timer
  2     01:05:73:a1:0f:ff       no                 2.16
  1     02:0c:29:f2:ec:f3       yes                0.00
  2     03:15:2c:73:dc:00       no                 2.07
  2     04:19:30:14:2e:c8       no                 1.14
  2     e5:9b:30:55:4e:c8       yes                0.00

 
ブリッジインターフェースの br0 の Mac アドレスを確認します。 今回はサーバ三台とスイッチポートが二つなので全部で五つの Mac アドレスが載りました。 “is local?” ってのは判りやすいですね。 yes が自分のネットワーク側で no が向こう側のネットワークに接続された機器のようです。

ついでなので VyOS の br0 にもテストのために IPv4 アドレスを付加してしまいましょう。

・VyOS-01

set interfaces bridge br0 address 172.16.101.101/24

 
・VyOS-02

set interfaces bridge br0 address 172.16.101.102/24

 

これでサーバやルータのインターフェースに ping を打って到達性が確認できれば L2 トンネルは成功です。
172.16.101.0/24 の IPv4 や 2001:470:fc1e:10::/64 の IPv6 アドレスに対して ping6 して到達性があることを確認します。

もし、この時に ping や ping6 が当たらない場合には一番上に戻って VMwareESXi の vSwitch において「無差別モード」が “承認” になっているか確認してみましょう。
僕はこの設定をすっかり忘れていて ping6 が通らずに随分と悩んでしまいましたf(^^;;。

 
5). ゲートウェイの設定
VyOS 自体に IPv6 を付加する必要が無いのであれば VyOS でのルーテイングの設定は何も必要ありません。サーバ側には IPv6 の default gateway を設定してあげます。

・FreeBSD

# route add -inet6 default 2001:470:fc1e:10::1

 
三台全てのサーバで同一のコマンドを打ちます。そして、全てのサーバはグローバル IPv6 なサイトに対してアクセス可能になったことを確認しましょう。

 
とまぁ、こんな感じで VyOS を利用することによりようやっと念願だった /64 の IPv6 の L2 トンネルができるようになりました。
本当は FreeBSD 単体でできると良いのですけどね。まぁ、それはしょーがない。

 
あと、今回のエントリでは VPN や IPSec については書いてないです。暗号化されてない L2 トンネルになります。
と、いうのも、僕は思うんですが、最近はプロトコル単位で暗号化されているのでトンネルを暗号化する必要ねんじゃね? みたいな。
ウェブ・メール・ssh・scp によるフアイル転送などはプロトコルで暗号化されています。唯一 samba かな? だったら ssh トンネル掘れば良いんじゃね? みたいな。

あ。 mDNS も L2 トンネルを抜けていくかな?だとしたら暗号化が必要だけど、考えてみるとマルチキャストを通すためには設定が一個必要だったような気がしたなぁ;-)。
まぁ、ザレゴトだということで;-)。

 
今回の設定は以上になります。ふぅ。