トップページ > OpenSolaris関連 > OpenSolaris2009.06 で Crossbow を使用して仮想ネットワーク環境を構築する
カテゴリー
オラクルエンジニア通信
サポートページ
マニュアルページ
ソフトウェアダウンロード
中古UNIXマシン購入
blogs.sun.com
お勧めサイト
プライベートリンク

OpenSolaris2009.06 で Crossbow を使用して仮想ネットワーク環境を構築する

Crossbowでは仮想NICや仮想スイッチといった機能が提供されるため、既存のコンテナ機能やVirtualBox、Xenなどのホストの仮想化機能と組み合わせることにより、1つの物理システム内に複数の仮想的なネットワーク環境を作成することが可能になります。

例えば以下のようなネットワーク構成があったとします。

これをCrossbowとコンテナ(ゾーン)機能を使用して以下のように1つのシステムに集約してしまいます。

今回は詳しく触れませんが、仮想ルーターをF/Wやロードバランサーにしたり、各仮想NICに帯域制限を設けたり、複数の物理NICを集約(aggregate)して、その上に仮想NICを構成したりと、まさに自由自在です。しかも各仮想NICごとにフロー制御やトラフィックの統計情報なども取ることが可能です。

事前準備

まずはOpenSolarisでデフォルトで有効になっているnwamサービスを停止して、従来のネットワーク構成方法に切り替えます。このシステムではe1000g0物理NICを認識しているので必要に応じて以下のようにファイルを構成しておきます。

global# cat /etc/hostname.e1000g0
192.168.1.20
global# cat /etc/inet/netmasks
...(省略)
192.168.1.0     255.255.255.0
global# svcadm disable physical:nwam
global# svcadm enable physical:default

OpenSolaris(大域ゾーン)のIP構成は以下のようになります。

global# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.1.20 netmask fffffe00 broadcast 192.168.1.255
        ether 8:0:27:a0:72:63
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
        inet6 ::1/128

仮想スイッチと仮想NICの作成

仮想スイッチの作成は以下のように行うだけです。vsw1やvsw2が仮想スイッチの名前で任意の分りやすい名前にしてください。

global# dladm create-etherstub vsw1
global# dladm create-etherstub vsw2
global# dladm show-etherstub
LINK
vsw1
vsw2

仮想NICの作成も簡単です。各仮想スイッチに対応する(接続する)ように仮想NICを作成します。例えばvnic10,vnic11,vnic12は同じスイッチに接続されるため、これらの仮想NICを割り当てられたマシン(非大域ゾーン)は同一サブネットに配置されることになります。前述の図のように仮想ルーターvrouterには将来的にvnic10とvnic20を割り当て、2つの仮想ネットワークをつなぐように構成します。

global# dladm create-vnic -l vsw1 vnic10
global# dladm create-vnic -l vsw1 vnic11
global# dladm create-vnic -l vsw1 vnic12
global# dladm create-vnic -l vsw2 vnic20
global# dladm create-vnic -l vsw2 vnic21
global# dladm create-vnic -l vsw2 vnic22
global# dladm show-vnic
LINK         OVER         SPEED  MACADDRESS           MACADDRTYPE         VID
vnic10       vsw1         0      2:8:20:31:dc:bb      random              0
vnic11       vsw1         0      2:8:20:68:f3:ff      random              0
vnic12       vsw1         0      2:8:20:7e:55:19      random              0
vnic20       vsw2         0      2:8:20:8f:ef:2e      random              0
vnic21       vsw2         0      2:8:20:e9:c4:ee      random              0
vnic22       vsw2         0      2:8:20:52:8c:89      random              0

ちなみに、今回の例のようにシステム内に仮想ネットワーク環境を構築する必要がなければ仮想スイッチ(vsw1やvsw2)の作成は不要で、vsw1の部分をe1000g0のように物理NICにすれば、e1000g0上に仮想NICを複数作成することができます。(ゾーンごとに帯域制限などをしたい場合に便利ですね)

次に作成した仮想NICの1つ(vnic12)を大域ゾーンの追加NICとして認識させます。

global# ifconfig vnic12 plumb
global# ifconfig vnic12 inet 10.1.0.12 netmask 255.255.255.0 up
global# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1004843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 1500 index 2
        inet 192.168.1.20 netmask fffffe00 broadcast 192.168.1.255
        ether 8:0:27:a0:72:63
vnic12: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 9000 index 3
        inet 10.1.0.12 netmask ffffff00 broadcast 10.1.0.255
        ether 2:8:20:7e:55:19
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
        inet6 ::1/128

再起動後も上記のような設定にするために、/etc/hostname.vnic12や/etc/inet/netmasksファイルを作成・編集しておきます。

global# cat /etc/hostname.vnic12
10.1.0.12
global# cat /etc/inet/netmasks
...(省略)
192.168.1.0     255.255.255.0
10.1.0.0        255.255.255.0

次に、非大域ゾーンで構成する仮想ネットワークから大域ゾーンのe1000g0を通って外部(インターネット)接続できるように大域ゾーンをルーターとして構成します。もちろん仮想ネットワークのIPアドレスは外部に公開するものではありませんので、NATの設定も以下のように行います。

global# cat /etc/ipf/ipnat.conf
map e1000g0 10.1.0.0/24 -> 0/32 portmap tcp/udp auto
map e1000g0 10.1.0.0/24 -> 0/32

上記のようにNATの構成ファイルを作成したらipfilterサービスを有効にします。またipv4-forwardingサービスを有効にしてIPv4転送(フォワーディング)を有効にします。

global# svcadm enable ipfilter
global# svcadm enable ipv4-forwarding

以下のようにipnatコマンドでNATが有効になっていることを確認できます。

global# ipnat -l
List of active MAP/Redirect filters:
map e1000g0 10.1.0.0/24 -> 0.0.0.0/32 portmap tcp/udp auto
map e1000g0 10.1.0.0/24 -> 0.0.0.0/32

List of active sessions:

routeadmコマンドでIPv4 フォワーディングが有効になっていることを確認します。

global# routeadm
              Configuration   Current              Current
                     Option   Configuration        System State
---------------------------------------------------------------
               IPv4 routing   disabled             disabled
               IPv6 routing   disabled             disabled
            IPv4 forwarding   enabled              enabled
            IPv6 forwarding   disabled             disabled

           Routing services   "route:default ripng:default"

Routing daemons:

                      STATE   FMRI
                     online   svc:/network/routing/ndp:default
                   disabled   svc:/network/routing/legacy-routing:ipv4
                   disabled   svc:/network/routing/legacy-routing:ipv6
                   disabled   svc:/network/routing/rdisc:default
                   disabled   svc:/network/routing/route:default
                   disabled   svc:/network/routing/ripng:default

次のようにifconfigコマンドを実行してe1000g0とvnic12インタフェースにROUTERフラグが付いていることを確認することもできます。

global# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
e1000g0: flags=1104843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 1500 index 2
        inet 192.168.1.20 netmask fffffe00 broadcast 192.168.1.255
        ether 8:0:27:a0:72:63
vnic12: flags=1100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 9000 index 3
        inet 10.1.0.12 netmask ffffff00 broadcast 10.1.0.255
        ether 2:8:20:7e:55:19
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
        inet6 ::1/128

非大域ゾーンの作成&インストール

前の図にも示しているように、合計4つの非大域ゾーンを作成します。

ここではルーターとして動作させるvrouterというゾーンを作成する例を紹介します。 他の非大域ゾーンも使用する仮想NICなどを変更して同様に作成します。 ゾーンのインストール時には外部に存在するIPSパッケージサーバーにアクセスするので、大域ゾーンをインターネットアクセス可能にしておく必要があります。 (閉じたネットワークで検証している場合には少々面倒ですね・・・)

以下の構成のポイントはip-type=exclusiveという部分です。従来のゾーンの構成では物理NICが複数ある場合にのみ専用のNICを割り当てるために使用していました。Crossbowの実装により、仮想NICを物理NICと同様に割り当てることが可能になっています。

ちなみにip-type=exclusive設定の場合はIPアドレスの指定はゾーン構成で行わず、通常のホストと同様に非大域ゾーン内で行います。

global# zonecfg -z vrouter
vrouter: No such zone confi gured
Use 'create' to begin confi guring a new zone.
zonecfg:vrouter> create
zonecfg:vrouter> set zonepath=/export/vrouter
zonecfg:vrouter> set autoboot=false
zonecfg:vrouter> set ip-type=exclusive
zonecfg:vrouter> add net
zonecfg:vrouter:net> set physical=vnic10
zonecfg:vrouter:net> end
zonecfg:vrouter> exit
global#
global# zoneadm -z vrouter install
A ZFS file system has been created for this zone.
   Publisher: Using opensolaris.org (http://pkg.opensolaris.org/release/).
       Image: Preparing at /export/vrouter/root.
Sanity Check: Looking for 'entire' incorporation.
  Installing: Core System (output follows)
DOWNLOAD                                    PKGS       FILES     XFER (MB)
Completed                                  20/20   3021/3021   42.55/42.55

PHASE                                        ACTIONS
Install Phase                              5747/5747
  Installing: Additional Packages (output follows)
DOWNLOAD                                    PKGS       FILES     XFER (MB)
Completed                                  37/37   5598/5598   32.52/32.52

PHASE                                        ACTIONS
Install Phase                              7332/7332

        Note: Man pages can be obtained by installing SUNWman
 Postinstall: Copying SMF seed repository ... done.
 Postinstall: Applying workarounds.
        Done: Installation completed in 417.576 seconds.

  Next Steps: Boot the zone, then log into the zone console
             (zlogin -C) to complete the configuration process

非大域ゾーンのインストールが完了したら起動して、以下のようにzlogin -Cコマンドでアクセスします。初回起動時にIPアドレス等の設定を促されるので、前述の図のようにvnic10に10.1.0.10/24のIPアドレスを設定します。

global# zoneadm -z vrouter boot
global# zlogin -C vrouter
...(省略)

System identification is completed.

vrouter console login:

上記のようなメッセージが出たら非大域ゾーンvrouterへのログインが可能です。ここではまだログインせず大域ゾーンに戻ります。 zlogin -C でアクセスした場合は ~. でコンソール接続を切断します。

vrouter console login: ~.
[Connection to zone 'vrouter' console closed]
global#

他の非大域ゾーンhost11, host21, host22もIPアドレスの構成等を終わらせて以下のように起動している状態にします。

global# zoneadm list -vc
  ID NAME             STATUS     PATH                           BRAND    IP
   0 global           running    /                              native   shared
   2 vrouter          running    /export/vrouter                ipkg     excl
   3 host11           running    /export/host11                 ipkg     excl
   4 host21           running    /export/host21                 ipkg     excl
   5 host22           running    /export/host22                 ipkg     excl

この時点ではvrouterをルーターの構成にしていないため、以下のように大域ゾーンで10.2.0.0/24への静的ルートを追加して、ルーティングテーブルを変更してもhost21(10.2.0.21)やhost22(10.2.0.22)にはpingが通らず、同一ネットワークのhost11(10.1.0.11)とvrouter(10.1.0.10)だけにpingが通ります。

global# route -p add net 10.2.0.0/24 10.1.0.10
add net 10.2.0.0/24: gateway 10.1.0.10
add persistent net 10.2.0.0/24: gateway 10.1.0.10
global# netstat -nr

Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              129.158.17.254       UG        1         36 e1000g0
10.1.0.0             10.1.0.12            U         1          2 vnic12
10.2.0.0             10.1.0.10            UG        1          0
129.158.16.0         129.158.16.200       U         1         17 e1000g0
127.0.0.1            127.0.0.1            UH        1         28 lo0

global# ping 10.1.0.10
10.1.0.10 is alive
global# ping 10.1.0.11
10.1.0.11 is alive
global# ping 10.2.0.21
no answer from 10.2.0.21
global# ping 10.2.0.22
no answer from 10.2.0.22

また、以下のように大域ゾーンからzloginコマンドでhost21にアクセスし、host21からpingコマンドを実行すると、host22(10.2.0.22)にはpingが通ることが確認できます。ちなみにこの時点ではvrouterのvnic20はまだ有効にしていませんので、vrouterのvsw2側(10.2.0.20)にはアクセスできません。

global# zlogin host21
[Connected to zone 'host21' pts/4]
Sun Microsystems Inc.   SunOS 5.11      snv_111b        November 2008
host21# ping 10.2.0.22
10.2.0.22 is alive
host21# ping 10.2.0.20
no answer from 10.2.0.20

仮想ルーター(vrouter)の構成

ここではこのvrouterゾーンを仮想ルーターとして動作させるため、大域ゾーンからvrouterゾーンの構成を変更して仮想NIC(vnic20)を追加します。 以下のようにvrouterゾーンを停止して、zonecfgコマンドで仮想NICであるvnic20を追加し、再びvrouterゾーンを起動します。

global# zoneadm -z  vrouter halt
global# zonecfg -z vrouter
zonecfg:vrouter> add net
zonecfg:vrouter:net> set physical=vnic20
zonecfg:vrouter:net> end
zonecfg:vrouter> exit

global# zoneadm -z vrouter boot

vrouterゾーンが起動したら、以下のようにvnic20を構成します。

global# zlogin vrouter
[Connected to zone 'vrouter' pts/4]
Last login: Thu Aug 13 17:08:05 on pts/4
Sun Microsystems Inc.   SunOS 5.11      snv_111b        November 2008
vrouter# ifconfig vnic20 plumb
vrouter# ifconfig vnic20 inet 10.2.0.20 netmask 255.255.255.0 up
vrouter# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
vnic10: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 9000 index 2
        inet 10.1.0.10 netmask ffffff00 broadcast 10.1.0.255
        ether 2:8:20:31:dc:bb
vnic20: flags=1000843<UP,BROADCAST,RUNNING,MULTICAST,IPv4> mtu 9000 index 3
        inet 10.2.0.20 netmask ffffff00 broadcast 10.2.0.255
        ether 2:8:20:8f:ef:2e
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
        inet6 ::1/128

再起動後も有効になるように/etc/hostname.vnic20や/etc/inet/netmasksファイルを作成・編集しておきます。

vrouter# cat /etc/hostname.vnic20
10.2.0.20
vrouter# cat /etc/inet/netmasks
...(省略)
10.1.0.0        255.255.255.0
10.2.0.0        255.255.255.0

ルーターとして動作するようにipv4-forwardingサービスを有効にして、vnic10とvnic20にROUTERフラグが付いていることを確認します。

vrouter# svcadm enable ipv4-forwarding
vrouter# ifconfig -a
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
        inet 127.0.0.1 netmask ff000000
vnic10: flags=1100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 9000 index 2
        inet 10.1.0.10 netmask ffffff00 broadcast 10.1.0.255
        ether 2:8:20:31:dc:bb
vnic20: flags=1100843<UP,BROADCAST,RUNNING,MULTICAST,ROUTER,IPv4> mtu 9000 index 3
        inet 10.2.0.20 netmask ffffff00 broadcast 10.2.0.255
        ether 2:8:20:8f:ef:2e
lo0: flags=2002000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv6,VIRTUAL> mtu 8252 index 1
        inet6 ::1/128

デフォルトルーターを大域ゾーンのvnic12(10.1.0.12)に設定します。これで仮想スイッチvsw2に接続されている非大域ゾーンが、このvrouterを通って、大域ゾーンを経由して外部に接続することができます。(※大域ゾーンのNAT構成に10.2.0.0/24の変換も追加する必要あり!)

vrouter# route add default 10.1.0.12
add net default: gateway 10.1.0.12
vrouter# vi /etc/defaultrouter
10.1.0.12

再びhost21にzloginコマンドでアクセスし、他の非大域ゾーンとのネットワーク接続を確認します。デフォルトルートの追加を忘れないようにしてください。

global# zlogin host21
[Connected to zone 'host21' pts/4]
Last login: Thu Aug 13 17:33:43 on pts/4
Sun Microsystems Inc.   SunOS 5.11      snv_111b        November 2008
host21# route add default 10.2.0.20
add net default: gateway 10.2.0.20
host21# netstat -nr

Routing Table: IPv4
  Destination           Gateway           Flags  Ref     Use     Interface
-------------------- -------------------- ----- ----- ---------- ---------
default              10.2.0.20            UG        1          2
10.2.0.0             10.2.0.21            U         1         22 vnic21
127.0.0.1            127.0.0.1            UH        1          2 lo0

host21# ping 10.2.0.22
10.2.0.22 is alive
host21# ping 10.2.0.20
10.2.0.20 is alive
host21# ping 10.1.0.12
10.1.0.12 is alive
host21# ping 192.168.1.100 (外部ホスト)
192.168.1.100 is alive
host21# ping 10.1.0.11
no answer from 10.1.0.11

上記結果でhost11(10.1.0.11)にpingが通らないのはhost11上のルーティング構成の問題です。以下のように10.2.0.0/24への静的ルートを登録してけば解決します。

host11# route -p add net 10.2.0.0/24 10.1.0.10
add net 10.2.0.0/24: gateway 10.1.0.10
add persistent net 10.2.0.0/24: gateway 10.1.0.10

これで構成完了です。性能面での検証はまだ済んでおりませんが、10ギガビットEthernetを持つ高性能なシステムであれば、ネットワークデバイスが不要で1台で仮想データセンターが構築できてしまいますね。Crossbowがさらに発展していくことを期待しています。

オラクルユニバーシティSolaris系技術トレーニング一覧

Solarisお勧め書籍

Solaris 11.2 システムハンドブック
Oracle Solaris 11 試験対策本(OCA)