hekiblo

hekki blog

Linuxで作るVLAN変換サーバー

2015年12月17日に公開した記事を移動してきました。


L2 ネットワーク内で、ある VLAN タグが付いたフレームを、別の VLAN タグに付け替える Linux サーバーを作ってみます。 万人に使い道があるとは思えませんが、誰かの参考になると嬉しいですね。

概要

全体像

まずは VLAN 変換サーバーを含めた今回のお題とするネットワークを紹介します。

ネットワークには通常の Linux サーバーが二台 (Node1, Node2) と、VLAN 変換サーバー (VLAN-brige) を1台用意します。 VLAN 変換サーバーには Ubnutu14.04 を利用していますが、ディストリビューションはお好きなものを利用して構わないです。

f:id:ni_hi:20190927172910j:plain
図1: 検証NWの全体像

しくみ

VLAN 変換サーバーの仕組みについて説明します。

VLAN 変換サーバーは、内部に VLAN インターフェースと、bridge インターフェースを持っています。 変換対象となる VLAN インターフェースのペアを brdige インターフェースを使って論理的に接続します。

まず、VLAN 変換サーバーに到達した VLAN フレームは、VLAN インターフェースによって VLAN タグが外されます。 次にタグが外されたフレームは bridge インターフェースに到達します。 bridge インターフェースから、もう片側の VLAN インターフェースにフレームは転送され、元々付いていた VLAN タグとは異なる VLAN タグが付けられます。 この仕組を利用することによって、任意の VLAN タグが付いたフレームを別の VLAN タグに付け替えることができます。

f:id:ni_hi:20190927173008j:plain
図2: VLAN 変換サーバーの内部 NW

つくってみよう

それでは VLAN 変換サーバーを作ってみましょう。 サーバーは2台でも試験できますが、今回は分かりやすくするために3台用意します。

VLAN <-> VLAN 変換編

まずは終端となる2台のサーバーに異なる VLAN インターフェースを作成します。 Node1 に VLAN 番号 100 のインターフェース、Node2 に VLAN 番号 200 のインターフェースを作成します。 ここでは、eth1 のサブインタフェースとして作成してみます。

Node1

# サブインタフェースの追加をする
$ vconfig add eth1 100

# 作った eth1.100 に IP address を割り振って
$ ip addr add 192.168.0.100/24 dev eth1.100

# eth1 インターフェースを起こして
$ ip link set eth1 up

# eth1.100 インタフェースを起こす
$ ip link set eth1.100 up

Node2

Node2 も同様に 200 番の VLAN インターフェースを作成して、IP address を付けておきます。

$ vconfig add eth1 200

$ ip addr add 192.168.0.200/24 dev eth1.200
$ ip link set eth1 up
$ ip link set eth1.200 up

VLAN 変換サーバー

VLAN 変換サーバーは、前述した通り、VLAN インターフェースの他に brige インターフェースを作成するので、brctl コマンドを利用します。

# eth1.100 インターフェースを作っておいて
$ vconfig add eth1 100
$ ip link set eth1 up
$ ip link set eth1.100 up

# eth1.200 インターフェースも作っておいて
$ vconfig add eth1 200
$ ip link set eth1 up
$ ip link set eth1.200 up

# br1 という名前で bridge インターフェースを作って
$ brctl addbr br1

# br1 に eth1.100 を論理的に接続
$ brctl addif br1 eth1.100

# br1 に eth1.200 も論理的に接続
$ brctl addif br1 eth1.200

# br1 インターフェースを起こす
$ ip link set br1 up

これで準備は整いました。 Node1 と Node2 でお互いの IP address に ping を送信してみましょう! ping が到達するのが確認できましたか?

到達が確認できたら、VLAN 変換サーバーで各インターフェースを tcpdump で眺めてみると面白いかもしれないですね!

VLAN <-> Nested VLAN 変換編

おまけです。 ほとんど変わらないですが、任意の VLAN フレームと Nested VLAN フレームも同じように変換できます。

Node1

# サブインタフェースの追加をする
$ vconfig add eth1 100

# 作った eth1.100 に IP address を割り振って
$ ip addr add 192.168.0.100/24 dev eth1.100

# eth1 インターフェースを起こして
$ ip link set eth1 up

# eth1.100 インタフェースを起こす
$ ip link set eth1.100 up

Node2

Node2 は Nested VLAN インターフェースを作っておきます。

$ vconfig add eth1 200
$ vconfig add eth1.200 300

$ ip addr add 192.168.0.200/24 dev eth1.200.300
$ ip link set eth1 up
$ ip link set eth1.200 up
$ ip link set eth1.200.300 up

VLAN 変換サーバー

# eth1.100 インターフェースを作っておいて
$ vconfig add eth1 100
$ ip link set eth1 up
$ ip link set eth1.100 up

# eth1.200.300 インターフェースも作っておいて
$ vconfig add eth1 200
$ vconfig add eth1.200 300

$ ip link set eth1 up
$ ip link set eth1.200 up
$ ip link set eth1.200.300 up

# br1 という名前で bridge インターフェースを作って
$ brctl addbr br1

# br1 に eth1.100 を論理的に接続
$ brctl addif br1 eth1.100

# br1 に eth1.200.300 も論理的に接続
$ brctl addif br1 eth1.200.300

# br1 インターフェースを起こす
$ ip link set br1 up

これで準備は整いました。 Node1 と Node2 でお互いの IP address に ping を送信してみましょう!

感想

仕組みさえ分かってしまえば意外と簡単でした。 ただ、変換サーバーの冗長化はめちゃくちゃ苦労したので、興味のある方はぜひ挑戦してみてくださいね!

ネットワークの勉強をするときには、どの地点でパケットやフレームにどういったヘッダーが付いていて、それらが着信したインターフェースによってどう処理されるかをひとつひとつしっかり考えることが一番の近道だと思います。 繋がったときに楽しさ倍増なので、tcpdump をバンバンしましょう!