注意

この文書は2007/10/25に書かれたもので、ソフトウエアの名称、バージョン、設定項目、社名などの固有名詞などなどは当時のまま掲載しています。

ですので、インストール手順や設定内容は最新版のドキュメントを参照していただき、この文書からは理論や考え方、構成のヒントなどを読み取っていただければと思います。

はじめに

今回は、スケールしやすく運用もしやすいネットワーク構成とはどういうものか、という話をしたいと思います。

深く考えずに設計したネットワークにサーバをじゃんじゃん追加していくと、そのうち破綻します。筆者らもそうでした。が、脳みそをふりしぼって考えて、ときには失敗しながらも改良を重ね、いまではかなり満足のいく構成ができたんじゃないかと自負しています。

そこで今回は、前半で典型的なネットワーク構成が持つ問題点と「理想の構成」について考察し、後半では「理想の構成」をVLANを活用して作ってみたいと思います。

ありがちなネットワーク構成とその問題

シンプルな構成

まずはものすごくシンプルな構成からスタートしましょう。図1を見てください。

図1: シンプルな構成
シンプルな構成

「rt」は自ネットワークの出入口となるルータ兼、ファイアウォール兼、ロードバランサだと思ってください。rtから上へ延びる線はISPの上位ルータへ、下へ延びる線はスイッチングハブ(以下、スイッチ)につながっており、スイッチにはWebサーバなどのサーバマシンがぶらさがっています。

とてもシンプルでわかりやすいんですが、問題があります。例えば、rtが故障した場合を考えてみましょう。

rtは上流との出入口ですので、ここが止まると外部との通信が一切できなくなってしまいます。つまり、全サービスが停止してしまいます。このように可用性が低いのが問題その1。

次に、復旧作業を考えてみます。故障したrtを復旧するには、

  • 現地に行って
  • 故障機を取り外して代替機と取り替える

といった作業が必要になります。

一刻も早くサービスを復旧しなければならないのに、現地までの移動時間で貴重な時間をロスしてしまいます。

また、物理的な機器の移動やケーブルの差し換えが必要なので、電源ケーブルやLANケーブルの抜きまちがい、差しまちがいをしてしまう可能性もあります。「ちゃんとラベルを貼ってあるから大丈夫」「注意をすればそんなことは起こらない」と思うかもしれませんが、どんなに注意をしていても人間はうっかりミスをします。特に慌てている状況下では。このように、復旧作業そのものに潜在的なリスクがあるというのが問題その2です。

フラットな構成

図1の問題点であった、

  • 可用性が低い
  • 復旧作業が煩雑

を解消するにはどういう構成がよいでしょうか。

例えばこんな構成はどうでしょう。(図2)

図2: フラットな構成
フラットな構成

図1との違いで特徴的な点はこうです:

  • 上位ルータをrtではなくスイッチにつなぐ
  • 同じスイッチの下にrtもWebサーバもぶらさげる
  • rtのスタンバイ機もぶらさげる

もしrtが故障した場合は、同じスイッチにぶらさがっているrtのスタンバイ機をアクティブ化すればいいので、前の構成より大幅にダウンタイムを短縮できます。また、物理的な機器の移動がないので復旧作業も簡素化できます。

とはいえこれまた問題点がないわけではありません。

この構成ですと、論理的なネットワークセグメントは、

  • 上位ルータへ向かうネットワーク
  • Webサーバがぶらさがっている内部ネットワーク

の2つ存在するのですが、これらが物理的に1つのスイッチにつながっています。影響としては、内部ネットワークのブロードキャストが外部へ流れてしまったり、また、その逆もことも起こり得ますので、セキュリティの観点から望ましくありません。また、上位回線が従量課金の場合は、無駄なパケットで金銭的コストが増える可能性もあります。

2層構成

図2は、フラットであるという構成そのものはよかったのですが、論理ネットワークが混在しているという問題がありました。それではネットワークをわけてみましょうというのが図3です。

図3: 2層構成
2層構成

図3を見ると、ネットワークが2つあることが見て取れると思います。上側が上位ルータとのネットワーク、下側が内部ネットワークです。そしてrtはNICが2つ搭載されていて、両方のネットワークにつながっています。

目的別にネットワークがわかれていて、図を見てもその構成がわかりやすいですね。

しかしながら、図4のように、配下の内部ネットワークが複数になった場合に、rtにはその分だけNICが必要になり、まるでタコ足配線のように構成が煩雑になってしまいます。

図4: 2層構成のその後
2層構成のその後

それから、rtはNICが2つ以上あり、2つのスイッチにつながっていなければなりません。つまり、物理構成(NICの枚数)と物理配置(2つのスイッチへの接続)がrtになるための条件となってしまいます。もし、rtとなるマシンをLinuxベースで作っている場合、内部ネットワークのWebサーバなど、同じPCサーバという意味で代替候補機はうようよいるわけなのですが、この2つの制約(物理構成、物理配置)のため、rtの代替機とすることはできません。

理想の構成

さて、ここまでで3つのネットワーク構成をみてきましたが、それぞれ一長一短がありました。

  • 可用性
  • 復旧作業の簡素化
  • ネットワークの分離
  • ネットワーク構成の簡素化、フラット化

全ての希望が叶えられる夢の構成はないでしょうか?

・・・ということを追い求め続けた結果、筆者らDSASチームが出した現時点での答えが図5です。

図5: 理想の構成
理想の構成

物理構成はフラット構成(図2)と同じですが、VLAN(Virtual LAN)というものを使って、論理的にネットワークを分割しています。

ここまでのまとめ

4つのネットワーク構成それぞれについて、メリットとデメリットをみてきました。最後の「理想の構成」の最大のメリットは何かというと、「運用のしやすさ」なのですが、もうちょっと具体的に、これまでの話を整理しながら整理してみましょう。

物理的な作業が不要

物理的にはフラットな構成なので、最初に設置してしまえば、以後の物理的な作業(機器の移設や電源、LANケーブルの差し替え)は発生しません。

同一のネットワークセグメント内でのサーバの役割変更(Webサーバをメールサーバに役割変更するなど)はソフトウエア的に行えますし、ネットワークセグメントをまたぐ移動はVLANで論理的に行えます。

うっかりケーブルを抜いてしまったといったミスをはじめ、落下による機材の破損や作業者の負傷といった可能性もあるので、物理的な作業は極力少ない方が望ましいと考えます。

さて、このサーバの役割変更をさらに押し進め、

  • ディスクが不要な役割のサーバはネットワークブートにする
  • - ロードバランサやキャッシュサーバや復旧用のブートイメージなど
  • - ディスク故障からの開放というメリットもある
  • リモートからPCのBIOSを操作できるようにする
  • - IPMIやシリアルコンソールやKVM over IPなどを導入する
  • - ディスクからブートするかネットワークブートするか、BIOSの設定を変更できるようにするため
  • リモートからgrubやpxelinuxなどのブートローダを操作できるようにする
  • - カーネルの選択やブートパラメータの指定のため

といった環境を整えれば、物理的作業が不要なだけでなく、役割変更や復旧作業を全てリモートから行うことができるようになり、作業時間をかなり短縮することができます。

ネットワークのタコ足配線からの開放

rt配下のネットワークセグメントが増えても、後述するポートVLANとタグVLANを活用しているので物理的な複雑度は増しません。

逆に、物理的にネットワークセグメントを分割している場合を考えてみましょう。タコ足配線化して物理的な複雑度が増すという問題点は、さきほど見た図4のとおりです。それに加え、rtの物理構成(NICの数)も他のサーバと大きく異なってしまうため、「リモートから、Webサーバをrtサーバに役割変更」といったことをしようと思っても絶望的になってしまいます。

VLANとは

前節でVLANというものが出てきました。LinuxでVLANを使ったフラットなネットワークを組んでみる前に、VLANについて簡単に解説します。

用途

VLANとは、 「物理的にではなく論理的にネットワークセグメントを分割するためのもの」もしくは 「ハードウエア的にではなくソフトウエア的にネットワークセグメントを分割するためのもの」といえます。

通常ですと、ネットワークセグメントを分割するには、複数のスイッチによって物理的に分割します。

一方、VLANの場合は、スイッチの設定を操作することにより、(物理構成を変更せずに)ネットワークを分割することができます。

VLAN ID

VLANではVID(VLAN ID, VLAN Identifier)という識別子により、論理的に分割されたネットワークを区別します。「このVLANのVIDは2で、あのVLANのVIDは3」といった具合です。

VIDは0から4095までの数値で表現されます。ただしいくつかのVIDは予約されていますので、VLANを構成するときはこれら以外のVIDを使いましょう(表1)。

また、製品によってはVLANに文字列の名前をつけることができますが、これは人間が見たときにわかりやすくするためだけの機能であり、その製品の世界でのみ有効なラベルに過ぎません。本来のVLANの識別子は数値のVIDのみですので、混乱しないようにしましょう。

表1: 予約されているVID
VID 説明
0 「null VLAN ID」と呼ばれるもので、管理用に予約されています。
1 デフォルトのVID。機器の設定により変更可能。
4095(0xFFF) 「implementation use」として、管理用に予約されています。

論理的に分割するとは?

先ほどから「論理的に分割」という言葉を使ってきましたが、具体的にはどういうことなのか説明します。

一口にVLANといっても、いくつか種類があります。今回はそのうちのポートVLANとタグVLANについて説明します。

ポートVLAN

ポートVLANとは、スイッチのポートにVIDを割り振ってグルーピングする機能です。従って、ひとつのポートはひとつのVLANにしか属することができません。

スイッチにつながる機器には特別なものは必要ありませんが、スイッチ自身にポートVLANの機能が搭載されている必要があります。

タグVLAN

タグVLANとは、イーサネットフレームに、VIDなどを含む4オクテットの情報(タグ)を埋め込んで、埋め込んだタグの中のVIDによりグルーピングする機能です。IEEE 802.1Qにその仕様が定められています。

VIDが含まれるタグはイーサネットフレームにつくものなので、ひとつのポートで複数の異なるVIDのイーサネットフレームを通すことができます。ここが1ポート1VLANのポートVLANとは対照的な点です。

よく引き合いに出されるタグVLANの使用例は、図6のようにスイッチをまたいだVLANを作るときです。この場合、物理的なスイッチが異なるため、スイッチを横断するようなポートVLANを複数構成することができません。そこでタグVLANの出番です。スイッチ間接続用のポートでタグVLANを有効にすると、VIDを含むタグが付与されたフレームがスイッチ間を流れるので、複数のスイッチの間で複数のVLANを構成できるようになります。

さて、タグVLANの場合、スイッチがタグVLANに対応していることはもちろんですが、スイッチ(のタグVLANを有効にしたポート)につなげる機器もタグVLANに対応したものでなければなりません。タグの付与と除去をしなければならないからです。図6の場合は、タグVLANを有効にしたポートにはタグVLANに対応したスイッチがつながっているのでいいのですが、はてさてここにLinuxサーバはつなげられるでしょうか?

実はLinuxはタグVLANに対応しているのでつなげることができます。少なくともkernel 2.6ではパッチなどは不要です。タグVLANの機能を有効にしてkernelをビルドすれば、Linuxでもタグつきのフレームを扱うことができます。そしてこの機能を使うことにより、図5のような構成が可能となるわけです。

図6: スイッチをまたいだVLAN
スイッチをまたいだVLAN

LinuxでVLAN

ここまででVLANについてとVLANを使ったネットワーク構成のお話をしましたので、最後に実際にVLANを使った簡単なネットワークを作りつつ、LinuxでタグVLANを扱う方法を紹介したいと思います。

今回の目標

これから図7のようなネットワークを組んでみたいと思います。

図7: 今回作るネットワーク図
今回作るネットワーク図

使用するスイッチのポートは(1)〜(3)の3つで、それぞれのポートにつながっているマシンを順にA、X、Bと名付けます。

表2が、今回使用するVLANの一覧で、VLAN FOOにはマシンAとXが、VLAN BARにはマシンBとXが属しています。VLANごとのネットワークアドレスは表の通りで、図7のように、AのIPアドレスは10.6.25.10、Bは192.168.0.20とします。Xは両方のネットワークのIPアドレスを持つことになるのですが、それはおいおい説明するとして、最初は便宜的に10.6.25.9を割り当てておきます。

まずはこのようなネットワークを組んでみて、期待した通りVLAN FOOとVLAN BARの間で通信ができないことを確認します(VLANによる論理ネットワークの分割)。続いて、Xでパケット転送を有効にして、VLAN FOOとVLAN BARとの間で特定の通信のみ許可できるようになるところまでもっていきたいと思います。

表2: 使用するVLANの一覧
VLAN ID 名前 ネットワーク 所属するマシン
2 FOO 10.6.25.0/24 A, X
3 BAR 192.168.0.0/24 B, X

必要な機材

  • ポートVLANとタグVLANをサポートしているスイッチングハブ
  • Linux(kernel 2.6)がインストールされているPCが3台

なにはさておき、VLANをサポートしているスイッチングハブが必要です。今回はたまたま手元にあった、Allied TelesisのCentreCOM FS816M(注1)を使用します。

スイッチにつながるPCは3台必要で、kernel 2.6系のLinuxが既にインストールされているものとします。ディストリビューションはなんでも構いませんが、以下の説明ではDebianを使っています。

注1
管理コマンドのリファレンスマニュアルがWebで公開されています。 http://www.allied-telesis.co.jp/support/list/switch/fs808m_816m/m698303b/index.html

とりあえずつないでみる

マシンA、X、Bに、図7の通りのIPアドレスを設定して、まずはなにも設定していないスイッチにつないでみましょう。

この状態ではまだVLANの設定をしていないので、マシンに設定したIPアドレス帯が異なっても、ブロードキャストなどは届いてしまうはずです。

実際に確認してみましょう。

Bで、

B# ping -b 255.255.255.255

と実行した際の、Aでのパケットキャプチャは図8のようになります。B(192.168.0.20)からのパケットが届いてしまっているのが確認できますね。

図8: BからAへパケットが届いている様子
A# tcpdump -ne -i eth0 net 192.168
16:49:29.409268 00:90:cc:10:66:9b > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 98: 192.168.0.20 > 255.255.255.255: ICMP echo request, id 50195, seq 1, length 64
16:49:30.423368 00:90:cc:10:66:9b > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 98: 192.168.0.20 > 255.255.255.255: ICMP echo request, id 50195, seq 2, length 64
16:49:31.423580 00:90:cc:10:66:9b > ff:ff:ff:ff:ff:ff, ethertype IPv4 (0x0800), length 98: 192.168.0.20 > 255.255.255.255: ICMP echo request, id 50195, seq 3, length 64

ポートVLANの設定(スイッチ)

次に、ポートVLANの設定をします。これで、論理的に分断されるので、AとBの間の通信は不通になるはずです。

今回使用するスイッチでは、シリアル経由で管理コンソールにログインして、図9のコマンドを投入します。(1)でVLANを作成し、(2)でVLAN FOOに(マシンAがつながっている)ポート1を追加し、(3)でVLAN BARに(マシンBがつながっている)ポート3を追加しています。

VLANの設定状態を確認するには、図10のようにSHOW VLANコマンドを使います。VLAN FOOとBARに、それぞれポート1と3が属しているのが確認できます。

ここまでできたら、さきほどの図8と同じように、AでパケットキャプチャをしながらBでpingを打ってみましょう。さきほどとは異なり、パケットが流れてこないのが確認できると思います。同じように、どのVLANにも属していないポート2につながっているマシンXでパケットキャプチャをしてみても、パケットが流れてこないのが確認できるはずです。

図9: ポートVLANの設定
CREATE VLAN=FOO VID=2 ┐(1)
CREATE VLAN=BAR VID=3 ┘

ADD VLAN=FOO PORT=1   ─(2)
ADD VLAN=BAR PORT=3   ─(3)
図10: ポートVLANの設定の確認
sw# SHOW VLAN

VLAN Information (VID range: 0)
--------------------------------------------------
 Name ................ default
 Identifier .......... 1
 Status .............. Static
 Protected Ports ..... No
 Untagged Ports ...... 2,4-16
 Tagged Ports ........ None
 Trunk Ports ......... None
 Mirror Port ......... None
 Management Port ..... None
--------------------------------------------------
 Name ................ FOO
 Identifier .......... 2
 Status .............. Static
 Protected Ports ..... No
 Untagged Ports ...... 1      ← ポート1
 Tagged Ports ........ None
 Trunk Ports ......... None
 Management Port ..... None
--------------------------------------------------
 Name ................ BAR
 Identifier .......... 3
 Status .............. Static
 Protected Ports ..... No
 Untagged Ports ...... 3      ← ポート3
 Tagged Ports ........ None
 Trunk Ports ......... None
 Management Port ..... None
--------------------------------------------------

タグVLANの設定(スイッチ)

ここまでで、VLANを作り通信を遮断することができました。続いては、ポート2にタグVLANの設定をして、マシンXにはVLAN FOOとVLAN BARの両方のパケット(ただしタグつき)を流すようにしてみます。

スイッチにログインして、図11のコマンドを投入します。図9と似ていますが、「FRAME=TAGGED」という句がついています。(1)の場合は、VLAN FOOに(マシンXがつながっている)ポート2を追加しろ、ただし「イーサネットフレームにVLANのタグをつけて」という意味になります。(2)も同様です。

設定ができたら確認してみましょう(図12)。VLAN FOOとVLAN BARの「Tagged Ports」にポート2が追加されたのが確認できますね。

図11: タグVLANの設定
ADD VLAN=FOO PORT=2 FRAME=TAGGED ─(1)
ADD VLAN=BAR PORT=2 FRAME=TAGGED ─(2)
図12: タグVLANの設定の確認
sw# SHOW VLAN

VLAN Information (VID range: 0)
--------------------------------------------------
 Name ................ default
 Identifier .......... 1
 Status .............. Static
 Protected Ports ..... No
 Untagged Ports ...... 2,4-16
 Tagged Ports ........ None
 Trunk Ports ......... None
 Mirror Port ......... None
 Management Port ..... None
--------------------------------------------------
 Name ................ FOO
 Identifier .......... 2
 Status .............. Static
 Protected Ports ..... No
 Untagged Ports ...... 1
 Tagged Ports ........ 2      ← ポート2
 Trunk Ports ......... None
 Management Port ..... None
--------------------------------------------------
 Name ................ BAR
 Identifier .......... 3
 Status .............. Static
 Protected Ports ..... No
 Untagged Ports ...... 3
 Tagged Ports ........ 2      ← ポート2
 Trunk Ports ......... None
 Management Port ..... None
--------------------------------------------------

タグVLANの設定(Linux)

スイッチのタグVLANの設定ができれば、もうポート2のマシンXにはVLAN FOOやVLAN BARのパケットが流れているはずです。ただし、タグつきのイーサネットフレームで。

というわけで確認してみましょう。マシンXで、図13のようにtcpdumpを実行します(注2)。ここで注目して欲しいのは「ethertype」の後の文字列です。さきほどの図8のように、通常のパケットキャプチャの場合はここが「IPv4」となるのですが、今回は「802.1Q」となっています。これこそ、通常の(IPv4などの)イーサネットフレームではなく、タグVLAN拡張されたイーサネットフレームであることの印です。

図13: XへタグVLANのパケットが届いている様子
X# tcpdump -ne -i eth0
17:21:21.917767 00:1a:a0:42:f8:6f > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 64: ethertype ARP, arp who-has ...
17:21:21.931694 00:16:e6:f0:32:9a > ff:ff:ff:ff:ff:ff, ethertype 802.1Q (0x8100), length 64: ethertype ARP, arp who-has ...
注2
tcpdump -ne -i eth0 vlan 2 のようにすると、VLAN IDが2のものだけキャプチャすることができます。 ただし、後述するvconfigコマンドでVLAN用のインターフェースを作ったあとでは、この形式ではキャプチャできなくなる点に注意してください。

タグVLANのパケットが来ているのが確認できたところで、AからXへpingを打ってみましょう。

・・・あれ、応答がありません。

実は、「ethertype 802.1Q」のフレームは、タグVLANの情報が挿入された分だけフレームのサイズが大きくなってしまい、イーサネットの規格からすると不正なものとなってしまいます。その結果、イーサネットフレームの処理が正しく行えないので、通信ができないということになってしまっています。そこで、イーサネットフレームのタグVLANの部分を処理する機構が必要になってくるわけです。

Linuxの場合は、kernelの設定と補助ツールでタグVLANに対応することができます。

kernelの設定

Xとなるマシンで、CONFIG_VLAN_8021Qがmやyになっていれば、そのkernelは既にタグVLANに対応しています(注3)。

そうでない場合は、make menuconfigなどでCONFIG_VLAN_8021Qを有効にしてkernelをビルドしなおします(図14)。

注3
環境にもよりますが、 gzip -cd /proc/config.gz で稼働中のkernelの設定を確認することができます。
図14: CONFIG_VLAN_8021Q(kernel 2.6.22.2)
Networking  --->
  [*] Networking support
    Networking options  --->
      <M> 802.1Q VLAN Support

vconfigのインストール

kernelのサポートに加え、vconfigという管理コマンドも必要です。

vconfigのインストールは、お使いのディストリビューションにバイナリパッケージがあれば、それを使えばいいでしょう。恐らく、「vconfig」や「vlan」でパッケージを検索すれば、見つかると思います。Debianの場合は「vlan」という名のパッケージなので、

# aptitude install vlan

でvconfigコマンドをインストールできます。

自分でソースをコンパイルする場合は、LinuxのVLAN実装のサイト(注4)からアーカイブをダウンロードしてコンパイルしてください。アーカイブの中にはkernelパッチも含まれていますが、kernel 2.6の場合はパッチを当てる必要はありません。

タグVLANのパケットを扱えるようにする

LinuxでタグVLANを扱うには、vconfigコマンドでVLAN IDとひもづいた仮想ネットワークインターフェースを作ります。すると、そのインターフェースから、ひもづけたVLANのパケットのみが、タグの部分が除去された状態で受信できます。逆に、送信する場合は、kernelが自動的にイーサフレームにタグを挿入してくれます。この仮想ネットワークインターフェースは、通常の「eth0」といったものと同じように、tcpdumpやiptablesで扱うことができます。

では実際に設定してみましょう。図15を見てください。

まずはじめに、kernelのタグVLANサポートをモジュールにしている場合は、(1)のようにしてkernelモジュールをロードしておきます。

次にvconfigコマンドを使って、VLAN IDとひもづく仮想ネットワークインターフェースを作ります。(2)では、物理インターフェースeth0を行き来するVLAN IDが2のパケット用のインターフェースを作っています。この結果、(4)のように、「eth0.2」というインターフェースが新しくできます(注5)。同様に、(3)でVLAN IDが3のインターフェースを作っています。これも同じく、(4)をみると「eth0.3」ができているのが確認できます。

インターフェースができたので、IPアドレスを割り当てます。(5)でVLAN FOO(VID=2)用のeth0.2には10.6.25.1を、(6)でVLAN BAR(VID=3)用のeth0.3には192.168.0.1を割り当てています。

これでAから10.6.25.1へのpingが、Bから192.168.0.1へのpingが通るはずですが・・・Aからのpingが通りませんね。マシンXのルーティングテーブルを確認してみましょう(図16)。おやおや。宛先(Destination)が10.6.25.0/24の場合の経路が2つありますね。どうやら、VLANに属していないeth0のほうへパケットが流れてしまい、期待した通りに通信できないのが原因のようです。ですので、図中のroute delコマンドでeth0を経由する経路を削除します。これで、A←→X、B←→Xの通信ができるようになりました。

ちなみにDebianの場合ですが、VLAN用のインターフェースの作成からアドレスの割り当てまでは、vlanパッケージがインストールされていれば、/etc/network/interfacesにリスト1のように書いておくと、起動時に自動的に設定してくれます。詳しくはman vlan-interfacesを参照してください。

図15: タグVLANの設定(Linux)
X# modprobe 8021q      ─(1)

X# vconfig add eth0 2  ─(2)
Added VLAN with VID == 2 to IF -:eth0:-
X# vconfig add eth0 3  ─(3)
Added VLAN with VID == 3 to IF -:eth0:-

X# ip addr show  ※一部省略してあります
2: eth0: <BROADCAST,MULTICAST,UP,10000> mtu 1500 qdisc pfifo_fast qlen 1000
    link/ether 00:1a:a0:42:f4:12 brd ff:ff:ff:ff:ff:ff
    inet 10.6.25.9/24 brd 10.6.25.255 scope global eth0
3: eth0.2@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop  ┐
    link/ether 00:1a:a0:42:f4:12 brd ff:ff:ff:ff:ff:ff     │(4)
4: eth0.3@eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop  │
    link/ether 00:1a:a0:42:f4:12 brd ff:ff:ff:ff:ff:ff     ┘

# ifconfig eth0.2 10.6.25.1   netmask 255.255.255.0 broadcast 10.6.25.255   ─(5)
# ifconfig eth0.3 192.168.0.1 netmask 255.255.255.0 broadcast 192.168.0.255 ─(6)
注5
「eth0.2」という名前が気に入らなければ、ipコマンドで名前を変更することがきます。例えば、「NEWNAME」に変更する場合は、 ip link set eth0.2 name NEWNAME とします。 ちなみに、VLANのインターフェースじゃなくても名前を変えることができます。eth0をachiに、eth1をkochiにするということも可能です。
図16: マシンXのルーティングテーブル
X# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
192.168.0.0     0.0.0.0         255.255.255.0   U         0 0          0 eth0.3
10.6.25.0       0.0.0.0         255.255.255.0   U         0 0          0 eth0
10.6.25.0       0.0.0.0         255.255.255.0   U         0 0          0 eth0.2
0.0.0.0         10.6.25.254     0.0.0.0         UG        0 0          0 eth0

X# route del -net 10.6.25.0 netmask 255.255.255.0 dev eth0
リスト1: Debianの場合の設定例
auto  eth0
iface eth0   inet static
  address    10.6.25.9
  netmask    255.255.255.0
  network    10.6.25.0
  broadcast  10.6.25.255
  gateway    10.6.25.254

auto  eth0.2
iface eth0.2 inet static
  address    10.6.25.1
  netmask    255.255.255.0
  post-up route del -net 10.6.25.0 netmask 255.255.255.0 dev eth0

auto  eth0.3
iface eth0.3 inet static
  address    192.168.0.1
  netmask    255.255.255.0

VLAN間通信(全開)

ここまでで、AとXの間、XとBの間の通信はできるようになりました。次に、マシンXでパケット転送を有効にして、Xを経由してAとBが通信できるようにしてみましょう。

マシンAで図17の(1)を、マシンBで図17の(2)を実行して、対向のVLANのルーティングを、XのIPアドレス(10.6.25.1または192.168.0.1)に向けます。あとは、マシンXで図17の(3)を実行すれば、AとBの間で通信ができるようになります。

図17: VLAN間通信
(1)マシンAで実行
A# route add -net 192.168.0.0 netmask 255.255.255.0 gw 10.6.25.1   dev eth0

(2)マシンBで実行
B# route add -net 10.6.25.0   netmask 255.255.255.0 gw 192.168.0.1 dev eth0

(3)マシンXで実行
X# echo 1 > /proc/sys/net/ipv4/ip_forward

VLAN間通信(許可したもののみ)

最後に、全てのパケットを転送するのではなく、許可したもののみ転送するようにしてみましょう。マシンAが属するVLAN FOOがサーバファーム内部のネットワークで、マシンBが属するVLAN BARが上位ルータとのネットワークと思っていただくとイメージしやすいんではないかと思います。

FOO→BARは許可、BAR→FOOは拒否

許可・拒否の制御はiptablesのFORWARDチェインで行います。出入口のインターフェースはeth0.2とeth0.3となります。Linuxでゲートウェイルータを作ったことがある方ならピンとくるのではないかと思います。

では、マシンXで、リスト2のコマンドを実行します。

リスト2を解説すると、

  • 許可・拒否のルールを初期化(1行目)
  • VLAN FOO(eth0.2)からBAR(eth0.3)へ向かうパケットは許可(4行目)
  • 既に確立されている接続とそれに関連するパケットは許可(3行目)
  • 上記以外は全て拒否(2行目)

ということになります。

リスト2: A→Bは許可、B→Aは拒否
01: iptables -F FORWARD
02: iptables -P FORWARD DROP
03: iptables -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
04: iptables -A FORWARD -j ACCEPT -i eth0.2 -o eth0.3

BAR→FOOはHTTPだけ許可

BAR→FOOは全拒否ではなく、HTTP(ポート80)だけ許可するようにするには、リスト2に続いて、リスト3を実行すればOKです。

リスト3: B→AはHTTPだけ許可
01: iptables -A FORWARD -j ACCEPT -i eth0.3 -o eth0.2 -p tcp -d 10.6.25.0/24 --dport 80

おわりに

今回は運用しやすいネットワーク構成を求めて、VLANを使ったフラットな構成について考察してみました。

「KISS」(Keep It Simple, Stupid)という格言の通り、構成は極力単純に、シンプルにするべきだと考えます。今回は、複雑になりがちなネットワーク構成を、VLANを活用してシンプルな物理構成で実現するお話をしました。

VLANというと、オフィスやフロア間のネットワークといった文脈で見聞きすることが多いと思いますが、今回のようにサーバファームで活用することにより、「物理構成の単純化」を実現でき、「運用のしやすさ」につなげることができます。

タコ足配線でお悩みの方もそうでない方も、ネットワーク構成を設計する際にはVLANの導入を検討してみるのもいいのではないかと思います。

今回のまとめ

  • 運用をラクにするため、できるだけ構成はシンプルにすべき
  • 物理構成はシンプルにし、固定化して動かさないようにする
    • ミスが減り、現地作業も減る
  • 構成変更は論理変更で対応する
    • 今回はVLANを活用
    • リモートから構成変更が可能になる
  • VLANはタコ足配線解消に効果的

コラム: VLAN FOOをデフォルトVLANにする

「デフォルトVLAN」とはなにかというと、VLANではないネットワークです。例えば、本文の図10では、ポート1と3はポートVLANに参加していますが、それ以外のポート(2と4〜16)はデフォルトVLANに参加している(=どのVLANにも参加していない)ことになります。

今回はあえて説明のためVLANを2つ(FOOとBAR)作りましたが、片方はデフォルトVLANでも構いません。

例えば、VLAN FOOをデフォルトVLANにした場合、マシンAとマシンXのeth0とはそのままで通信できるので、図16で行ったようなルーティングテーブルの操作は必要ありません。パケットフィルタリングは、リスト2とリスト3の「eth0.2」を「eth0」に置き換えればOKです。

VLAN FOO側がサーバファーム内部のネットワークで、サーバが大量にあるような場合は、いちいちスイッチでポートVLANの設定をするのが面倒なので、内部はデフォルトVLANにしてしまうというのもアリだと思います。

コラム: VLANを使った超フラットな構成の実例

VLANを活用したフラットな構成の実例として、筆者らのDSASの構成をお見せしたいと思います。(図18)

基本的には本文中の図5と同じですが、上位ルータとつながっているスイッチをコアスイッチと呼び、このコアスイッチを中心として、各サーバラックのスイッチへとのびているようなスター型の構成にしています。リニア型、つまり、コアスイッチ‐スイッチ1‐スイッチ2を直列につなぐような構成だと、スイッチ1が故障した場合にスイッチ2までその影響を受ける可能性があるため、リニア型ではなくスター型にしています。

ちょっと余談になりますが、図18の図中のモノの配置が左右対称でないのが気になった方はするいどいです。実は、実稼働中の構成では、左列のスイッチと対になるスイッチが右列にもあり、各サーバは両方のスイッチにつながっています。本連載ではまだ紹介していないトピックなので図では省略しましたが、次回、レイヤ2以下の冗長化のお話をする予定ですので、そのときにまた改めて解説したいと思います。

図18: VLANを使った実例
VLANを使った実例

この連載の記事一覧

参考図書

目次