>

Host-Only 顾名思义就是虚拟机只能跟宿主机通信的一种网络模式。在这种模式下,虚拟机不能直接访问外部网络,而只能跟宿主机通信,因而它是一种封闭而安全的网络模式,可以保护虚拟机系统不受任何外部网络的影响。

但是,在某些情况下,我们需要 Host-Only 模式下的虚拟机访问外部网络,那么该怎么做呢,这篇文章就来详细介绍具体方法。

本文以 Mac OS 作为宿主机(Host OS),Windows 10 作为虚拟机(也即客户机,Guest OS)为例来进行介绍如何使 Host-Only 模式下的虚拟机访问外网。

我的 Mac 系统中使用 Parallels Desktop(以下简称 PD) 虚拟机软件安装了 Windows 10 系统。当然,使用其他软件比如 VirtualBox 或 Vmware 原理相同。虚拟机中的操作系统需要联网,一般虚拟机软件都会提供几种最基本的联网模式,PD 就提供了三种:1)Shared Network 2)Bridge Network 3)Host-Only Network。

如下:

![](/image/pd_netconfig.png)
![](/image/desknet.png)

默认情况下,PD 为虚拟机启用的是共享网络(Shared Network)模式。这种模式本质上就是 VirtualBox 中的 NAT 模式,宿主机充当虚拟机的路由器,通过虚拟网关为虚拟机分配一个内网 IP 地址来实现内网机器的对外联网。

由于宿主机充当路由,所有虚拟机发出的网络请求都会忠实的转发出去,因而虚拟机可以轻松实现上网。简而言之,共享模式下我们日常上网的绝大多数情况都能满足。但是如果我们对虚拟机的安全性要求高的话(比如运行了重要的程序,防止受病毒侵袭,或者数据泄漏等),我们可能就需要一个更加安全封闭的网络,也就是说,我们即不希望虚拟机直接访问外部网络,也不希望外部网络访问虚拟机。那么 Host-Only 就是一个必然的选择。

VirtualBox 中还有 Internal network 模式,它比 Host-Only 更严格。虽然这篇文章的主要目的是介绍如何让 Host-Only 模式下的虚拟机访问外部网络,但是先理解 Host-Only 模式的原理是我们达到目的的一个重要前提。所以这里就先简单介绍下这个模式的基本原理和用法。

不管哪种网络模式,虚拟软件都需要在宿主机上创建一个虚拟网卡,比如 Shared Network 模式下虚拟软件会自动命名把该网卡命名为 Shared Network Adaptor,而 Host-Only 模式下,虚拟软件则将该网卡命名为 Host-Only Network Adaptor。

本人 Mac 系统中使用 PD 创建上述两块虚拟网卡,Mac 中打开 Network Preferences 页面,显示如下:

![](/image/nic02.png)
![](/image/nic01.png)

PD 创建的虚拟网卡会自动为 Host OS 和 Guest OS 分配 IP 地址,如上图所示,宿主机 Mac 的 Host-Only 虚拟网卡为其分配的地址是 10.37.129.2,或者我们直接在命令行中输入 ifconfig 也可以看到该信息,如下:

![](/image/vnic.png)

我们进入 Windows 10 客户机,可以查看 Host Only 网卡为 Windows 10 所分配的 IP 地址(10.37.129.3),如下:

![](/image/win_ipconfig.png)

由上图还可以看到,Host-Only 虚拟网卡的网关是 10.37.129.1。

在启用 Host-Only 模式之后,我们需要先把宿主机与虚拟机互 Ping 以测试它们是否可以正常联通(一切正常的话,应该联通)。

Guest -> Host (可以 Ping 通)

Host -> Guest (无法 Ping 通)

原因:Windows 防火墙阻挡。

Windows 10 的防火墙阻止了外部的 Ping 命令所发出的 ICMP 请求包,所以,我们暂时关闭防火墙即可。

同理,如果虚拟机无法 Ping 通宿主机,也应该先关闭防火墙来排查故障。我们也可以仅修改防火墙的具体规则而不是把整个防火墙关闭来达到目的,如下:

![](/image/win_firewall.png)

如何在宿主机 Mac OS 的网络设置页中显示 Host-Only 虚拟网卡?

在 Paralles Desktop 启用 Host-Only 时,默认情况下,Mac 的网络设置页不会显示该虚拟网卡,我们需在通过如下设置来显示:

右键 Parallels Desktop,选择 Preference,在弹出的选项框中勾选 “Show in System Preference”,如下:

![](/image/pd_preferences.png)
![](/image/pd_pref.png)

然后,我们打开 Mac 的网络设置页,就可以看到 Host-Only 这张虚拟网卡了,如下:

![](/image/hostonly.png)

好了,前期准备我们已经完成了,现在回到重点,如何才能让虚拟机访问外网!

如果想要虚拟机上外网,有两种办法可以解决:

1、为虚拟机再设置一块网卡,连接方式为NAT,使用 NAT 来访问外网。

2、在宿主机中开启一个代理端口,然后虚拟机的浏览器中 LAN 设置使用这个代理。

第一种方案的思路很简单,就是增加一个 NAT 网卡来连接外网,这里不多介绍。(而且,由于 Mac 系统下的 Parallels Desktop 每次只能为虚拟机中的系统使用一块网卡,因此第一种方案暂不可行。)

下面,我们来看第二种方法,也就是在把宿主机作为代理机被虚拟机访问,这就需要我们在宿主机中开启一个代理端口以便虚拟机可以访问。

那么如何在宿主机中开启一个代理呢?

我们可以通过一个知名的代理软件 “Surge for Mac” 来实现。

先安装 Surge for Mac,然后按照如下方式进行设置并开启代理端口:

1)点击右下角 Enhanced Mode 进入 Setup Guide 页面

![](/image/mac_surge.png)

2)选择 For Remote Machines > 点击 Allow External Access

![](/image/mac_surge_guide.png)

可以看到,点击 Allow External Access 之后其右边会出现 Listen on: 192.168.22.33:6152 端口开放信息。

它是实际上是一个 0.0.0.0:6152 类型的允许远程连接的端口,如下:

需要注意的是:宿主机提供的代理端口必须要允许远程连接,也就是 *:80(也即 0.0.0.0:80),而不是 localhost:80 这种形式。

所以,Host-Only 模式下的虚拟机可以向这个端口发起请求,而 Surge 会帮我们把这个请求代理出去,从而实现虚拟机上网。

通常,我们上网需要用到浏览器,那么我们只需在虚拟系统中的浏览器中进行代理设置即可,目标代理地址就填写作为 Host-Only 模式下虚拟机可以访问的宿主机的 IP 地址及端口。

以 Chrome 浏览器为例,按如下方式设置:

Settings > Advanced > System:Open proxy settings > LAN settings

这样,虚拟机就可以正常访问网络了。

打开一个网页试试,

![](/image/tianya_screen.png)

成功!

注:如果 Windows 10 中使用了 Chrome 或 Firefox 浏览器,我们可以下载 SwitchyOmega 插件来更加科学方便地管理代理规则,比如,我们按照如下方式配置代理:

![](/image/omega1.png)

上述 Surge 提供了代理的功能,实际上还有其他软件也可以提供类似代理,比如 Shadowsocks,

它也提供了 HTTP Proxy 的功能,只需要简单设置即可让虚拟机连接。

如下:

如上,正常情况下,为了安全,代理通常被设置成本地(也即 127.0.0.1)。这里,为了使虚拟机可以使用这个代理端口,我们需要把它改成 0.0.0.0。

SwitchyOmega 代理规则设置如下:

![](/image/omega2.png)

配置完成之后,我们再来测试一下,打开 YouTube,

![](/image/youtube_screen.png)

现在我们的 Host-Only 虚拟机也可以颗学上网了 😊。

注:由于代理的缘故,经过实测,上网速度会略慢一些。

如何添加多个 Host-Only 虚拟网卡?

我们可以在 Parallels Desktop Preferences 设置页添加多块虚拟网卡,如下:

![](/image/pd_pref1.png)

添加之后,在宿主机 Mac 的“Network Preferences”页面就可以看到这块虚拟网卡了。

一台 VM 一次只能使用一块虚拟网卡,也就是一个 Host-Only 地址,

我们可以在 Device > network 中进行切换,如下:

![](/image/device_network.png)

全文完!


如果你对我的文章感兴趣,欢迎留言或者关注我的专栏。

微信公众号:“知辉”

搜索“deliverit”或

扫描二维码