[L2スイッチ+VLAN]ネットワーク仮想化入門 開発環境への仮想化導入ガイド

はじめに

サーバを仮想化して運用することも一般的になり、もはや実機にOSを入れることのほうが少なくなっている、という人も多いのではないでしょうか。

本誌Vol.49の仮想化特集編注では「開発環境を仮想化しよう!」をテーマに、⁠サーバ仮想化」⁠ストレージ仮想化」⁠ネットワーク仮想化」の3つの技術について取り上げました。このうち前者の2つ、つまり「サーバを仮想化してストレージを集約する」ことは行っても、最後の「ネットワークを仮想化する」ところまで必要とされる状況は少ないかもしれません。

筆者の環境では、グローバルIPアドレスを持つサーバ群を、開発用のサーバ群と一緒に仮想化しようというところからネットワークの仮想化を導入することになりました。しかし、この分野に詳しい人が周囲におらず、最終的な形が完成するまでは試行錯誤の連続でした。

今回は、そうして積み重ねた筆者のスタイルを交えつつ、多数の仮想化機器を接続して管理する方法について考えてみたいと思います。

編注)
本誌Vol.49特集3「⁠⁠VMware ESXiで開発環境を楽々省スペース化]すぐわかる仮想化技術」で、仮想化技術を取り上げました。なかでも、ネットワークの仮想化に関しては基礎知識をまとめた参考情報が少ないという現状を踏まえ、本記事は、前回の特集の補完的な位置づけでもお読みいただけるよう予備知識を含めて取り上げています。ぜひ合わせてご参照ください。

ネットワークを仮想化する

本記事で想定しているネットワークは、⁠完全にフラットにするほど小さくはないけれども、基幹ルータ(Ciscoなど)やL3スイッチを導入するほど大規模ではない」というケースです。イメージとしては、開発中のWebサービスのプロトタイプを社内で動かしていて、インターネットにつながる複数の経路が用意されている図1のような状況です。

図1 ネットワークの構成例
図1 ネットワークの構成例

ここで「Frontend Network」はインターネットに公開されたDMZ(demilitarized zone)で、ここにつながるサーバはグローバルIPを持ちます。その背後には「Backend Network」があり、データベースなどの非公開サーバがあります。

また、これとは別に開発者のマシンがつながる「Client Network⁠⁠、開発用サーバがつながる「Server Network」を考えます。

公開サーバはルータgw1を介してインターネットにつながります。一方、開発者がインターネットに出るときにはルータgw2が利用されます。開発者が各種のサーバにアクセスできるよう、内部的なトラフィックはルータrtによって中継されます。

これらの機器のうち、開発者のマシンと外部接続用のルータ(gw1、gw2)以外は仮想化することが可能です。最も単純な構成では、このネットワークは図2のような物理構成によって実現できます。

図2 最も単純な接続例
図2 最も単純な接続例

vmhost1は仮想化を行うホスト機で、sw1はVLANに対応したL2スイッチです。今回はこのL2スイッチが主役です。

VLANによるネットワークの分離

仮想ネットワークでは、ネットワークの分割はVLANによって行うのが一般的です。VLANについてはご存じの人も多いと思いますが、設定した番号によってネットワークを分けるというしくみです[1]⁠。

そこでまずは、最初に描いた各ネットワークセグメントに番号を振り、同時にIPアドレスの範囲を決めておきます表1⁠。

ここで「VLAN 1」は特別な意味を持つので注意が必要です。一般に、VLANに対応したネットワーク機器では、VLAN 1はデフォルトのネットワークであり、設定管理のために用いられます。ここでは開発者のマシンから直接管理を行うものとして、Client NetworkにVLAN 1を割り当てます。

表1 ネットワーク管理表の例
ネットワーク名VLANアドレス
Client Network1192.168.0.0/24
Server Network2192.168.1.0/24
Frontend Network310.0.0.0/24
Backend Network4172.16.0.0/24

実際にはグローバルアドレスが割り当てられる。

ネットワーク機器を接続する

設定を始める前に、ネットワーク機器の物理的なつながりを考える必要があります。ここで先ほどの図2のような構成だと、L2スイッチの設定ミスですべての機器が通信できなくなる恐れがあるので、図3のようにブロードバンドルータ(ここではgw2)だけでも開発者のマシンと同じハブにつなげるとよいでしょう。そうすれば万一の場合にでも、少なくともインターネットとの通信だけは確保できます。

Client NetworkはVLAN 1なので、L2スイッチでの設定は必要ありません。Frontend Networkへとつながるgw1にはVLAN 3を、仮想化ホストにはVLANを受け渡せるようにタグVLANを、それぞれ設定していきます。

図3 インターネットへの経路を確保する
図3 インターネットへの経路を確保する

L2スイッチの設定管理

ここで前出Vol.49の特集記事と一部重複してしまいますが、VLANの設定管理について簡単におさらいしておきます。

L2スイッチはメーカーによって設定方法がずいぶん異なるので、筆者は最初に手作業で管理表を作ることにしています。

まずはスイッチの各ポートがどこにつながっているかを示すポート管理表表2⁠。筆者は個人的に、ポート1をVLAN 1に固定し、管理のために使うと決めています。ここで「tagging」とあるのはタグVLANを、数字が書いてあるのはポートVLANを意味しています。

次に、これを具体的な設定に落とし込むためのVLAN管理表を作ります表3⁠。左の列にはすべてのVLANをリストアップし、それ以外の各列では、各ポートがどのVLANと通信可能であるかを定めます。

表2 ポート管理表の例
ポートVLAN接続先
P11Client Network
P23gw1
P3taggingvmhost1
P4未使用
表3 VLAN管理表の例
VLANP1P2P3P4
1U U 
2  T 
3 UT 
4  T 
PVID131 

ポートVLAN

表3のP1の列を縦に見ると、VLAN 1のところにだけUの文字があります。これは「ポート1は、VLAN 1に対してタグなし(Untag)パケットを送信する」という意味になります。一方、表3の一番下のPVID(ポートVLAN ID)は、⁠ポートが受信したパケットをどのVLANに送るか」を定めます。このように「PVIDを指定して、同じVLANにUを設定する」のが「ポートVLAN」です[2]⁠。図4は、ポート1で受信したパケットがポート3から送信される様子を示したものです。

図4 ポートVLANにおける受信と送信
図4 ポートVLANにおける受信と送信

タグVLAN

表3のP3の列にはTの文字が並んでおり、これは「ポート3は、VLAN 2~4に対してタグ付き(Tagged)パケットを送信する」という意味になります図5⁠。このように複数のVLANに対してタグ付けのルールを定めるのが「タグVLAN」です。タグVLANはポートVLANと共存が可能です。この例では、P3はVLAN 1に対してはポートVLAN(タグなし)として動作します。

図5 タグVLANにおける送信の流れ
図5 タグVLANにおける送信の流れ

表3の管理表には記述していませんが、各ポートがタグ付きパケットを受信した時の動作についても定める必要があります。たとえば、L2スイッチによっては「VLAN tag aware」などといったオプションによって動作が変わります。図6は、VLANタグを認識するように設定したときのパケットの流れです。

図6 タグVLANにおける受信の流れ
図6 タグVLANにおける送信の流れ

VLAN 1はタグなしにする

以上の例に示したように、VLAN 1は常にタグなしで送受信するように設定し、ネットワーク機器の管理に用いると便利でしょう。仮想化ホストとの接続(P3)も、VLAN 1に関してはタグなしになるので、ホスト側でVLANの設定をせずとも管理を行えるようになります[3]⁠。

管理表が完成すれば、それに従ってL2スイッチを設定します。具体的な設定方法については、L2スイッチのマニュアルを参照してください。

仮想化機器を増設する

仮想化するサーバの数が増えてくると、仮想化ホストも増設が必要となってきます。障害対策の観点からも、一般に複数のホスト機を用意しておくのは好ましいことでしょう。理屈の上では、仮想化ホストが増えたら増えただけ、それをL2スイッチに接続してタグVLANを設定すればいいと考えられます図7❶⁠。

ただ、L2スイッチのポート数には限界があるので、これもいずれ不足してスイッチ自体を増設することがあります。このときの教科書的なやり方は、複数のL2スイッチを互いにタグVLANで接続することです(図7⁠。

しかし、L2スイッチの設定というのは神経を使う作業なので、あまり複雑なことはやりたくありません。そこで筆者は図7のように、L2スイッチから伸ばすタグVLANは1本に固定して、タグを必要とするすべての機器を同一のハブ(以下、タグ付きハブ)につなぐようにしています[4]⁠。

こうしておくと、タグの設定は1回で済むので混乱がありません。L2スイッチのポート1をタグVLANとし、それ以外をポートVLANとすることを、筆者は「VLAN管理の標準形」としており、なるべくこの形でL2スイッチを設定するようにしています表4⁠。

この場合、すべてのVLANトラフィックがタグ付きハブに集まるので、そこがネットワークのボトルネックにならないようにだけ注意が必要です。

図7 複数の仮想化ホストを接続する
図7 複数の仮想化ホストを接続する
表4 VLAN管理表の標準形
VLANP1P2P3P4
1U   
2TU  
3T U 
4T  U
PVID1234

ネットワークストレージを導入する

仮想化ホストが2台以上になると、ネットワークストレージがほしくなります。仮想ディスクをネットワーク上に置くことで、仮想マシンを実行するホスト機を切り替えられるようになるので、リソースの配分や障害時の対応が簡単になります。

ネットワークストレージにはさまざまな種類がありますが、一般的なファイルサーバを用いる「NAS」や、TCP/IP上でSCSIディスクを提供する「iSCSI」のような、IPベースの製品が比較的安価に手に入れられます。FreeNASのようなソフトウェアを使えば、自分でストレージサーバを構築するのも簡単です。

ネットワークストレージを使うときには、ストレージ専用のネットワーク(Storage Area Network、以下SAN)を作ることをお勧めします図8⁠。第一に、SANには多くのデータが流れるので、安定した性能を確保する必要があります。第二に、SANの障害はディスクエラーという致命的な問題を引き起こすので、ほかのネットワーク機器とは分けて扱うようにします。

図8 ストレージ専用のネットワーク
図8 ストレージ専用のネットワーク

ネットワーク仮想化の全体像

ここまでの話を一度整理しておきましょう。先ほどの図7❸を眺めてみると、中央のハブがネットワーク機器の管理に向いているような気がしてきます。管理者はここから(ストレージ以外の)すべての機器に接続できることが一目瞭然であり、なおかつ管理用のVLAN 1へと必ずアクセスできるからです。

そこで、この中央のセグメントを基幹ネットワークとして、次のように定めます。

基幹ネットワーク
  • VLAN 1をタグなしとして、ネットワーク機器の管理に用いる
  • 管理以外の通信は、VLANを分けてタグを付ける

ここまでくると、最終的な仮想ネットワークにおける物理構成が見えてきます。そこには大きく分けて3種類のネットワークがあります図9⁠。

「基幹ネットワーク」には、中央のタグ付きハブを中心として、L2スイッチや仮想化ホストなどの仮想化機器を集めます。⁠物理ネットワーク」は仮想化されてない機器から構成され、L2スイッチによってVLANが割り当てられます。⁠ストレージネットワーク」にはストレージを集約し、仮想化ホストへと直接接続します。筆者はこれを「ネットワーク仮想化の標準形」とし、必要に応じてここに手を加える形で仮想ネットワークを構築しています。

図9 仮想ネットワークの物理構成
図9 仮想ネットワークの物理構成

仮想ネットワークの構築例

それでは最初の例に戻って、具体的な仮想ネットワークの構築に入りましょう。ネットワークの全体像は図10のようになります。

最初に取り上げた4つのネットワークに加えて、新たにManagement NetworkとStorage Networkとが接続されています。

Management Networkは仮想化機器の管理を行うためのネットワーク(VLAN 1)です。これはClient Networkと一緒にしてもかまわないのですが、⁠VLAN 1は管理用にする」というポリシーを満たすため、今回は両者を明確に区別してみます。

開発者のマシンから仮想化ホストに接続するにはルータ(rt)を経由します。しかし、ルータまで仮想化するとしたら初期設定が行えないので、管理用にマシンを1台用意し、これをManagement Networkに直接接続することにします(管理用PC⁠⁠。

図10 ネットワークの全体像
図10 ネットワークの全体像

ネットワーク管理の準備を整える

まず最初にネットワーク管理表を作成します表5⁠。各ネットワークセグメントにVLANとアドレスを割り当てていきます。

次にネットワークの物理的な配線を決定します。図11はほとんど標準系のままですが、管理用PC(開発用マシンの1台でかまいません)にはNIC(Network Interface Card、ネットワークカード)を1枚増設し、タグ付きハブに接続しています。

DHCPサーバまで仮想化する予定なら、管理用PCは手動でネットワーク設定しておくといいでしょう。デフォルトゲートウェイはブロードバンドルータ側にして、いつでもインターネットに接続できるようにしておきます。

L2スイッチや仮想化ホストのIPアドレスはManagement Networkのものに合わせます。以降、ルータの設定が完了するまで、これらの機器には管理用PCからしかアクセスできなくなります。

最後に、L2スイッチの設定を行うための管理表をまとめておきます表6、表7⁠。

図11 ネットワークの物理構成
図11 ネットワークの物理構成
表5 ネットワーク管理表
ネットワークVLANアドレス役割
Management Network[1]1192.168.254.0/24ネットワーク機器
Storage NetworkN/A[2]192.168.253.0/24ネットワークストレージ
Client Network[1]100192.168.0.0/24クライアント機
Server Network[1]101192.168.1.0/24開発用サーバ
Frontend Network20010.0.0.0/24公開サーバ(DMZ)
Backend Network[1]201172.16.0.0/24非公開サーバ

※1)ルータをなるべく使いたくないなら、これらのネットワークはすべてVLAN 1とし、同一のアドレス体系にしてもかまわない。その場合、ほとんどのパケットはタグなしで流れることになる。

※2)ストレージへのアクセスは仮想化しないので、VLANの割り当ては行わない。

表6 ポート管理表(sw1)
ポートVLAN接続先
P1taggingタグ付きハブ
P2100Client Network
P3200gw1
P4未使用未使用
表7 VLAN管理表(sw1)
VLANP1P2P3P4
1U   
100TU  
101T   
200T U 
201T   
PVID1100200 

パケットをキャプチャできるようにする

管理用PCにはWiresharkを入れて、ネットワークをキャプチャできるようにしておきましょう。タグ付きハブにはすべてのVLANのブロードキャストが流れてくるので、これを見るだけでもネットワークの様子がかなりわかります。

初期設定だとVLANの様子がわかりにくいので設定を変更します。メニューの[Edit/Preferences...]から[User Interfaces/Columns]を開きます。⁠Add]でコラムを増やし、⁠Format]「802.1Q VLAN id」を選択すると、キャプチャ結果にVLANが表示されるようになります図12⁠。

フィルタのルールとして「vlan」と入力すると、タグ付きのパケットだけが表示されます。⁠vlan.id==番号」とすると、特定のVLANだけに絞り込めます。

試しにL2スイッチの設定で、Client NetworkをVLAN 100に設定し、ブロードキャストアドレスでpingを打ってみてください(ping 192.168.0.255など⁠⁠。管理用NICをキャプチャして、タグ付きのpingが届いているようであれば設定に成功しています[5]⁠。

図12 WiresharkでVLANを表示する
図12 WiresharkでVLANを表示する

ルータを仮想化する

仮想マシンを各VLANに接続する方法については先述の特集記事で取り上げました。今回は、VLAN間を結び付けるルータまで仮想化する方法を紹介して終わりにします。

ルータには接続するネットワークの数だけNICが必要となります。仮想マシンの場合、必要な数だけ仮想NICを作成するのも一つの手ですが、VLANタグをそのまま渡す方法もあります。

VMware ESXiでは、ネットワークのVLANとして4095を指定すると、ホスト機で受け取ったVLANタグがそのままゲストOSにまで渡るようになります。Linuxであれば、vconfigコマンドでVLANインタフェースを作成することにより、タグVLANを活用したルーティングが可能となります。

参考までに、Ubuntu ServerをVLAN間ルータにする設定をリスト1に示します。eth0はVLAN 4095としてVLANタグを受け取るようにしておき、eth1はストレージネットワークへと接続します。

リスト1 VLAN間ルーティングの設定
・/etc/network/interfacesでの設定
# Management Network (VLAN 1 = no tag)
auto eth0
iface eth0 inet static
address 192.168.254.254
network 255.255.255.0
# Storage Network (no tag)
iface eth1 inet static
address 192.168.253.254
netmask 255.255.255.0
# Client Network (VLAN 100)
auto eth0.100
iface eth0.100 inet static
address 192.168.0.254
netmask 255.255.255.0
gateway 192.168.0.1
vlan-raw-device eth0
# Server Network (VLAN 101)
auto eth0.101
iface eth0.101 inet static
address 192.168.1.254
netmask 255.255.255.0
vlan-raw-device eth0
# Backend Network (VLAN 201)
auto eth0.201
iface eth0.201 inet static
address 172.16.0.254
netmask 255.255.255.0
vlan-raw-device eth0

・/etc/sysctl.confでの設定
# ルーティングを有効にする
net.ipv4.ip_forward=1

最後に

ここまで設定できれば、あとは通常のネットワークと変わりありません。DHCPサーバやDNSサーバ、デフォルトゲートウェイなどを設定していけばネットワーク仮想化の完成です。

管理用PCからであれば、VLANやルータの設定をどのように変更しても、必ず仮想化機器にアクセスできるので安心できます。VLAN 1にはVPN経由でもアクセスできるようにしておくと、遠隔地からでも設定変更が行えるようになって便利です。

L2スイッチの設定は、慣れないうちは何かと戸惑いますが、本記事で紹介したように設定をパターン化してしまえば混乱もなくなります。図9に描いた標準系を基本として、性能が必要なところでは経路を分離したり、信頼性が必要なところでは冗長化を行うことで、ネットワークごとのニーズにも対応できるでしょう。本記事が皆さんのネットワーク設計の参考になりましたら幸いです。

おすすめ記事

記事・ニュース一覧