Board logo

标题: [技术文章] 穿过主机访问虚拟机中的网站系列教程(VBox篇) [打印本页]

作者: shillan    时间: 2015-5-6 00:29     标题: 穿过主机访问虚拟机中的网站系列教程(VBox篇)

  最近大家开始搭上我们这个学期的关键——Siteweaver,为了这个东西大家无所不用其极,有人换系统,有人开始学习用虚拟机。用虚拟机的同学会发现,我们在使用虚拟机搭建网站的时候,怎么可以方便地从主机和局域网访问到虚拟机中的网站呢?下面就跟着我一起穿越吧,让穿过我们的主机访问到虚拟机里面的网站。

  虽然说VBox的网络功能支持没有VMware完善,但是仍然足够解决到这个访问的问题。

  VBOX提供了好几种的连接方式,有Not Attached、NAT、Bridged、Internal Network和Host-Only Adapter,除了最后一种网络连接方式需要在主机中安装一个虚拟网卡外,其他的都不需要安装虚拟网卡就可以直接使用了,对于使用锐捷的同学们来说是实在是比较好。


图0

  关于VMware和VBox两者的网络连接方式解释,可以参考以下的文章:
  1.VMware与VirtualBox的网络连接方式详解
  2.VMware三种网络连接方式的概念
  3.VBOX三种网络连接方式详解:点击下载PDF(介绍版本较旧,但原理差不多。)

  好吧,上面的只是简单介绍一下连接的方法,下面我们开始穿越吧。

  一、Bridged Adapter

相信看完了上面的连接方式介绍之后,大家都会对Bridged这种连接方式有印象。我们可以知道桥接网络是让虚拟机和主机处于同一个局域网中。由于它们在同一个局域网中,因此我们可以很直接地访问虚拟机的IP地址,然后直接地访问上面的网站。本方法对使用外网的同学特别适用,因为路由器中的DHCP功能可以直接地分配虚拟机的IP地址,然后我们可以方便地对虚拟机进行访问。但是由于学校用的锐捷只能自动分配一个IP地址,而且对网卡的数量限制为一(特别对于VMware来说,虚拟网卡的禁用相当于扼杀了其强大的网络功能)。因此在学校中用Bridged方式的话需要手动给虚拟机分配IP地址,而且网段需要相同,这样才可能在局域网内进行访问。(由于小弟未成功在校园网内测试,因此这种方式只推荐给外网的同学们使用。)

  下面看看我们是怎么进行相关的设置的。(PS:VirtualBox可是有官方中文的哦!不过下面演示用的是英文。)


图1-0 VBox主界面

  1.我们在VBox的界面上选中我们的虚拟机(示例用2003ServerR2),猛击工具栏上大大的Setting按扭,得到下面设置界面,然后在左边选中Network,进入网络设置。


图1-1 网络设置

  2.在连接方式中选择“Bridged Adapter”,然后在下一个选项框中选中你接入网络的网卡(示例用Intel Wifi Link 5100 AGN)。高级选项中选择的是你的虚拟机使用的网卡,如果你的虚拟机虚拟的是Vista以上的系统,请选中Intel的网卡,如果不是,请随便。如此设置后就完毕了。


图1-2


图1-3 网卡选项

  3.运行虚拟机,等它启动吧,下面就来见证奇迹的瞬间了。启动完后我们可以看到虚拟机已经显示我们接入网络了(使用校园网的除外),打开本地连接的状态,我们可以看到虚拟机已经从路由器用自动获取了IP地址。


图1-5


图1-6 IP获取情况

  4.连接成功后我们来测试一下虚拟机的联网情况,随便打开虚拟机里面的IE,随手输入一个地址,猛击回车看看。联网已经成功了。


图1-7 联网情况

  5.下面我们在主机中输入虚拟机的地址,看看它的网站是不是在已经可以访问了。


图1-8 联网情况


图1-9 联网情况

  就这么简单的一步我们就解决了局域网内访问的问题了,真爽。

  但是可能是VBox的网络能力较弱的问题,访问虚拟机的时候有时会比较慢,有时需要刷新一下,但能够连接已经大大方便了我们做网站了。

  可惜的是校园网连接网络必须经过锐捷认证,这一点比较麻烦。如用Bridged的话,IP地址只能通过手动分配才可以将虚拟机接入局域网,但小弟暂时没办法让虚拟机接上互联网。如用校园网的话,请看下面的第二种连接方式的设置。

  二、NAT连接方式+端口映射

在校园网中我们需要使用锐捷这个LJ软件来进行认证,因此上面的Bridged方式会很容易受限制。而我们需要的是一个更加快更加好的连接方法。这时候我们就或者就可以考虑使用NAT连接了。

  在VBox的帮助文档中会有关于NAT连接的介绍,英文好的可以去看一下。下面给出一个别人翻译的文档:

  Network Address Translation (NAT)
  网络地址转换( NAT )是最简单的方法从一个虚拟机访问外部网。通常,它并不要求在主机网络和客户机上做任何配置。基于这个原因,它是默认的网络模式 。
  设置为通过 NAT 方式连接的一台虚拟机能像一台真正的计算机一样访问互联网,主机就是一只路由器。 在这种方式下,通过 VirtualBox 网络引擎,虚拟机透明地映射到外部网络。 NAT 方式不方便是,很像是在路由器之后的一个专用网络,从外部互联网看来,虚拟机是无形和不能到达的; 您不可能在虚拟机上运行一个服务器,因为外部网络无法访问通过 NAT 方式连接的内部机,除非您设定了端口转发(下述)。
  虚拟机从一个 VirtualBox 整合的 DHCP 服务器得到私有的网址。 这个网址对主机来说是一个完全不同的网络。一台虚拟机的多个网卡可以被设定使用 NAT, 第一个网卡连接了到专用网 10.0.2.0,第二个网卡连接到专用网络 10.0.3.0,等等。默认得到的客户端ip(IP Address)是10.0.2.15,网关(Gateway)是10.0.2.2,域名服务器(DNS)是10.0.2.3,可以手动参考这个进行修改。
  客户机(即虚拟机)送出的网络帧被 VirtualBox 的 NAT 引擎收到,抽取 TCP/IP 数据,再通过主机的操作系统(即安装 VirtualBox 的操作系统)重新发送出去。送到在主机上的一个应用程序,或者到位于主机同一网络的另一台计算机上,它看起来好象是安装在主机上的程序 VirtualBox,通过一个属于主机的 IP 地址,把数据发送出去。VirtualBox  倾听到数据包裹的回复,通过客户机的私人网络重新包装和发送往客户机上。
  你可以设置一个虚拟机的服务(比如 WEB  服务),通过使用命令行工具 VboxManage 代理。你需要知道虚拟机的服务使用哪个端口,然后决定在主机上使用哪个端口(通常但不总是想要使虚拟机和主机使用同一个端口)。在主机上提供一个服务需要使用一个端口,你能使用在主机上没有准备用来提供服务的任何端口。一个怎样设置新的 NAT 例子,在虚拟机上连接到一个 ssh 服务器,需要下面的三个命令:
VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/Protocol" TCP
VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/GuestPort" 22
VBoxManage setextradata "Linux Guest" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/guestssh/HostPort" 2222
  说明:VboxManage 是一个命令行程序,请查询你的 VirtualBox 安装目录,"Linux Guest" 是虚拟主机名。guestssh 是一个自定义的名称,你可以任意设置,通过上面的三个命令,把虚拟机的 22 端口 转发到主机的 2222 端口。

  以上文字来自:http://virtualboxchina.org/viewthread.php?tid=63


  看完了上面的翻译,我们基本上可以知道我们需要利用什么工具进行下面的操作了。操作方法有以下两种:
  1.使用VirtualBox自带的VBoxManage工具进行命令设置。
  2.修改记录虚拟机信息的.xml文件。

  操作方法1:
  1.运行CMD(方法:WinKey+R,输入CMD后按回车),然后我们得到一个命令提示符。进行简单的命令到达VBox的安装目录。(不懂命令?还是看图吧。由于小弟安装在E盘,所以目录在E盘喇。)

  命令翻译一次:
  Cd\ [回车]
  e: [回车]
  Cd e:\virtual machine\sun\virtualbox [回车]
  (PS:安装目录地址可以在资源管理器的地址栏中复制粘贴到命令提示符中。)


图2-1

  2.到达了安装目录后,我们可以在资源管理器中看到下面的文件。


图2-2 VBoxManage

  这就是我们要进行下面的操作的关键工具。

  3.在命令提示符中输入下面的命令(输入前请将虚拟机和VBOX的界面关掉):
  VBoxManage setextradata "2003" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol" TCP [回车]
  VBoxManage setextradata "2003" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/GuestPort" 80 [回车]
  VBoxManage setextradata "2003" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/HostPort" 2012 [回车]


图2-3 命令输入情况

  命令解释:
  VBoxManage setextradata "2003" "VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol"
  VBoxManage:VBOX提供的一个强大的设置工具,利用它我们可以进行一系列的设置。
  setextradata:是在虚拟机的记录文档中加入后面的信息。
  "2003":引号中的文字代表你需要修改的虚拟机的名称,示例中使用的是名称为“2003”的虚拟机。
  VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol:
  
这行代码中,“pcnet”代表的是虚拟机的型号带有pcnet的网卡(详见方法一中的图1-3。),如果你选中的是intel的网卡,请将“pcnet”换成“e1000”,如果是Paravirtualized Network的话请替换成“virtio-net”。
  同样地,如果你为虚拟机配置了n个网卡,则要把/0/换成相应的序列。  
  /http/:即我们需要给使用“http”服务进行端口映射,如果你需要其他的服务,请将其替换成相应服务的名称,服务名称请自定义,没有限制
  “Protocol、GuestPort、HostPort”对应就是“协议、虚拟机需要映射的端口、主机映射的端口”。通常协议使用的是TCP,而IIS中默认使用的端口是80,如果有换成别的请将后面的数字替换成你的端口号。同样地,主机中映射的端口请使用未占用的端口,不然会造成无法访问。

  以上操作请小心进行,如写入出错的话会导致虚拟机启动出错,结果是我们需要到任务管理器中Kill掉VBOX的两个进程才可以重新操作。如实在不能启动,可删除相应虚拟机后重新建立,只要虚拟硬盘文件安好就可以

  4.运行完后我们去将虚拟机的网络连接方式设置成NAT连接,并在高级选项中选中你刚刚设置端口映射时的网卡型号(PCnet对应的是pcnetXXXXX的,e1000对应的是intel的,virtio-net就是只有一个了),而且猛击确定后启动虚拟机。


图2-4 NAT网络设置

  5.启动后我们在主机中打开浏览器,输入:http://localhost:2012/sw(解释,2012是刚刚设置映射的端口,sw是网站对应的虚拟目录),回车后可以看到:


图2-5

  同时会发现运行速度比Bridged模式要快,原因不明。
  后台登录:


图2-6

  以上图片请注意地址栏的地址。

  经过上面的方法大家或者会觉得,这样的操作实际是太麻烦了,因此我们还有另外的方法。

  操作方法2:
  1.首先我们需要找到VirtualBox存放虚拟机的设置文档的地方(通常是在系统用户的“我的文档”当中会有一个叫“.virtualbox”的文件夹。如果找不到,可以参考下图,在VBOX界面左上角的File菜单中找到Preferences选项,进入后就可以找到Default Machine Folder的地址了。)


图2-7 查找设置文件目录

  2.打开相应的文件夹后发现里面存在了我们在软件中创建的虚拟机:


图2-8

  3.打开“2003”文件夹,里面会有一个.xml的文档,用记事本打开后发现里面都很混乱,不妨用Dreamweaver打开,以获得一个相对干净的界面。


图2-9

  4.我们在图中可以看到(图中的文件是我在操作前进行的备份,因此参数有部分不一样,但不妨碍下面的介绍)刚刚我们利用VBoxmanage修改的相应参数其实就是“Extradata”中的内容。


图2-10 修改前代码


图2-11 修改后代码

  因此,我们只需要在相应代码中加入以下的三行代码,就完成了刚刚我们在命令提示符中的操作了。
      <ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/GuestPort" value="80"/>
      <ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/HostPort" value="2012"/>
      <ExtraDataItem name="VBoxInternal/Devices/pcnet/0/LUN#0/Config/http/Protocol" value="TCP"/>

  5.保存后我们启动虚拟机,进行刚刚方法1中的测试,发现结果是完全一样的,泪流满面。

  经过上面的设置后,我们已经可以在主机访问到虚拟机的网站了。但是大家会发现,局域网中的其他电脑貌似还不能访问到我们的网站,这样的话我们就需要进行以下的设置。

  三、防火墙设置:
  1.打开控制面板,找到我们的防火墙设置。(示例使用win7)


图3-1 防火墙设置

  2.点击左侧的“Advanced Setting”,进入高级设置界面。


图3-2 高级设置界面

  3.点击左侧的“Inbound Rules”(入站规则),然后右键新建一个规则。


图3-3 添加端口规则

  4.选择第二项“端口”,下一步后填入你刚刚设置的端口,选择相应设置的协议(TCP),下一步。


图3-4 添加端口规则

  5.选择允许所有连接后,不断下一步并在最后添加一个命名就可以了。


图3-5 允许访问设置

  6.完成规则设置后,请在局域网内机器的浏览器中输入你的主机的IP地址+端口,直接访问你的网站。地址形式:http://xxx.xxx.xxx.xxx:2012/


图3-6 实测情况

  关于防火墙的设置:
  很多时候我们已经设置好所以选项后发现然后没有办法连接到虚拟机中的网站,这时不妨考虑一下关闭虚拟机系统和主机中的防火墙,暂时用于测试。一般来说这样就可以连接上了。同时大家可以参阅以下的文章:
  《一起来穿越吧,穿过主机访问虚拟机中的网站系列教程(IIS及防火墙篇)

  总结一下,NAT这种连接方式有一个很好的地方就是可以直接就连网,无须其他设置就可以让虚拟机连网。但缺点就是没办法直接与主机访问,搭载在虚拟机上的网站需要经过以上的设置才可以成功在局域网内访问。而Bridged这种方式也是很好的方法,但在校园网只能自动分配一个IP的情况下,小弟暂时没有机会去研究Bridged在校园网中的使用方法(因为宿舍用的是外网)。未来会集中力量解决问题。现在请优先使用第二种方法,端口映射设置完毕后访问的速度很不错,推荐。

  四、更新3.2.0版VirtualBox穿越命令翻译:

  由于Oracle已经收购Sun,VBox这个不幸的孩子(第三次易主)已经更名为Oracle VM VirtualBox。当然,Oracle还是会做一点好事的。最新版本的VBOX已经支持安装Mac OSX了(实验性质),想玩的同学可以尝试一下。而且3.2.0版新增了不少特性,有兴趣的可以直接访问 http://www.virtualbox.org 观察观察哦。

  回归正题,新版VBox的VBoxManage的命令比之前的要简化了不少,还记得第二部分我们要设置一个端口映射需要分三次输入命令,而且命令里面很长很复杂。而新版的命令只有一行:

VBoxManage modifyvm "VM name" --natpf1 "guestssh,tcp,host ip,2222, guest ip,22"

  命令解释:

  跟之前的一样,我们可以看到熟悉的VBoxManage的身影。紧随其后的是 modifyvm ,跟之前版本的命令不一样。然后就是“VM NAME”虚拟机名称,将其替换成相应的虚拟机名称就可以了。接着就是重点部分了,NAT端口映射的参数。
  1.natpf1 我们可以很容易理解这个参数,natpf即 nat port forwarding的缩写。后面紧接着的是虚拟机设置中相应网卡的数字,如果你的网卡是第一个,则为1。
  2.natpf后的参数
  (1)guestssh 是这个端口映射的名字,自行修改成容易理解的名称吧,如果填则系统会自动生成。
  (2)tcp (or udp) 是映射的协议。
  (3)host ip 则是你的主机的IP地址,如不填写则映射到主机中的所有IP地址上的相应端口。
  (4)2222(host port) 主机端口,自选吧。
  (5)guest ip 虚拟机中的IP地址,很明显,不填写则映射到虚拟机中的所有IP地址上的相应端口。
  (6)22(guest port)虚拟机端口,自选+1。

  如果要删除端口映射,只需要输入以下命令:

VBoxManage modifyvm "VM name" --natpf1 delete "guestssh"

  是不是比之前版本的命令要简单很多呢?!真的是有进步的版本哦。建议有兴趣的同学可以玩玩。

  说明一点:在运行命令的时候其实不填映射的名称也可以的,系统会自动生成一个格式为“protocal_hostport_guestport”(例如:“tcp_81_80”)的名称,算是很不错的东西。注意,同一个名称只可以使用一种协议,如果要在相同的端口下进行映射请换另一个名称,或者不填。

  同样地,除了命令行的设置方法,还可以进行XML文件的修改

  在相应的虚拟机的XML文件中,我们可以找到下面的代码:

<Network>
<Adapter slot="0" enabled="true" MACAddress="08002762F180" cable="true" speed="0" type="82545EM">
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
</NAT>

  解释一下:大家的英文水平应该都比我高,所以这代码其实说的就是XML文件中对网络的设置。Adapter后面的就是相应的网络适配器的参数,Slot=“0”即使用的是第一个网卡。然后后面的就是这个网卡的一些参数,如MAC地址,网卡代号等等。

  重点关注NAT中的代码,依照上面的教程,其实我们只需要添加下面的代码后保存即可完成虚拟机的端口映射(代码不全,只添加了几个必要的参数。如有兴趣可以完整运行一次VBoxManage之后观察之。)


<Network>
<Adapter slot="0" enabled="true" MACAddress="08002762F180" cable="true" speed="0" type="82545EM">
<NAT>
<DNS pass-domain="true" use-proxy="false" use-host-resolver="false"/>
<Alias logging="false" proxy-only="false" use-same-ports="false"/>
<Forwarding name="web" proto="1" hostport="81" guestport="80"/>
</NAT>

  解释同之前使用命令行进行操作的差不多。name即此映射的名称,设置一个自己能认得到的就可以了。Proto即协议,0代表UDP,1代表TCP。后面的不用解释了吧,跟前面的一样。

  PS:3.2.0版的VBOX还是Oracle收购Sun后发布的第一个版本的VBOX,所以还有比较多莫名其妙的小问题,但可以看到这东西已经有很大的进步了。

  到这里,有关VBOX的穿越教程就到这里了,其实VirtualBox是很好用的一个虚拟机软件啊,如果有兴趣的话大家可以尝试使用。不过还是首先推荐用VMware,主流嘛。

  关于VMware的设置,请参阅同系列教程:
  《一起来穿越吧,穿过主机访问虚拟机中的网站系列教程(VMware篇)

  关于NAT端口映射的教程,大家可以参考以下网址:
  1.配置VirtualBox虚拟机通过NAT方式对外提供Web服务
  2.VirtuaBox做端口映射供主机访问客户机



补发2015-4-24 22:21的




欢迎光临 逐梦论坛 (http://temp2023.zhumeng.org/) Powered by Discuz! 7.2