在上一篇文章中,我們通過在物理網卡上建立多個VNIC,實現了對物理網卡的複用。實際上,我們建立了一個1所示的網路環境。
圖1 由VNIC和Zone建立的網路環境
由圖1我們可用看出,我們建立了兩個虛擬網卡(VNIC):v1和v2,它們和物理網卡bge0一起組成了在本機環境中的一個位於同一子網上的三個鏈路層可連線物件,即虛擬網卡對象(雖然bge0是一個物理裝置,但對Solaris核心中的網路鏈路層而言,同v1和v2一樣,都是鏈路層可連線物件)。圖1中的全域zone和非全域zone都可用看作是一個獨立的系統(Zone的引入的初衷就是為了實現軟體上相互隔離的作業環境),它們的不同在於全域zone是作業系統安裝後提供給使用者的作業環境,非全域zone是由使用者(一般是特權使用者)在全域zone中建立的zone,特權使用者可用在全域zone中建立VNIC和非全域zone。但在非全域zone中,即使是特權使用者(即使是root使用者)也不能建立非全域zone或VNIC。
在這篇文章中,我們將建立一個虛擬網路。在這個網路中,網路的核心組件網卡介面、鏈路層交換器和路由器都採用Solaris的虛擬化技術實現,在現實應用中,我們可用把這些網路組件當作實際的網路組件使用,並在這個網路中部署客戶的網路服務,這些組件可以替代實際的網路組件,不同的是,系統管理員無需拔插網線,僅通過CLI(命令列介面)就可以管理這些組件。
在上一篇文章中,我介紹了VNIC,VNIC可以作為虛擬網路中的網卡來使用。同時,我們也可以使用Solaris具有獨立IP協議棧的Zone(Exclusive IP Stack Zone)來實現虛擬路由器(三層交換器)。然而,作為一個完整的LAN,我們還需要鏈路層交換器來串連位於同一子網的主機。這裡,我們可以使用Solaris Crossbow項目中引入的etherstub來扮演虛擬網路中的鏈路層交換器的角色。建立一個etherstub的命令是:
# dladm create-etherstub <etherstub_name>
我們可以通過"dladm show-link" 或 "dladm show-etherstub"來查看這個etherstub的資訊:
# dladm show-link <etherstub_name>
或:
# dladm show-etherstub <etherstub_name>
使用"dladm delete-etherstub <etherstub_name>"可以刪除這個etherstub。
下面,我將在不使用物理網路裝置的情況下建立一個2所示的虛擬網路,而這個網路完全存在於一個Solaris系統中,並且獨立於物理網路。如若使其存在並且運行,只需一台主機。
圖2 由VNIC,etherstub和Zone建立的虛擬網路結構圖
圖2中展示了兩個網路,我們的目的是讓zrouter作為一個路由器,使兩個網路中的虛擬機器主機zclient1和zclient2能相互連信。在這裡,zclient1,zclient2和zrouter都是非全域Zone。vclient1,vclient2,vrouter1和vrouter2都是VNIC,VNIC下面標註的是分配給各個VNIC的IP地址。
首先,我們先建立兩個etherstub作為鏈路層交換器:
global-zone# dladm create-etherstub etherstub1
global-zone# dladm create-etherstub etherstub2
global-zone# dladm show-etherstub
LINK
etherstub1
etherstub2
接下來,建立兩個VNIC: vclient1和vrouter1,並將其串連到etherstub1上:
global-zone# dladm create-vnic -l etherstub1 vclient1
global-zone# dladm create-vnic -l etherstub1 vrouter1
同理,建立兩個VNIC: vclient2和vrouter2,並將其串連到etherstub2上:
global-zone# dladm create-vnic -l etherstub2 vclient2
global-zone# dladm create-vnic -l etherstub2 vrouter2
此時,我們查看一下建立好的VNIC(其中,v1和v2是在上一篇文章中建立好的VNIC):
global-zone# dladm show-vnic
LINK OVER SPEED MACADDRESS MACADDRTYPE VID
v1 bge0 1000 2:8:20:7a:5d:ed random 0
v2 bge0 1000 2:8:20:ee:f0:cc random 0
vclient1 etherstub1 0 2:8:20:60:10:91 random 0
vrouter1 etherstub1 0 2:8:20:eb:f7:c random 0
vclient2 etherstub2 0 2:8:20:8f:86:da random 0
vrouter2 etherstub2 0 2:8:20:5b:d1:74 random 0
下面建立3個非全域Zone,zclient1,zclient2和zrouter:
global-zone# zonecfg -z zclient1
zclient1: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zclient1> create
zonecfg:zclient1> set zonepath=/export/home/zclient1
zonecfg:zclient1> set ip-type=exclusive
zonecfg:zclient1> add net
zonecfg:zclient1:net> set physical=vclient1
zonecfg:zclient1:net> end
zonecfg:zclient1> verify
zonecfg:zclient1> commit
zonecfg:zclient1> exit
global-zone# zonecfg -z zclient2
zclient2: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zclient2> create
zonecfg:zclient2> set zonepath=/export/home/zclient2
zonecfg:zclient2> set ip-type=exclusive
zonecfg:zclient2> add net
zonecfg:zclient2:net> set physical=vclient2
zonecfg:zclient2:net> end
zonecfg:zclient2> verify
zonecfg:zclient2> commit
zonecfg:zclient2> exit
global-zone# zonecfg -z zrouter
zrouter: No such zone configured
Use 'create' to begin configuring a new zone.
zonecfg:zrouter> create
zonecfg:zrouter> set zonepath=/export/home/zrouter
zonecfg:zrouter> set ip-type=exclusive
zonecfg:zrouter> add net
zonecfg:zrouter:net> set physical=vrouter1
zonecfg:zrouter:net> end
zonecfg:zrouter> add net
zonecfg:zrouter:net> set physical=vrouter2
zonecfg:zrouter:net> end
zonecfg:zrouter> verify
zonecfg:zrouter> commit
zonecfg:zrouter> exit
下面通過clone,安裝上面剛建立的三個Zone,其中zone1是上一篇文章中建立的Zone,使用zoneadm(1M)中的clone子命令安裝Zone會比zoneadm(1M)中的install子命令要快很多:
global-zone# zoneadm -z zclient1 clone zone1
global-zone# zoneadm -z zclient2 clone zone1
global-zone# zoneadm -z zrouter clone zone1
global-zone# zoneadm list -cv
ID NAME STATUS PATH BRAND IP
0 global running / ipkg shared
- zone1 installed /export/home/zone1 ipkg excl
- zclient1 installed /export/home/zclient1 ipkg excl
- zclient2 installed /export/home/zclient2 ipkg excl
- zrouter installed /export/home/zrouter ipkg excl
global-zone# zoneadm -z zclient1 boot
global-zone# zoneadm -z zclient2 boot
global-zone# zoneadm -z zrouter boot
然後,大家可以通過"zlogin -C <zone_name>"來配置2所示的每個Zone的IP地址。通過這一番配置,每個Zone的地址配置如下:
global-zone# zlogin zclient1 ifconfig -a4
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
vclient1: flags=1000863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST,IPv4> mtu 9000 index 2
inet 10.1.1.11 netmask ffffff00 broadcast 10.1.1.255
ether 2:8:20:60:10:91
global-zone# zlogin zclient2 ifconfig -a4
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
vclient2: flags=1000863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST,IPv4> mtu 9000 index 2
inet 10.1.2.11 netmask ffffff00 broadcast 10.1.2.255
ether 2:8:20:8f:86:da
global-zone# zlogin zrouter ifconfig -a4
lo0: flags=2001000849<UP,LOOPBACK,RUNNING,MULTICAST,IPv4,VIRTUAL> mtu 8232 index 1
inet 127.0.0.1 netmask ff000000
vrouter1: flags=1000863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST,IPv4> mtu 9000 index 2
inet 10.1.1.12 netmask ffffff00 broadcast 10.1.1.255
ether 2:8:20:eb:f7:c
vrouter2: flags=1000863<UP,BROADCAST,NOTRAILERS,RUNNING,MULTICAST,IPv4> mtu 9000 index 3
inet 10.1.2.12 netmask ffffff00 broadcast 10.1.2.255
ether 2:8:20:5b:d1:74
此時,我們仍然無法從網路10.1.1.0/24上的主機zclient1串連到網路10.1.2.0/24上的主機zclient2,因為雖然zrouter中有兩個IP介面,但是zrouter還未開啟路由和轉寄資料包的服務。我們可以這樣做來開啟zrouter服務:
global-zone# zlogin zrouter routeadm -e ipv4-routing -u
global-zone# zlogin zrouter routeadm -e ipv4-forwarding -u
並開啟zclient1和zclient2中的路由探索服務來建立預設路由(預設路由探索服務是開啟的,如果被關閉了,就運行下面的命令):
global-zone# zlogin zclient1 routeadm -e ipv4-routing -u
global-zone# zlogin zclient2 routeadm -e ipv4-routing -u
這樣,屬於兩個不同子網的主機zclient1和zclient2就可以相互串連了,我們可以用ping發包試一下:
global-zone# zlogin zclient1
[Connected to zone 'zclient1' pts/4]
root@zclient1:~# ping 10.1.2.11
10.1.2.11 is alive
root@zclient1:~# ping -U 10.1.2.11
10.1.2.11 is alive
在zclient2上,我們可以用snoop(1M)看到ICMP包應答:
global-zone# zlogin zclient2
[Connected to zone 'zclient2' pts/5]
root@zclient2:~# snoop -rd vclient2 udp or icmp
Using device vclient2 (promiscuous mode)
10.1.1.11 -> 10.1.2.11 ICMP Echo request (ID: 12967 Sequence number: 0)
10.1.2.11 -> 10.1.1.11 ICMP Echo reply (ID: 12967 Sequence number: 0)
10.1.1.11 -> 10.1.2.11 UDP D=33434 S=44329 LEN=64
10.1.2.11 -> 10.1.1.11 ICMP Destination unreachable (UDP port 33434 unreachable)
至此,我們已經用Crossbow項目中的網路虛擬化技術建立了一個由兩個子網組成的網路,這就是所謂的NB(Network in a Box)。這麼一個和物理網路隔絕的網路在實際提供網路服務的環境中作用不大,但我們能很方便地在一個物理主機上建立一個趨近於真實的並且“與世隔絕”的網路環境,這對網路伺服器測試或網路實驗會有很大協助。如果想讓zclient1和zclient2作為一個真正主機訪問外網,或者將這兩個非全域Zone作為網路伺服器使用(比如,一個活動伺服器,一個備份伺服器)。我們可以這樣設定一下zrouter使其作為可以訪問外網10.11.19.0/24的路由器:
圖3 串連到物理網路的虛擬網路
3所示,我們基於物理網卡bge0建立了一個名為v3的VNIC,並將其分配給zrouter:
global-zone# zoneadm -z zrouter halt
global-zone# zonecfg -z zrouter
global-zone# dladm create-vnic -l bge0 v3
global-zone# zonecfg -z zrouter
zonecfg:zrouter> add net
zonecfg:zrouter:net> set physical=v3
zonecfg:zrouter:net> end
zonecfg:zrouter> commit
zonecfg:zrouter> exit
global-zone# zoneadm -z zrouter boot
global-zone# zlogin zrouter ifconfig v3 plumb 10.11.19.172/24 up
global-zone# zlogin zrouter route add default 10.11.19.1
通過這番設定,一個物理主機上的虛擬網路就可以訪問外部網路了。由此可見,Solaris Crossbow項目中的網路虛擬化技術對提供網路資源利用率,建立冗餘網路伺服器和提高安全性有很大作用。通過這樣一個虛擬網路,我們不僅提供了一個真實網路下的服務環境,而且極大增加了實體資源的可用性,使複雜的網路設定不再局限於硬體的約束。
然而,Crossbow項目所帶來的新特性不僅僅是網路虛擬化方面的技術。從下一篇文章裡,我將開始介紹網路資源管理部分。