|
Vmware虚拟机的网络设置(三) [高级篇]
作者: 顾翠文 [GuCuiwen] email:[email protected]
版权声明:
1,本文档可以在网络上在非商业范围内自由转载,转载请注明出处.
2,如果转载版面(包括文章标题所在版面)包含商业广告,请向作者支付至少每千字100园的稿费.
3,以书面,书籍形式转载和出版请按至少每千字100园人民币的标准向作者支付稿费 .
4,转载请注明出处,并保留原作者及本版权申明.
5,不同意以上版权申明的请勿转载,否则将在法律范围内追究最大责任.
6,本文最初贴于www.linuxfans.org 其他地方均为转载.
先前写过两篇关于vmware虚拟机网络设置的文章,但是由于当时对vmware虚拟机网络的理解有限,文章中有些错误并且不太完善,由于工作的关系这两天又用到虚拟机并且设置虚拟机网络,通过实践总结出了比较完善的虚拟机网络解决方案.下面以笔者实际遇到的问题和解决方案为例,讲解一下vmware虚拟机网络设置中比较高级的部分.比较初级的网络设置请查看笔者先前写的两篇文章,可以在www.linuxfans.org论坛的系统安装板块的精华区找到.阅读本文应当具备TCP/IP网络中关于网络路由的基本知识.本文将不再阐述原理,而重点将设置过程,具备相关网络知识的读者可以很容易理解那样设置的原因.
Vmware 虚拟机设置网络的时候通常都用bridge方式和NAT方式,因为这两种方式比较简单,无论是虚拟机和主机通信还是和外网通信,实现起来都比较容易,适合初学者.当我们用host-only的方式联网的时候和主机的通信很简单,但是和外网通讯却要借助额外的路由软件,设置路由需要具备相关的专业知识才能设置成功,但是你一旦理解和掌握了这种方式网络通信,你能根据需要配置出很复杂的虚拟网络.下面以实际案例来说明用host-only方式来设置 bridge和NAT方式不能完成的复杂网络.
#####################
# 一,案例需求
#####################
如下图所示:
1) 简单说明:
其中,host-A和host-B是两台真实主机,他们通过交换机连网关,网关是由一台装有linux的PC机担任的,这两台真实主机都可以通过网关连上Internet.
图中的小方框表示网卡,其中虚线表示虚拟网卡,实线表示真实网卡.
图中的中方框表示虚拟主机,虚拟主机用vm-host-1,vm-host-2,vm-host-3表示,每台真实主机中有三台虚拟机.
为了说明方便,我做如下文档约定:
对于host-A里的虚拟设备(包括虚拟机本身)我统一在最后加后缀A.
如host-A中的虚拟机vm-host-1用vm-host-1.A表示,vm-NIC1用vm-NIC1.A表示.
真实主机host-B中也遵循这种规则.
2) 真实网络设置情况:
host-A和host-B均只有一块网卡,软件配置如下表:
在没有装虚拟系统前,两台真实主机均能正常通过网关上Internet.
3) 网络需求:
(a) 在虚拟机网络配置好后真实主机均能和原来一样正常上Internet.
(b) 虚拟机vm-host-1.A,vm-host-2.A和vm-host-3.A均能和host-A,host-B通信,并且和vm-host-1.B,vm-host-2.B和vm-host-3.B通信.
(c) 虚拟机vm-host-1.B,vm-host-2.B和vm-host-3.B均能和host-B,host-A通信,并且和vm-host-1.A,vm-host-2.A和vm-host-3.A通信.
(d) 各个虚拟机均能上Internet.
综上所诉,此虚拟机网络要求所有主机之间,不管是虚拟主机还是真实主机均能通信,所有主机,不管是真实主机还是虚拟主机均能上网.
对于这样复杂的网络设置,只有通过vmware提供的host-only网络功能,配合windows 2000 server的'路由和远程访问'功能以及linux提供的路由功能(把ip_forward值设置为1)才能完成.
其实host-only是最简单的,他把虚拟主机看成一台独立的主机,vmware内部并不提供其他功能使得他与外界通信,但也正因为他的简单,才更加的灵活,我们才有可能用他来塑造复杂的虚拟网络.
############################
# 二, 同一主机中的虚拟机通信
############################
这种形式的虚拟主机间的通信最简单,就像平时设置局域网那样,只要把这些虚拟主机的IP地址设在同一网段就行了.但是,为了进一步和外部通信,应该把他们的 IP地址设置成和vmnet1同一个网段并且虚拟系统均用host-only方式和主机联网,vmnet1是vmware虚拟机中实现host-only 方式联网的虚拟网络设备,他的IP地址在安装vmware的时候随机分配,你也可以在安装完之后手动设置他的IP地址.从图中可以看出,vmnet1,其实的作用类似于一个交换机,他和真实主机内所有的虚拟主机联接起来.在我先前写的文章中,我把vmnet1和vmnet8说成是虚拟网卡,其实这种说法是不准确的,更确切的说法是一个具有IP地址的交换机.在vmware的官方文档中也有提到这个问题,文档中也说明了vmnet1是一个虚拟网络,其实就是一个交换机.笔者在host-A上安装vmware4.5workstation的时候vmnet1的地址被随机分配为为 192.168.19.1.host-B上的vmnet1IP地址被随机分配为172.16.79.1.0
因此,我做如下设置:
vmnet1.A 192.168.19.1 255.255.255.0 (自动分配的)
vm-host-1.A 192.168.19.101 255.255.255.0
vm-host-2.A 192.168.19.102 255.255.255.0
vm-host-3.A 192.168.19.103 255.255.255.0
vmnet1.B 172.16.79.1 255.255.255.0 (自动分配的)
vm-host-1.B 172.16.79.101 255.255.255.0
vm-host-2.B 172.16.79.102 255.255.255.0
vm-host-3.B 172.16.79.103 255.255.255.0
经过以上设置后host-A中的三台虚拟机能相互通信,并且通过vmnet1.A和host-A通信,但是不能ping通host-A的真实网卡的IP地址192.168.109.6.
同样,host-B中的三台虚拟机能相互通信,并且通过vmnet1.B和host-B通信,但是不能ping通host-B的真实网卡的IP地址192.168.109.6.
#####################################
# 三,虚拟网络和真实网络以及虚拟机之间通信
######################################
以上只不过完成了最简单的虚拟机通信,远不能达到要求.因此我们要配合windows 2000 server的'路由和远程访问'功能以及linux提供的路由功能来设置路由,使得host-A和host-B分别成为一台路由器.用来联接虚拟网络和真实网络.
在windows 2000 server中,可以用'路由和远程访问'服务来使得host-A成为一台联接虚拟网络和真实网络的路由器.
具体方法:
开始菜单->程序->管理工具->路由和远程访问
打开路由和远程访问控制台,如果菜单中没有路由和远程访问则说明你在安装系统的时候没有装,你需要利用控制面板添加删除程序来添加这个功能.注意,此功能只有windows 2000 server以上的版本和windows 2003 才有.windows 2000 professional和windowsXP均无此功能(可以安装其他路由软件来实现).
设置路由使得vmnet1和host-A上的真实网卡互连.请注意,不是设置NAT联接,而是设置纯粹的静态路由联接两个网络.
此外,还要把vm-host-1.A的网关设置为vmnet1.A的IP地址,即:
vmnet1.A 192.168.19.1 255.255.255.0 网关设置为空
vm-host-1.A 192.168.19.101 255.255.255.0 192.168.19.1
vm-host-2.A 192.168.19.102 255.255.255.0 192.168.19.1
vm-host-3.A 192.168.19.103 255.255.255.0 192.168.19.1
设置好后做测试:
在vm-host-1.A中ping host-A的真实网卡:
c:\>ping 192.168.109.6 此时应该已经可以ping通.如果不通则说明'路由和远程联接'没有设置好,host-A还没有扮演一台路由器的功能.请重新设置'路由和远程联接'.
ping host-A的真实网卡成功后再ping host-B的真实网卡应该不能ping通!
为什么不通呢?
因为host-A的默认网关是LAN-gateway的地址,即192.168.109.254
假设vm-host-1.A ping 192.168.109.64 (host-B). 数据包的行走路线是这样的:
数据包到vm-host-1.A的默认网关vmnet1(192.168.19.1),经过win2000server路由后到host-A的真实网卡 NIC1,因为host-A的真实网卡NIC1(192.168.109.6)的地址和host-B的真实网卡NIC2在同一个网段,因此实际上数据包已经到了host-B的真实网卡.但是host-B的真实网卡收到消息后需要把ICMP消息反回给vm-host-1.A,但是host-B上却没有到vm -host-1.A的路由,此时,host-B上只有一个默认网关(192.168.109.254),他不知道如何把数据包送回vm-host-1.A 的路径.因此返回ICMP消息失败.在vm-host-1.A上显示超时.因此,明白了这一点我们就知道了只要在host-B上加上到vm-host- 1.A的路由,host-B就知道了如何向vm-host-1.A反回ICMP消息.
因此在host-B上加上到vm-host-1.A的路由(同样也能到vm-host-2.B和 vm-host-3.A)
linux下设置路由的命令:
#route add -net 192.168.19.0/24 gw 192.168.109.6
这个指令告诉host-B,凡是发到192.168.19.0网段的数据全部经192.168.109.6发出而不是经过默认网关192.168.109.254发出.
而192.168.109.6和192.168.109.64在同一个网段,所以可以通信,而192.168.109.6又是通向192.168.19.0网络(即host-A上的虚拟网络)的路由器,因此数据包能顺利到达.
如果学习过TCP/IP和有关路由方面的知识,就不难理解以上的内容.
这样,我们就完成了host-A中的虚拟主机和真实网络中的某一台真实主机通信.如果host-A中的虚拟主机还想和真实网络中的另一台主机host-C通信,则必需在host-C上也设置通往vmnet1.A网络的路由.
经过以上设置,虚拟虚拟网络可以和真实网络通信了,但是不同主机间的虚拟网络还不能通信.
因此,还要用同样的方法设置host-B中的虚拟主机,即:
vmnet1.B 172.16.79.1 255.255.255.0 网关为空
vm-host-1.B 172.16.79.101 255.255.255.0 172.16.79.1
vm-host-2.B 172.16.79.102 255.255.255.0 172.16.79.1
vm-host-3.B 172.16.79.103 255.255.255.0 172.16.79.1
同样的原理,我们还要在host-A上设置到vmnet1.B虚拟网络的路由.
在windows2000 server上设置路由的命令:
c:\>route add 172.16.79.0 mask 255.255.255.0 192.168.109.64
即告诉windows2000路由器凡是目标地址为172.16.79.0网络的数据包都经过192.168.109.64主机(即host-B转发),host-B和host-A在同一个网络中,host-B又是vmnet1.B的路由器,因此数据能顺利到达.
当然,别忘了把host-B设置成为一台静态路由器.在linux中打开路由功能非常简单,用一条命令即可:
#echo “1” >/proc/sys/net/ipv4/ip_forward
通过上面的设置,两台真实主机中的虚拟主机均能访问对方的真实主机,并且可以访问对方的虚拟主机,即vm-host-1.A和vm-host-1.B能相互通信.此时的真实网络和虚拟网络间的拓扑图如下:
让我们理一下思路:
假设vm-host-1.A和vm-host-1.B通信,由vm-host-1.A首先发起连接,数据包经过vm-host-1.A的网卡vm-NIC1(192.168.19.101)经过vm-host-1.A的网关vmnet1 (192.168.19.1),到达windows 2000 server,由于此时windows 2000 server是一台路由器,因此,他负责把来自vmnet1的数据包发到host-A的真实网卡NIC1,通俗的说,就是把来自虚拟网络A的数据包搬到真实网络网络.数据包在windows 2000 server上等待发出前,路由器首先判断发送该数据包的路径.通过检测数据包中的目标IP地址(即vm-hsot-1.B的IP地址 172.16.79.101),他知道这个数据包是发送到网络172.16.79.0的,通过路由表,他得知,发到这个网络的数据应该经过 192.168.109.64这个地址,即host-B,这样数据包就通过真实网络被发到host-B上,同样,host-B也是一台路由器,他也要对来自其他网络的数据包进行分析然后判断发送的目的地,经过查看数据包的目的地址,他发现,这个数据包的目的网络是192.16.79.0,这个网络是属于自己管辖的,通过vmnet1.B就能到达.于是,他把数据包发到vmnet1.B,即数据包从真实网络被搬到了host-B中的虚拟网络.vmnet1和 vm-host-1.B在同一个网段,可以直接到达,于是vm-host-1.B收到了数据包.
同样的过程,vm-host-1.B会将数据包发到vm-host-1.A中.完成两台分布在不同真实主机中的虚拟机通信.
这些功能已经完成了大部分需求.接下来就来设置虚拟机和Internet联接!
##############################
# 四,虚拟机和Internet通信
##############################
如果能理解并设置成功前两步的设置,那么这一步的设置就比较简单了,通过分析数据包的走向,我们知道,只要在网关LAN-gateway上设置到 vmnet1.A和到vmnet1.B的路由就能让虚拟机和LANgateway通信.只要能和网关通信了,就能和Internet通信了.
在linux网关上添加路由:
#route add -net 192.168.19.0/24 gw 192.168.109.6
#route add -net 172.16.79.0/25 gw 192.168.109.64
因为LANgateway已经是一台NAT路由了,所以不需要设置ip_forward的值了,这个值已经是1了.
在虚拟机中设置好DNS,就可以直接和Internet通信了.
至此,我们完成了需求中的全部功能.
[/img] |
|