Xen上で仮想のネットワークを作る

まずはLVS + WEB x 2 の環境をXenの上で実現するためにネットワークまわりの仕込みを行おうと思います。ネットワークはこんな感じをイメージ。xenbr0がホストOSの実インタフェースであるeth0に繋がっていてここから実際のネットワークに出れるようになっています。あわせてWeb x 2は外向きに直接足を持たないプライベートなネットワークにいると想定してホストOS内で閉じた仮想ネットワークを作って接続します。Xenではやったことはありませんが、VMWare, OpenVZともに同じ様な事はやったことがあるので出来るであろうという事とおおよその目星はつけられます。ちなみにVMWare Infrastructure(ESXi)だと下記のような仮想ネットワークをGUIで簡単に作ることができたりもします。

 ----------------+----------------- 192.168.0.0/24 (xenbr0)
                 |
                 |
                 | .30
            +----+----+
            |   lvs   |
            +----+----+
                 | .10
                 |
                 | 
 --------+-------+-------+-------- 192.168.1.0/24 (xenbr1)
         |               |
         |               |
         | .11           | .12
    +----+----+     +----+----+
    |   web1  |     |   web2  |
    +---------+     +---------+
 

bridgeの追加

192.168.0.0/24(ホストOSが所属するネットワーク)は特に設定しなくてもドメイン0経由で外に対する疎通が取れるみたいなんですが、上記の構成を作るには192.168.1.0/24に相当するネットワークを作る必要があります。で調べたところ、Xenではxenbrなる仮想ブリッジを作ってゲストOSを結線してあげて仮想のサブネットを作るみたいです。

追加方法をちろちろと調べてみたところ/etc/xen/xend-config.sxp内で

(network-script network-bridge)

により/etc/xen/scripts/network-bridgeを呼び出していて、network-bridgeはデフォルトだとxenbr0を作成するようなスクリプトになっているようです。なのでnetwork-bridegeを用いてxenbr0,xenbr1を作るラッパーのようなスクリプトを書いてxend-config.sxp内で指定してあげれば良いみたいです。

# vi /etc/xen/scripts/mybridge

#!/bin/sh
dir=$(dirname $0)
 
${dir}/network-bridge "$@" vifnum=0 bridge=xenbr0 netdev=eth0 antispoof=yes
${dir}/network-bridge "$@" vifnum=1 bridge=xenbr1 netdev=dummy0 antispoof=yes

echo 0 >/proc/sys/net/ipv4/ip_forward

スクリプトに実行権限を与える

# chmod 755 /etc/xen/scripts/mybridge

ラッパースクリプトを呼び出す様に修正

# vi /etc/xen/xend-config.sxp

 < (network-script network-bridge)
 ---
 > (network-script mybridge)

xendを再起動(設定反映)

# /etc/init.d/xend restart

xenbr1が出来ているか確認

# ifconfig

xenbr0    Link encap:Ethernet  HWaddr FE:FF:FF:FF:FF:FF  
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:28272 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:5838768 (5.5 MiB)  TX bytes:0 (0.0 b)

xenbr1    Link encap:Ethernet  HWaddr 00:00:00:00:00:00  
          UP BROADCAST RUNNING NOARP  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

ゲストOSのインタフェースを修正

各ゲストOSがどのブリッジに結線されるかは/etc/xen以下にある各ゲストOSごとの設定ファイルで指定することができます。各々こんな感じ。

lvs

# vi /etc/xen/lvs

vif = [ 
        "mac=00:16:3e:74:d4:bf,bridge=xenbr0",
        "mac=00:16:3e:74:d5:bf,bridge=xenbr1",
      ]

web1

# vi /etc/xen/web1

vif = [ "mac=00:16:3e:48:75:ab,bridge=xenbr1" ]

web2

# vi /etc/xen/web2

vif = [ "mac=00:16:3e:51:1e:e5,bridge=xenbr1" ]

lvsはxenbr0, xenbr1の両方にweb1, web2はxenbr1のみに結線しているのがわかるかと思います。XenMACアドレスのベンダコードは00:16:3eなんですね。他のOpenVZ, VMWareなんかもキチンとベンダコードが与えられてた記憶があります。

とネットワーク構成を作るのはおおよそこんな感じ。後は各ゲストOS上でアドレスつけたり、lvsフォワーディングを許可してルーティングできるように設定したところ。キチンとweb1, web2も外との疎通が取れる様になりました。

これで晴れてLVSの設定に入れそうです。仮想だとやっぱり複雑さは増えるし管理コスト自体は上がってしまいそうですねー。便利で面白いとは思いますが、反面、運用的には良くない側面もやはりあると思います。トレードオフですね。まあこの辺にどう折り合いつけるかはインフラエンジニアの悩みどころであり、同時に楽しみでもあるとは思いますけど。趣味で触る分には面白ければそれで良し! かな。 ( ̄△ ̄)y─┛~~~~~