从VirtualBox虚拟机访问本地主机

853

我有一个本地测试/开发服务器(当然是HTTP),监听端口8000。

我在Linux上工作,为了在Internet Explorer 6、7、8等浏览器上测试页面,我使用VirtualBox运行虚拟机;我还需要在Windows环境下查看Firefox的显示效果(例如字体不同)。

在我的实际机器上,我只需使用URL http://localhost:8000 打开网站,如何从虚拟机中访问本地主机呢?

目前我的解决方法是使用IP地址。有更好的建议吗?


55
我简直无法相信这仍然如此繁琐。我使用VB已经多年了,虽然它变得稍微容易一些了,但仍是主要的障碍,网络选项仍然很难理解,并且它仍然不能满足绝大多数用户想要使用它进行的操作。 可能有成千上万的用户使用VB在本地主机上为不同平台测试运行站点(或应用程序)。 想象一下,如果改进软件的这个特定方面,可以节省多少时间和烦恼,这真是让人难以置信。 - Rolf
1
请参考superuser.com上的同一问题:https://superuser.com/questions/310697/connect-to-the-host-machine-from-a-virtualbox-guest-os - Purplejacket
22个回答

998

我在Google上找到了这个链接:http://data.agaric.com/localhost-from-virtualbox-xp-install-ubuntu

它建议使用IP地址:http://10.0.2.2,对我而言有效。

因此,我编辑了hosts文件C:\windows\system32\drivers\etc\hosts并添加了以下条目:

10.0.2.2   outer

如果你在测试IE8,记得要在地址栏中输入http://。直接输入IP地址是行不通的。

例如:

http://10.0.2.2:3000/

7
我在ipconfig(VirtualBox中的Windows)中注意到,VirtualBox的默认路由器是那个IP地址...所以这对我来说很有意义。 - benc
50
为了能够保存你对 hosts 文件的编辑,通过右键点击记事本并选择“以管理员身份运行”来启动记事本。 - Noah Sussman
26
为了使这个方法对我起作用,我不得不把VirtualBox网络的“连接方式”从“桥接适配器”切换到“NAT”。 - Troy Harvey
2
我从https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/下载的IE11/Win10虚拟机似乎已经配置为在10.0.2.2上运行。也许其他可用的虚拟机也是如此。我建议在编辑伪/ etc / hosts之前先检查一下这一点,以免被任何新的安全问题所困扰。 - Michael Scheper
5
由于某个烂认证想要 localhost 作为地址,所以我需要访问 localhost 而不是 10.0.2.2 - Dominic
显示剩余11条评论

429

macOS

我在 macOS(之前是 OS X)上运行 Virtual Box,使用 Virtual Box 测试 Windows 上的 IE 等。

在 Virtual Box 中访问 IE,并通过 http://10.0.2.2 访问 localhost,或者通过 http://10.0.2.2:3000 访问 localhost:3000

我将网络设置保持为 NAT,在我的情况下不需要桥接,也无需编辑任何配置文件。


39
为了让它工作(在IE8/WinXP操作系统中),我实际上需要在IP地址前面添加“http://”。 - wrtsprt
8
有没有办法将10.0.2.2映射到localhost:8888?我在数据库中将localhost:8888设置为主页的URL。在VB中访问10.0.2.2会加载HTML页面,但所有链接都会失效,因为它们指向的是localhost:8888。 - Michael Giovanni Pumo
据我所知,您无法直接将URL映射到特定端口。您必须明确指定端口。@MichaelGiovanniPumo - Jonathan Lin
3
@JonathanLin,我通过在Win7的hosts文件中将10.0.2.2映射到localhost来解决了这个问题,这样即使使用端口:8888也可以正常工作,现在它已经可用了。谢谢。 - Michael Giovanni Pumo
神奇正在運作,macOS Sierra 版本為 10.12.5,虛擬機版本為 5.1.22。 - Tabares

87

在OSX上启用此功能,我需要执行以下步骤:

  1. 关闭虚拟机。
  2. 转到 VirtualBox Preferences -> Network -> Host-only Networks ->,点击“+”图标。点击OK。
  3. 选择您的虚拟机并点击“设置”图标->“网络”-> “适配器2” -> 在“连接至:”下拉菜单中,选择“Host-only Adapter”,您的网络(vboxnet0)应默认显示在下面。 点击OK。
  4. 重新启动虚拟机后,您应该能够通过http://10.0.2.2/访问localhost。

您可以通过将其引用添加到hosts文件(C:\windows\system32\drivers\etc\hosts)来使用localhost并访问其他localhost站点,如下所示:

10.0.2.2    localhost
10.0.2.2    subdomain.localhost

5
这个解决方案对我有用,只是稍作修改:创建新的Host-only Adapter (vboxnet0)后,编辑这个适配器。在弹出的窗口中,进入Adapter选项卡并复制“IPv4地址”(例如“192.168.56.1”)。然后,一旦你启动了虚拟机,打开浏览器并转到“http://192.168.56.1:3000”。 - Robert
1
很不幸,我无法解析我的子域名,我按照这里接受的答案中的步骤检查了Win10上的hosts文件是否正常工作:http://serverfault.com/questions/452268/hosts-file-ignored-how-to-troubleshoot有什么想法吗? - danjah
10
我无法找到“仅主机网络”选项。 - Jason Moore
1
对于那些找不到“Host-only Networks”选项的人,可以点击“文件”>“主机网络管理器”... https://www.virtualbox.org/manual/ch06.html#network_hostonly - Tom Sykes
我按照TomSykes的指示,然后是Robert的指示,最终成功了。我在这里做了一个总结:https://gist.github.com/n8jadams/ab8d63eeb4f9b82e332d6bd05052de0a - n8jadams
显示剩余2条评论

62

现在无法将来自VM的请求重新定向到主机的localhost,这已经被Windows内置(https://www.rfc-editor.org/rfc/rfc6761#section-6.3),包括位于https://developer.microsoft.com/en-us/microsoft-edge/tools/vms/的VM可用性。

出于安全考虑,Microsoft现在防止主机文件条目覆盖本地主机地址以外的任何内容。因此,在VM的主机文件中添加一行,例如:

10.0.2.2 localhost

将被忽略。

我知道两种覆盖此设置的方法:

  1. 使用NETSH端口代理到主机

    netsh interface portproxy add v4tov4 listenaddress=127.0.0.1 listenport=8000 connectaddress=10.0.2.2 connectport=8000

(其中10.0.2.2是虚拟机上的默认网关,8000是您想在主机上解析的端口。)

  1. 设置IIS执行应用请求路由,然后重写对localhost:port的请求以传输至hostIP:port

https://learn.microsoft.com/en-us/iis/extensions/configuring-application-request-routing-arr/creating-a-forward-proxy-using-application-request-routing


11
我使用了NETSH方法,效果非常好。在我看来,这是最好的答案。 - Liang Zhou
3
我也使用了NETSH,效果神奇。这也是我最好的答案。这是唯一一个有效的方法。 - Van_Paitin
1
“netsh” 是帮助我的工具,我尝试了网络上找到的所有方法,但都没有成功。这将允许通过 <protocol>://localhost:<port> 访问,而不是直接通过 IP 访问。对于 Windows 10,这应该是被接受的答案。 - Octavian Lari
2
这应该是被接受的答案,因为它是相关的并且目前正在工作。 - IAmJulianAcosta
1
适用于Windows 10。您甚至可以省略listenaddress,它仍然可以工作。如果需要,您可以指定protocol = tcp。 - Eugene Kulabuhov
netsh是最好的方法。非常感谢! - Azargoth

60
您的虚拟机网络设置可能是NAT。如果您将网络设置为桥接模式,则可以通过主机名访问您的主机。例如,如果您的主机名是“jsmith-Precision-7510”,并且您想打开http://localhost:3000/,则可以在http://jsmith-Precision-7510:3000/上查看该页面。
要查找您的主机名,请打开终端或控制台,然后运行命令hostname。您的主机名将输出在下一行。
请参阅VirtualBox文档以了解如何将网络设置为桥接模式。

嗯,由于某种原因,我的机器上的 GUI 没有这个选项! - hasen
你使用的是哪个版本?我发现在 Mac 上,一些基础手册文档完全不同。 - benc
喜欢这个解决方案。请注意,在一些较旧的Windows上,如果您没有安装Bonjour,您将无法使用whatever.local - Marc-André Lafortune

48

我不得不进入VirtualBox并将网络设置更改为“NAT”。之后,我可以通过http://10.0.2.2:3000从虚拟机上的仿真器访问在主机上运行的localhost


1
最近(2019年),我下载了微软的Windows 7 IE10客户机虚拟机(我的主机是MacOS Sierra),在网络设置方面遇到了很多问题。所以我最终放弃了它,下载了微软的Windows 7 IE11客户机虚拟机。然后,我将它设置为“NAT”网络,并可以通过 http://10.0.2.2 正如@Pytth在这里描述的那样访问主机的本地主机。 - Purplejacket

42
如果您的适配器连接到NAT,现在更好、更优雅的解决方案是将端口转发到本地端口。

设置 > 网络 > 适配器 > 高级 > 端口转发

只需插入新规则,并将主机端口客户端端口设置为80(用于http)或22(用于ssh),等等。

然后,您就可以通过输入http://localhost来访问该计算机了。

您可能还想将NAT切换到透明模式。


8
@Boris在这里描述的是如何从主机访问客户端服务器(端口)。但问题是反过来的。 - Petr Bodnár
因为我使用的是BT Home Hub,这是唯一适用于我的选项。 - Hashim Akhtar
非常简单的解决方案!谢谢 - Matheus Arruda

37

我发现10.0.2.2:<port>可以正常工作,但只有在正确设置了混杂模式的情况下才能使用。在安装虚拟机后,我进入“设置”>“网络”>“适配器1”。

默认情况下设置为NAT,并且混杂模式下拉菜单被禁用。我将其从NAT切换到桥接适配器,这样就启用了混杂模式下拉菜单,然后将值从“拒绝”更改为“允许虚拟机”。然后我又切换回NAT,这样就再次禁用了混杂模式,但保留了新值。

仅经过这个更改,我就能够启动我的虚拟机,并在虚拟机上看到我的主机机器上的localhost:<port>,位于10.0.2.2:<port>


2
我使用Windows 7作为我的主机,Windows 10作为客户机,在VirtualBox 4.3.30 r 10.16.10中,最终这个解决方案对我起作用了。谢谢! - Micer
我刚刚在虚拟盒子上安装了Windows 10,这解决了问题! - captainill
这对我也有效,结合了spsaucier上面的指示。我按照他的指示进行,然后启用了混杂模式 - 启用全部。 - DyeA

26

苹果电脑操作系统

如果你想在Mac上使用Virtualbox设置Windows环境,只需在适配器上使用默认的NAT设置, 并在Windows虚拟机中打开hosts文件并添加以下内容:

10.0.2.2       localhost
10.0.2.2       127.0.0.1

和上面的答案不同,重要的是要包含两行代码,否则它将无法工作。


7
这对于使用modern.ie图像在Mac上调试ie/edge非常有效,这也是我提出这个问题的原因。但是有一个例外:Windows 10。Windows 10不允许通过hosts文件修改localhost域名(疯了)。解决方法是启用IIS并设置反向代理,需要更多步骤但能达到相同效果:https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/12464785/ - MaxPRafferty
@MaxPRafferty 你能让这个工作起来吗?我已经尝试了这个线程上的所有其他方法,但都没有成功。我按照这个答案建议的方式更新了我的主机文件,并按照那个链接中的步骤进行了操作。在第7步中,关于在哪里声明10.0.2.2有点模糊。它应该放在规则的哪里?现在我被无情地重定向到我的Windows VM Localhost上的IIS页面。 - David Weber
@DavidWeber 是的,我就是 - 实际上我报告了那个错误,所以我仍然有那张图片。10.0.2.2 需要进入“操作网址”,在编辑屏幕中列为“重写网址”: 主重写页面:https://user-images.githubusercontent.com/1894398/34273137-1e8056e8-e661-11e7-847d-9afdbc0b4350.png,https://user-images.githubusercontent.com/1894398/34273136-1ccfc798-e661-11e7-9649-1ea5dc321da4.png 编辑规则页面:https://user-images.githubusercontent.com/1894398/34273207-67ff9a90-e661-11e7-83ba-027785df1d6d.png - MaxPRafferty
@MaxPRafferty 感谢您的帮助和链接。我仍然无法让它工作。这么简单的事情,我现在不确定问题出在哪里。我已经完全按照指示操作,尝试了其他网络类型建议,但仍然没有任何进展。看来我可能需要购买一台PC了。 - David Weber
@DavidWeber 这是一个非常恼人的问题,没有任何好的原因。唉,微软。如果我错过了什么步骤,您可以通过按照 https://weblogs.asp.net/owscott/creating-a-reverse-proxy-with-url-rewrite-for-iis 来跟踪我的步骤来设置反向代理。当您直接在Win 10 Edge浏览器中查看10.0.2.2上的本地主机系统时,您至少能看到吗?如果不能,那么您的问题在于您的虚拟盒配置,而不是您的Windows设置,这些解决方案都将无法起作用。 - MaxPRafferty
3
我认为这种方法已经不再起作用了,因为新版本的Windows使用DNS解析本地主机名。我也认为无法像以前一样重定向 127.0.0.1(只能重定向主机名)。 - kossmoboleat

25
你不需要更改hosts文件或Virtual Box的任何配置,保持NAT设置不变。转到Windows实例并运行"cmd"或打开cmd.exe。执行命令"ipconfig"并获取默认网关的IP地址。在Windows IE上浏览http://10.0.2.2:8080,你会发现它与你的Mac Safari http://localhost:8080/http://127.0.0.1:8080相同。

1
当本地开发服务器与“localhost”链接到开发依赖项时(例如webpack-dev-server)。 - kube
10.2.2.3或.4是什么?我可以ping .2以及那些 - 虚拟机是在Windows Server下运行的Windows Server。 - ycomp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接