forrestrun
網站系統工程師和架構師
2004 年 6 月
本文探討在一台電腦上面利用vmware類比多個電腦,並實現較複雜的網路環境下多個類比機器的連網,並以zebra路由軟體和ipv6使用為例做了測試和說明。
為什麼要做這個測試?
使用vmware對於軟體開發人員和網路維護人員,非常有意義。不僅僅在於它可以方便簡潔的類比出一個虛擬機器環境以供工作使用,而且在於在對OS有部分有影響的操作如網路攻擊、破壞性實驗等,如果採用vmware將非常非常安全,因為虛擬環境的影響僅僅是對一個資料檔案的影響,不會真正對host主機硬體裝置軟體程式產生其他問題。生產系統上面的系統調整在沒有經過測試資料的證明,貿然的直接上線將暗含巨大的風險,如果軟體開發或者系統管理人員使用vmware將非常適合進行此類的測試和研究。
另外,很多網路環境的測試和實驗,我們必須使用交換器(或者hub),一堆網線,多台測試裝置。在筆者從前進行過的在用cisco的25系列的路由器進行網路實驗時,5台cisco路由器和一堆網線的串連工作量可不小,而且這種實驗代價昂貴。
vmware workstation版本是vmware公司針對案頭使用者在單機條件下開發的虛擬電腦軟體。利用該軟體,使用者可以根據原生情況,定製多個虛擬電腦同時運行在一個真實的操作平台下和一個複雜的網路環境下。在某種情況下可以令人驚歎的拋棄那一大堆的網路裝置了!
還有一點,目前使用vmware做單個系統的資料非常多,但是注重虛擬網路環境的資料還不是非常多見,這裡可以希望拋磚引玉。
VMWare是什麼?
Vmware是vmware inc 的一個強大的虛擬機器軟體(http://www.vmware.com)。它有多個版本,有針對伺服器的GSX、ESX版本,和針對案頭使用者的workstation版本。在vmware中可以提供很完備的乙太網路環境,甚至在vmware中有9個虛擬交換器可以供我們使用!更多的資訊請查看他的Online Manual。
實驗環境
路由器是網路中的核心裝置,在實際的網路環境中進行路由器的測試學習和研究是現實的,而搭建一個較複雜的路由器環境是代價不菲的。利用linux下面的強大路由器軟體zebra,藉助vmware的virtual network,我們可以搭建自己的路由器實驗環境,並可以根據自己的需求情況繼續擴充。另外,ipv6等測試必須藉助多台網路裝置,並使用網路分析工具進行分析,才能更好的理解和學習。
1,環境準備:
實驗環境:
1) IBM ThinkPad R40e 膝上型電腦(cpu p4 2.0G,256M記憶體,30Gdisk)
2) Windowns XP Home Edition + sp1
3) vmware workstation 4.0.5 build-6030 + 30days license
2,更改網路設定:
安裝了vmware之後,首先我更改了vmware的網路環境(在vmware的edit菜單中找到virtual network setting)。步驟如下:
1) 點Edit下Virtual Network Setting… ,彈出Virtual network Editor對話方塊;
2) 在Virtual network Editor對話方塊中的Host Virtual Network Mapping中點Vmnet1後面的按鈕"…",再點快顯功能表的subnet,然後設定子網;
3) subnet1設定為192.168.1.0/255.255.255.0;mnet2,Vmnet3,Vmnet4,Vmnet8,Vmnet9的子網分別為192.168.2.0/255.255.255.0, 192.168.3.0/255.255.255.0, 192.168.4.0/255.255.255.0, 192.168.8.0/255.255.255.0, 192.168.9.0/255.255.255.0。
4) 其他vmnet空閑,最多可以設定9個子網,可以根據需要設定。
3,網路定製最佳化:
1) 由於預設安裝的vmware採用的是ip地址通過dhcp獲得,我在安裝好之後就禁用了vmware的dhcpd服務,然後禁用了各個子網使用dhcp獲得ip。
2) 如果為了使虛擬機器訪問外部網路,應該設定一個vmnet可以使用NAT服務對外訪問,預設vmnet8可以通過NAT訪問外部網路。此子網段預設的網關設定為192.168.8.2,並確保NAT service服務啟動。
3) 確認Automatic Bridging 的Enable Automatic Bridge的Automatically choose an available physical network adapter to bridge to Vmnet0 選項被選。
4,虛擬機器定製最佳化
為了在一台機器運行多個虛擬機器,最好對每個虛擬機器做些最佳化工作。根據使用經驗,在運行任務不多的虛擬機器上面,對記憶體的需求遠大於cpu的利用。因此,我們安裝R1、R2、R3、R4和R5這五個以Debian GNU/Linux為基礎虛擬機器,並建議對每個虛擬機器的kernel進行最佳化,以減少對實際機器的系統開銷。個人的做法如下:
1) 最簡安裝了一個虛擬系統Debian 3,安裝目標檔案夾和該虛擬機器都命名為R1;
2) 增加必須的虛擬機器硬體,譬如網卡等;
3) 在其他debian linux虛擬機器環境中編譯好bin的軟體工具,通過scp或者ftp等方式拿到R1虛擬機器中來,並做相關的配置。這裡我安裝了部分網路工具如iputils,iproute2,tcpdump,sshd,zebra等軟體;
4) 為了做ipv6測試,在其他環境中編譯一個支援ipv6 的kernel也拿到R1虛擬中;
5) 為zebra做預準備:在/usr/local/zebra/etc下更改.sample檔案為conf檔案;
6) 確認R1虛擬機器準備好後,關閉R1虛擬機器;
7) 然後將這個安裝系統的資料檔案夾備份一份作為永久備份,再拷貝4份,分別命名為R2,R3,R4,R5;
8) 然後在vmware中"開啟現存的虛擬機器"開啟這新加入的4個虛擬機器,並在option中更改各自的Vitrual machine name 分別為R2,R3,R4,R5;
9) 分別更改R2,R3,R4,R5的相應設定和hostname等,並相應更改ip地址/ipv6地址等。
5,構建如下網路拓撲圖:
網路設定情況:
6,測試:
分別啟動R1到R5的虛擬機器,並檢查虛擬網路的聯通性。在每個虛擬機器中檢查唯一相同網段的其他虛擬機器,以R1為例做相關測試。如果您對網路的通訊過程希望有更加深入觀察,請在R1的第二個console介面開啟tcpdump,隨時查看想要觀察的資訊。
1)檢測網卡地址 ifconfig 或者ip命令:
R1:~# ip a1: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:ae:a1:59 brd ff:ff:ff:ff:ff:ff inet 192.168.8.11/24 brd 192.168.8.255 scope global eth0 inet6 fe80::20c:29ff:feae:a159/64 scope link2: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:ae:a1:63 brd ff:ff:ff:ff:ff:ff inet 192.168.1.11/24 brd 192.168.1.255 scope global eth1 inet6 fe80::20c:29ff:feae:a163/64 scope link3: eth2: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 1000 link/ether 00:0c:29:ae:a1:6d brd ff:ff:ff:ff:ff:ff inet 192.168.2.11/24 brd 192.168.2.255 scope global eth2 inet6 fe80::20c:29ff:feae:a16d/64 scope link4: lo: <LOOPBACK,UP> mtu 16436 qdisc noqueue link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo inet6 ::1/128 scope host5: sit0: <NOARP> mtu 1480 qdisc noop link/sit 0.0.0.0 brd 0.0.0.0
|
2)網路聯通性 ping 或者ping6 或者arping命令:
R1:~# ping 192.168.8.12PING 192.168.8.12 (192.168.8.12): 56 data bytes64 bytes from 192.168.8.12: icmp_seq=0 ttl=64 time=14.0 ms64 bytes from 192.168.8.12: icmp_seq=1 ttl=64 time=1.9 ms--- 192.168.8.12 ping statistics ---4 packets transmitted, 4 packets received, 0% packet lossround-trip min/avg/max = 1.9/5.0/14.0 ms
|
zebra路由軟體使用
1) 以運行daemon方式啟動zebra,zebra就開始監聽本地的2602連接埠,其他各個路由協議的daemon進程分別監聽不同的服務連接埠(ripd監聽tcp 2602和udp520連接埠,ospfd監聽tcp 2604連接埠,bgpd監聽tcp179連接埠和2605連接埠,ospf6d監聽tcp (ipv4和ipv6)的2606連接埠)。
2) 從pc機器上telnet到R1的zebra服務,使用者名稱口令預設都是zebra,看看介面是不是和cisco的路由器有些想象呢。 :)
3) 利用R2,R3,R4,R5其他做路由實驗。注意,這裡不光可以利用zebra的各種路由軟體的debug觀察路由協議的工作過程,還可以利用linux的tcpdump來進行更加詳細的觀察。
4) 啟動各個虛擬機器的zebrad和相關路由協議進程服務(為了更好的實驗,各個路由協議分別測試);
5) 開啟動態路由發現,看看是不是一會兒各個路由器都被發現啦?
虛擬機器網路環境用路由器模式表示就是如下的了:
6) 我們可以充分發揮想象,利用這麼多台"路由器"實驗各種路由協議。如果你又更多的想法譬如使用串口、並口通訊也大可以試一試。:)
7) zebra更加詳細的使用請閱讀zebra的手冊和其他資料。
ipv6軟體的測試環境
ipv6是ip協議的下一個版本,並隨著網路技術的發展,越來越進入大家的視線。這裡做一個簡單的ipv6的測試,以便檢驗利用vmware建立立的網路。建議在測試虛擬機器的其他console介面開啟tcpdump -6 詳細觀察ipv6的協議工作情況。
1) Ipv6測試準備:
在安裝系統時候已經安裝了iproute和iputils都是可以對ipv6進行測試的工具,另外部分linux版本預設是沒有載入ipv6支援模組的,在每個請載入之。
R1:~# modprobe ipv6 && lsmod |grep ipv6
|
如果成功載入ipv6模組請進行下面
R1:~# ip -6 a s1: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qlen 1000 inet6 fe80::20c:29ff:feae:a159/64 scope link2: eth1: <BROADCAST,MULTICAST,UP> mtu 1500 qlen 1000 inet6 fe80::20c:29ff:feae:a163/64 scope link3: eth2: <BROADCAST,MULTICAST,UP> mtu 1500 qlen 1000 inet6 fe80::20c:29ff:feae:a16d/64 scope link4: lo: <LOOPBACK,UP> mtu 16436inet6 ::1/128 scope host
|
2) 發現網路上其他ipv6裝置:
ipv6協議將不再支援arp協議,因此在ipv6中發現網路上其他ipv6裝置可以使用如下方式:
R1:~# ping6 -I eth0 ff02::1PING ff02::1(ff02::1) from fe80::20c:29ff:feae:a159 eth0: 56 data bytes64 bytes from ::1: icmp_seq=1 ttl=64 time=0.200 ms64 bytes from fe80::20c:29ff:fe07:1b34: icmp_seq=1 ttl=64 time=6.22 ms (DUP!)64 bytes from fe80::20c:29ff:fe94:1776: icmp_seq=2 ttl=64 time=1.56 ms (DUP!)
|
這裡採用ipv6中的本地串連多播地址(link-local multicast address)ff02::1來發現 同網路上的其他ipv6裝置。這裡發現的fe80::20c:29ff:fe07:1b34和fe80::20c:29ff:fe94:1776分別屬於R2的eth0的ipv6地址和R3的eth0地址。(由於R4沒有開啟ipv6,將不能看到R4的相應ipv6地址)
R1:~# ping6 -I eth0 fe80::20c:29ff:fe07:1b34PING fe80::20c:29ff:fe07:1b34(fe80::20c:29ff:fe07:1b34) from fe80::20c:29ff:feae:a159 eth0: 56 da bytes64 bytes from fe80::20c:29ff:fe07:1b34: icmp_seq=1 ttl=64 time=6.10 ms64 bytes from fe80::20c:29ff:fe07:1b34: icmp_seq=2 ttl=64 time=89.1 ms--- fe80::20c:29ff:fe07:1b34 ping statistics ---3 packets transmitted, 3 received, 0% packet loss, time 2003msrtt min/avg/max/mdev = 1.835/32.373/89.185/40.209 ms
|
ipv6中的ping命令是iputil工具包中的ping6命令,必須注意的是 由於有多個網卡介面,必須使用 -I 指定使用哪個網卡介面。
3) 發現ipv6路由:
預設路由中ipv6路由表如下:
R1:~# ip -6 rfe80::/64 dev eth0 metric 256 mtu 1500 advmss 1440fe80::/64 dev eth1 metric 256 mtu 1500 advmss 1440fe80::/64 dev eth2 metric 256 mtu 1500 advmss 1440ff00::/8 dev eth0 metric 256 mtu 1500 advmss 1440ff00::/8 dev eth1 metric 256 mtu 1500 advmss 1440ff00::/8 dev eth2 metric 256 mtu 1500 advmss 1440default dev eth0 proto kernel metric 256 mtu 1500 advmss 1440default dev eth1 proto kernel metric 256 mtu 1500 advmss 1440default dev eth2 proto kernel metric 256 mtu 1500 advmss 1440unreachable default dev lo proto none metric -1 error -101
|
4) 測試本地ipv6服務
linux系統目前支援ipv6的伺服器軟體已經非常多,常用的軟體如opensshd/sshd,apache,bind,telnetd, iptables-ipv6,nmap等。這裡以sshd作為一個測試。
R1:~# ssh -6 ::1Host key not found from database.Key fingerprint:xobit-pihuz-gypek-lokad-leliz-hupim-pavek-pyvem-canam-nefaf-laxaxYou can get a public key's fingerprint by running% ssh-keygen -F publickey.pubon the keyfile.Are you sure you want to continue connecting (yes/no)?
|
5) ipv6-in-ipv4 tunnel測試
由於ipv4在網路中已經實現了多年,而且Internet的發展更加促使ipv4的發展,目前ipv6在網路中的實際情況是ipv6象一個孤島被ipv4的海洋包圍,各個ipv6網路的串連還需要通過ipv4網路,實際中比較常見的有ipv6-in-ipv4隧道等。這裡利用本虛擬環境進行點對點的IPv6-in-IPv4 tunnel的實驗(R1-R2)。
在R1機器上面:
ip -6 addr add 3ffe:3200::1/24 dev eth0#給eth0設定一個本地ipv6地址,以CERNET的測試ipv6地址為例ip tunnel add 6to4 mode sit remote 192.168.8.12 local 192.168.8.11 #加入一個6to4通道ip link set dev 6to4 up#啟用6to4通道ip -6 addr add 3ffe:3200::1/24 dev 6to4 #給通道加入本地ipv6地址ip -6 r add 3ffe:3200::2/24 dev 6to4#加入使用通道裝置的ipv6路由,由於使用的點對點的測試,目的網路是對端的ipv6地址
|
在R2機器上面:
ip -6 addr add 3ffe:3200::2/24 dev eth0ip tunnel add 6to4 mode sit remote 192.168.8.11 local 192.168.8.12ip link set dev 6to4 upip -6 addr add 3ffe:3200::2/24 dev 6to4ip -6 r add 3ffe:3200::1/24 dev 6to4
|
也可以加入R3,R4,R5的ipv6 tunnel,以供更加複雜的測試。
在R1和R2裝置上面,使用ping6命令查看對端的ipv6地址可以到達;
在R1和R2裝置上面,使用ssh -6 ipv6地址通過ipv6 tunnel登入點對點連接的其他ipv6裝置;
R1:~# ssh -6 3ffe:3200::2Host key not found from database.Key fingerprint:xobit-pihuz-gypek-lokad-leliz-hupim-pavek-pyvem-canam-nefaf-laxaxYou can get a public key's fingerprint by running% ssh-keygen -F publickey.pubon the keyfile.Are you sure you want to continue connecting (yes/no)? yesHost key saved to /root/.ssh2/hostkeys/key_22_3ffe:3200::1.pubhost key for 3ffe:3200::1, accepted by root Wed Mar 31 2004 19:12:51 +0800root's password:Authentication successful.R2:~# w08:16:21 up 3:02, 3 users, load average: 0.00, 0.01, 0.00USER TTY FROM LOGIN@ IDLE JCPU PCPU WHATroot pts/7 3ffe:3200::11 08:16 0.00s 0.13s 0.04s wR2:~#
|
Ok,我們已經通過ipv6-in-ipv4的tunnel看到我們使用ipv6地址登入到另外的裝置上面了!
此過程在R2上面的tcpdump結果:
08:23:35.833428 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: S 2462930696:2462930696(0) win 5760 <mss 1440,sackOK,timestamp 19066103 0,nop,wscale 0>08:23:35.835364 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: S 1730732585:1730732585(0) ack 2462930697 win 5632 <mss[|tcp]> (encap)08:23:35.860756 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: . ack 1 win 5760 <nop,nop,timestamp 19066109 11103448>08:23:35.919035 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 1:50(49) ack 1 win 5632 <nop,nop,[|tcp]> (encap)08:23:35.925164 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: . ack 50 win 5760 <nop,nop,timestamp 19066127 11103532>08:23:35.925193 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 1:50(49) ack 50 win 5760 <nop,nop,timestamp 19066135 11103532>08:23:35.926647 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: . ack 50 win 5632 <nop,nop,[|tcp]> (encap)08:23:35.936087 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 50:538(488) ack 50 win 5632 <nop,nop,[|tcp]> (encap)08:23:35.954300 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 50:546(496) ack 538 win 6432 <nop,nop,timestamp 19066165 11103549>08:23:35.994265 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: . ack 546 win 6432 <nop,nop,[|tcp]> (encap)08:23:35.995267 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 546:706(160) ack 538 win 6432 <nop,nop,timestamp 19066204 11103607>08:23:35.995479 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: . ack 706 win 6432 <nop,nop,[|tcp]> (encap)08:23:36.117795 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 538:1578(1040) ack 706 win 6432 <nop,nop,[|tcp]> (encap)08:23:36.127435 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: . ack 1578 win 8320 <nop,nop,timestamp 19066260 11103731>08:23:36.127761 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 1578:1610(32) ack 706 win 6432 <nop,nop,[|tcp]> (encap)08:23:36.137272 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: . ack 1610 win 8320 <nop,nop,timestamp 19066311 11103740>08:23:36.145247 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 706:738(32) ack 1610 win 8320 <nop,nop,timestamp 19066382 11103740>08:23:36.147153 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: . ack 738 win 6432 <nop,nop,[|tcp]> (encap)08:23:36.151282 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 738:826(88) ack 1610 win 8320 <nop,nop,timestamp 19066385 11103760>08:23:36.156464 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: . ack 826 win 6432 <nop,nop,[|tcp]> (encap)08:23:36.157473 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 1610:1698(88) ack 826 win 6432 <nop,nop,[|tcp]> (encap)08:23:36.163413 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: . ack 1698 win 8320 <nop,nop,timestamp 19066396 11103770>08:23:36.163446 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 826:1922(1096) ack 1698 win 8320 <nop,nop,timestamp 19066399 11103770>08:23:36.178682 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 1698:2810(1112) ack 1922 win 8768 <nop,nop,[|tcp]> (encap)08:23:36.182715 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: P 1922:3018(1096) ack 2810 win 11120 <nop,nop,timestamp 19066432 11103791>08:23:36.188978 192.168.8.12 > 192.168.8.11: 3ffe:3200::1.ssh > 3ffe:3200::2.1047: P 2810:3922(1112) ack 3018 win 10960 <nop,nop,[|tcp]> (encap)08:23:36.234615 3ffe:3200::2.1047 > 3ffe:3200::1.ssh: . ack 3922 win 13344 <nop,nop,timestamp 19066491 11103802>
|
總結
vmware不僅僅作為一個類比機器,它所提供的網路環境也是一個讓人稱道的真實網路,配合多種網路工具,我們對你所想象的網路的將更加容易的實現。
參考資料
- http://www.vmware.com/
- http://www.zebra.org
- http://www.ipv6.net.edu.cn/
- LDP的IPv6-Linux-Howto
- developerWorks Linux文章《在 Linux 上構建網路路由器》
關於作者 forrestrun, 從事過網路教學工作並參與過多項大型網路工程,目前為國內某著名網站系統工程師和架構師,一直關注tcp/ip技術、linux以及cisco網路技術。您可以通過forrestrun@163.com和他聯絡。 |