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
仮想スイッチの作成は以下のように行うだけです。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ゾーンの構成を変更して仮想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 11.2 システムハンドブック![]() |
Oracle Solaris 11 試験対策本(OCA)![]() |