真是痛苦死我了。
首先特别感谢这篇文章最终解决了我的问题:https://blog.csdn.net/u012809062/article/details/118102545
需要事先知道的:
前置知识:通俗易懂的IP地址、子网掩码、默认网关、DNS服务器
别人画的网络拓扑图太复杂,这是我自己画的示意图。这里对“路由器”的定义不是那么严格,各位粗略理解就好。(想详细了解可以看这篇https://blog.csdn.net/qq_39192827/article/details/85872025)
【声明】本文中 物理机=主机
- 主机与虚拟机通信 用的是在主机中创建的一个虚拟网卡,而与外部网络通信用的是真实存在的物理网卡。因此你在从虚拟机ping主机时要用的IP是虚拟网卡的IP,而不是你现在正在上网所用的IP(注意:是主机用虚拟网卡和虚拟机聊天,不是虚拟机用网卡和主机聊天,网卡是主机的,相当于主机开了个小号)
- 什么是“Net模式”:只要你玩过一点wifi就知道,多台主机连到一个路由器下就构成了一个局域网。而Net模式就是建立这样一个虚拟路由器,并把物理机和虚拟机都连在了这个虚拟路由器之下,建立了一个虚拟机和主机之间的专用网络。 而这个虚拟路由器在物理机中又像一个普通应用程序一样依靠主机的物理网卡与外界联网。
- 在“Net模式”下,主机向虚拟机发送的数据包遵循这样的路径:主机 > VMnet8网卡 > 虚拟路由器 > 虚拟机(按理来说虚拟机也应该有个网卡,但这不重要了,反正都是虚拟的)
- 什么是“仅主机(Host-Only Adapter)模式”:就是一个砍掉了虚拟机联网功能的Net模式。所以理想情况下,主机和虚拟机可以互ping,但虚拟机不能
ping baidu.com
。 - 虚拟路由器和虚拟网卡是相互独立的存在。所以,在Net模式下哪怕把VMnet8禁用,虚拟机也可以上网。
- 既然虚拟机与主机连接在一个虚拟路由器下,那么容易想到:它们的IP地址必须在同一个子网下才能相互ping通。如何配置子网我稍后讲解。
配置流程
配置“Net模式”和“仅主机模式”唯一的不同就是虚拟网卡不同。Net模式是VMnet8,仅主机模式是VMnet1,所以下面以“仅主机模式”为例。
如何查看网卡的IP?
在主机里右下角点开你平时联网的地方,再点击“网络和Internet 设置”,弹出窗口划到下面点“更改适配器选项”,然后你就会看到上面那张图
双击打开网卡状态,你有两种方法可以查看ip地址:
一种是点击“详细信息”
一种是点击属性,再双击列表中的“Internet协议版本4(TCP/IPv4)”,这种方法可以指定你要使用的ip地址。如果你没有设置过它的话它会是“自动获得IP地址”的状态,那么想看到IP地址就只能用上一种方法了。
在上图中我以VMnet1为例,可以看到这个网卡的IP地址为192.168.1.200
如何配置子网一致?
首先,设置虚拟网卡IP
设置方法我在前面的第二种方法里介绍了。
但是要把IP地址设置为什么呢?
暂时设置为192.168.2.1
,后面会详细探讨这个问题。
然后,设置虚拟机的子网IP
打开“虚拟网络编辑器”
为什么我就可以确定Net模式是VMnet8,仅主机模式是VMnet1 呢?
看见没有,这里写了:
点击“更改设置”,再点到下面的“子网IP”那一栏,就可以修改虚拟机的子网IP了。
子网IP修改成什么呢?这里的子网IP和前面那个网卡的IP地址是什么关系?
【声明】子网IP = 网络地址
前面的网卡IP 指明了主机所在的IP地址
这里的子网IP 指明了虚拟机所在的子网(没有指明具体的IP地址,想要指定IP地址的话还要在ubuntu内部配置,但这不影响)
虚拟机和主机在同一个子网,也就是说它们的网络地址必须是相同的。比如我前面的网卡IP设置为192.168.2.1
,所以这里的子网IP就必须是192.168.2.0
,(或者192.168.2.x
,最后的x
是主机号,这里写什么都无所谓,因为子网掩码255.255.255.0
会让计算机只关心前3个字节)
突然发现,在虚拟网络编辑器改完后,前面虚拟网卡的IP会被自动修改成
192.168.2.1
,所以上一步可以省去了
到这里我们就已经成功让主机和虚拟机的子网一致啦!
设置网络模式
有人说不能直接选“仅主机模式”,要在“自定义”里选VMnet1,但我实测了两种方式都没问题。
有时候在改了设置后Ubuntu里面没有跟着改(用ifconfig
查看IP就知道改没改了),挺奇怪的,建议两种方法都试试。
关闭防火墙
在这之后可能还是会因为防火墙而无法ping通,请看win10在不关闭防火墙的情况下实现与本地虚拟机之间通信
如果你在加了规则后依然无法ping通,可以试试直接把防火墙关了,关了就行了。我就遇到了这个奇怪的现象(只在“仅主机模式”下会发生)。
大功告成!
关于IP地址的选择
在前面解释原理的时候我有说到
Net模式就是建立这样一个虚拟路由器,并把物理机和虚拟机都连在了这个虚拟路由器之下,建立了一个虚拟机和主机之间的专用网络。 而这个虚拟路由器在物理机中又像一个普通应用程序一样依靠主机的物理网卡与外界联网。
那么既然这个路由器都是虚拟的,那我想给它设置什么IP地址不是随心所欲吗?
没错!
实验证明在NAT模式下网络地址就是可以随意设置的,即不影响和主机通讯也不影响上网。只不过是约定俗成地喜欢用192.168.x.x
罢了。
实验1:设置子网IP为192.200.20.0
,VMnet8的IP为192.200.20.1
实验2:设置子网IP为1.200.20.0
,VMnet8的IP为1.200.20.1
但是,在“仅主机模式”下遇到了点问题
就是前面讲的,在“仅主机模式”下,防火墙加了规则后依然无法ping通,但是直接把防火墙关了就能ping通了。
我在开启防火墙的情况下使用wireshark抓包,发现物理机收到了ping的请求但是没有回复,我目前没有搞明白为什么。
按道理“仅主机模式”和“Net模式”相比只是断了个上网的途径,所以它的子网IP也是可以随意设置的。但神奇的是,如果你把虚拟网卡IP设置为和现在正在上网的网卡同一个网段(比如我的主机上网用的IP地址是192.168.1.101
,网络地址是192.168.1.x
,我把虚拟网卡IP写成192.168.1.200
),那么不必关闭防火墙也不必设置规则,虚拟机就可以ping通主机。而如果不这样设置IP而是跟之前一样随意设置,就必须要关闭防火墙。
对此我的猜测是因为我在主机里把局域网设为了专用网络,虚拟机的IP设置为和现在正在上网的网卡同一个网段 就相当于局域网里的另一台主机,所以被防火墙通过了。
但“仅主机模式”必须关闭防火墙这个问题依旧很奇怪,希望有大佬能解答一下。