我如何从主机访问VirtualBox客户机上的Apache?

我在Ubuntu虚拟机上安装了Apache。当我进入虚拟机并打开Firefox时,我可以看到当我浏览到localhost时,Apache正常工作。
我想通过主机访问相同的页面。我尝试使用虚拟机的IP地址,但没有显示任何内容。
理想情况下,我希望设置我的Windows 7(主机)请求虚拟机上Apache服务器的http://guestserver.com。我该如何做到这一点?

1我找到了一个帮助我解决问题的网站。以下答案是正确的,但并没有显示如何在虚拟机中创建虚拟适配器。我参考的网站是: https://christophermaier.name/2010/09/01/host-only-networking-with-virtualbox/ - Sudhir Dhumal
11个回答

如果您需要物理网络中的其他机器能够访问您的虚拟机(或者虚拟机需要互联网访问),请使用桥接网络。否则,请使用仅主机网络。

停止您的虚拟机并在VirtualBox(OSE)管理器中打开其设置 转到网络选项卡 选择您喜欢的网络模式(桥接网络或仅主机)(在下面的示例中,我正在使用仅主机) 如果要使用桥接网络,请在“名称”处选择正确的网络适配器。对于有线连接,您可以选择类似于eth0的名称。无线连接通常被命名为wlan0(数字可能会有所不同) 保存设置 启动Ubuntu虚拟机 启动后,您可以通过运行以下命令获取IP地址: ifconfig | grep addr 在下面的输出中,192.168.56.101是可用于访问虚拟机的Win7主机系统的IP地址: eth0 Link encap:Ethernet HWaddr 08:00:27:70:27:fe inet addr:192.168.56.101 Bcast:192.168.56.255 Mask:255.255.255.0 inet6 addr: fe80::a00:27ff:fe7b:25fe/64 Scope:Link inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host 在Windows主机系统中,以管理员身份编辑C:\Windows\System32\drivers\etc\hosts文件,并添加一行: 192.168.56.101 guestserver.com 如果您有一个Ubuntu主机系统,请使用sudo nano /etc/hosts编辑/etc/hosts文件 享受吧!

3这对于只能主机网络来说非常完美,现在我可以通过主机的浏览器访问客户机了。但是如果使用桥接连接(这正是我想要的),我无法从客户机上访问互联网。 - urok93
如果有人能帮我解决桥接连接的问题,那就太好了。我不知道自己是否做错了什么,只是选择了桥接模式启动虚拟机,但是无法与互联网建立连接,主机也一样。 - urok93
这很奇怪,也许你需要重新启动你的物理机器?请注意,这个问答网站是为Ubuntu设计的。如果你有与Windows相关的问题,请访问http://superuser.com/。 - Lekensteyn
好的,谢谢。我已经切换到无线连接了,现在可以正常工作了。稍后我会重新启动一下,如果还是有问题的话,我会在superuser.com上寻求帮助。感谢你的帮助。 - urok93
@drtanz:我忘记了,看看第三步的注释。 - Lekensteyn
如果你真的是指的ipconfig,那么在Windows上并没有'config'这个命令。你在第6步中运行这个命令的地方在哪里? - Max
@Max 那是个打字错误,应该是 grep。另一个可选的命令是 ip addr,但绝对不是 config - Lekensteyn
6在Linux上,ipconfig不是一个命令,而是ifconfig。你是不是指的是ifconfig? - Max
@Max 是的,你说得对!我又忽视了那个。 - Lekensteyn
8在Windows 7/8上,hosts文件位于以下位置:C:\Windows\System32\drivers\etc\hosts - Dalen
@Lekensteyn,您上面提到的步骤对桥接模式也有效吗?还是需要在某个地方进行更改? - user284234
2@begueradj 上述步骤适用于桥接网络,但有些网络不允许/提供多个地址。在我的大学里,由于这个原因我无法使用桥接网络,在这种情况下,我会使用NAT和端口转发代替。 - Lekensteyn
3通过启用两个网络适配器,一个使用NAT模式,另一个使用桥接模式,使我能够互相看到和被看到。 - stenci
在我的Debian 8.7上,我没有ifconfig命令。我使用ip a代替。 - Evgeni Nabokov
我在这个问题上遇到了困难,因为我陷入了狭隘的视野。我的桥接适配器运行良好,但我忘记检查我的防火墙是否允许8080端口上的TCP连接... - Brent Sandstrom

在我的情况下,我有一个路由器为我的主机PC分配静态IP。
1. 将网络适配器设置为桥接模式: 设置 > 网络 > 适配器 1(启用网络适配器) > 连接到:桥接适配器 > 确定
2. 启动虚拟机 > 登录
3. 将虚拟机的IP从动态更改为静态: sudo nano /etc/network/interfaces
4. 在主要网络接口下,将单词dhcp更改为static,并输入您的新静态IP,或者注释该行并添加一行新的配置。

:

#iface eth0 inet dhcp
iface eth0 inet static
        address 192.168.10.110
        netmask 255.255.255.0
        gateway 192.168.10.1
        network 192.168.10.0
        broadcast 192.168.10.255

请注意,我的路由器的工作地址是xxx.xxx.10.x,而你的可能是xxx.xxx.0.x或者xxx.xxx.1.x或其他地址。
在你完成这些设置之后,你可以在主机和客户机上都拥有互联网连接,并在Web浏览器中输入静态IP地址来检查你的Apache服务器。

我忘了告诉你,你必须确保你的/etc/hostname以正确的方式配置:nameserver [你的ISP主要DNS]nameserver [你的ISP备用DNS] - Nuc134rB0t

不要试图将适配器设置为桥接或仅主机网络适配器,你可以尝试在防火墙/其他端口下进行端口转发,将端口号设置为tcp和udp连接。

这绝对是最简单的选择,只需一个网络服务器。将客户机网络设置为NAT,并将所需的端口转发到主机上。简单明了。额外的好处是您仍然可以从客户机访问所有网络。当您使用桥接时,您只能访问桥接的网络。 - SimonAlfie

接受的答案对我无效(我在Ubuntu 12.04 LTS内部安装了VirtualBox,然后在VirtualBox内部安装了Ubuntu 14.04 LTS Server)。我只是交换了适配器1和适配器2的网络设置,即将适配器1设置为“桥接网络”和适配器2设置为“NAT”,然后它开始工作了。

这个很有用,但是请调整适配器的顺序,让客户端默认使用NAT,并能够连接到互联网。 - MadeOfAir
这对我来说真的有效。我正在尝试从Mac主机中访问Windows虚拟机。 - benjaminz
1经过几个小时的阅读和尝试了网上能找到的各种解决方案后,你提出的这个主意真是太棒了。非常感谢你写下来!我在主机和客户机上都使用了Ubuntu 18.04。 - John

如果您无法通过IP连接,那么在默认的Apache安装中使用DNS名称可能不会成功。
请检查虚拟主机的网络设置,我通常将其设置为桥接模式,以便可以在整个网络中访问。

我将其设置为桥接模式,但现在客户端无法连接到互联网。 - urok93
你在虚拟操作系统中获取到IP地址了吗?我通常会设置多个网络接口卡以匹配我的物理网卡。你能否提供一下虚拟机和主机的ifconfig信息? - PvdL
当我使用无线网络时,一切正常,但是使用有线网络却不行。这里有一些截图展示我的配置: http://imageshack.us/photo/my-images/832/guestr.png/ http://imageshack.us/photo/my-images/846/virtualbox.png/ http://imageshack.us/photo/my-images/9/hostwin7.png/ - urok93
请问有关于这个的任何帮助吗? - urok93
看起来你的电脑直接连接到了互联网,这可能是为什么你的客户端无法获取IP(v4)的原因。 - PvdL
我的电脑连接到路由器,然后连接到互联网。有什么办法可以让访客用户能够连接吗? - urok93
你确定它是一台(带有NAT的)路由器,而不是调制解调器吗? - PvdL
它实际上是一个调制解调器,抱歉。 - urok93
这意味着当我的主机直接连接到调制解调器时,无法将我的VirtualBox虚拟机客户端连接到互联网。 - urok93
如果您将其配置为NAT,那么是可以的,但我不认为您的ISP会给您两个IP地址,所以使用桥接设置是不可能的。 - PvdL

如果您只需要一个特定的端口(比如,如果您运行像Jetty或Tomcat这样的网络应用程序),只需执行以下操作:

设置 -> 网络 -> 将其中一个适配器设置为NAT -> 按下“端口转发” -> 设置相关的主机和虚拟机端口。

保存后,您只需从本地计算机访问localhost:hostport,它将重定向到VirtualBox的相关端口,然后就完成了。


在桥接模式下,如果您的主机使用静态IP地址,则应手动配置与主机IP处于同一范围内的客户端IP。否则,客户端将无法自动分配有效的IP地址。希望有所帮助。

Lekensteyn的回答是正确的。但是如果您在企业环境中,可能需要为您客人的IP地址禁用代理服务器。例如,如果您在主机上使用Mozilla Firefox,并且尝试访问客户端上的192.168.56.101/,您需要进入Firefox的工具->选项->高级->网络->设置,并选择“无代理”或“无代理 - > 192.168.56.101”。

如果您需要访问由于使用动态主机配置协议(DHCP)而获得不同IP的客户端,我建议通过其主机名进行访问。然而,当主机是Windows时,通过主机名进行访问可能需要额外的工具。
以下文本是从我在superuser.com上的回答中复制的:
我建议您使用多播DNS来解决这个问题。
Ubuntu默认使用Avahi来实现这一点。
Windows主机需要一个Avahi客户端才能发现其他Avahi服务。如果您的主机已经使用了一些苹果软件,那么通过一个名为Bonjour的服务可能已经存在。然而,如果尚未安装此软件,则可以在此处下载Bonjour的一个小版本:Bonjour打印服务。安装完成后,您应该能够通过.local访问您的客户端。
注意:mDNS系统似乎默认使用.local后缀。因此,如果您的主机名是"dev.myapp.com",那么实际的主机名将是"dev.myapp.com.local"。

我在搜索了很多并阅读了很多信息后解决了同样的问题,具体步骤如下:
1)在Virtual Box 6.1中挂载一个空的Ubuntu Server 16.04版本的虚拟机,配置为2GB内存和一个CPU。主机机器是连接到路由器的Windows 7。我有一个公共IP,并通过IP转发和打开本地主机机器(192.168.xx.xx)的80端口来配置我的路由器。
2)然后在Virtual Box中,进入"工具"->"首选项"->"网络"->"添加新的NAT网络"。然后编辑这个新的NAT网络,将名称设置为"NatNetwork"。然后点击"转发端口"->"IPv4"->"规则1";TCP;主机IP为192.168.xx.x(主机计算机的本地IP);主机端口=80;客户机IP=10.0.2.xx(这是我从控制台通过$ifconfig看到的我的Ubuntu服务器的IP);客户机端口=80。然后点击"接受"。
3) 在虚拟机中(以我的情况为例,使用Ubuntu),转到配置 -> LAN 配置:连接至:RedNat;名称 = "NatNetwork"(选择第2步创建的Nat网络)。
4) 接下来,我运行我的客户机(Ubuntu Server 16)。
5) 在控制台中,按照此链接中的步骤安装Apache2:https://www.digitalocean.com/community/tutorials/como-instalar-linux-apache-mysql-php-lamp-en-ubuntu-16-04-es 6) 安装完apache2后,我可以通过 $ curl 10.0.2.xx(我的客户机的本地IP)查看我的Apache服务器,并且可以通过主机机器上的Chrome浏览器在本地IP 192.168.xx.xx 上访问相同的Apache服务器,并且可以通过我的公共IP访问相同的Apache服务器(因为我已经配置了我的路由器进行IP转发)。
在下一页中,您可以查看一个图形过程: https://estudioecabrera.com.ar/apache-ubuntu/