VM 和 HOST 之间的通信#

基本知识#

基本的网络知识,如果两台设备要互相通信,有一个渠道就是通过交换机。

安装完 VMware 后,我们电脑上就会出现 VMware Network Adapter VMnet1 和 VMnet8。 那么这两个东西是什么?有什么作用?从名称上看,叫网络适配器。有一个知识点需要记住,网络适配器就是网卡,网卡就是网络适配器。

在宿主机上,网卡就是一张硬件卡,它负责将数据转化为电信号。交换机则负责两台设备之间的通信。

因此,我们可以将虚拟机和宿主机的网络模型简单看做如下模型:

宿主机网卡 --- 交换机 --- 虚拟机网卡

这样,借助交换机和网卡我们就可以实现双方的通信了。 但是,VMware 给我们提供的不是真实的交换机和网卡,而是虚拟的交换机和网卡。

VMware 这个软件本身充当了虚拟交换机的角色,它可以帮我们在宿主机和虚拟机上分别创建两张虚拟网卡。 在宿主机 Windows 上,这张虚拟网卡叫 VMware Network Adapter VMnet1 或 VMnet8。 在虚拟机 Linux 上,这张虚拟网卡叫 VMnet1 或 VMnet8,少了前面几个单词。 打开 VMware 依次选择 Edit > Virtual Network Editor 就可以配置虚拟交换机了。

虚拟交换机给我们提供了三种通信模式,VMnet0、VMnet1、VMnet8。 如果想让双方通信,我们只需要选择其中的一种,比如最常用的 VMnet8(NAT 模式)。 然后配置一下虚拟交换机、宿主机虚拟网卡、虚拟机虚拟网卡的信息就可以了成功调通环境了。

以上是一部分原理知识,可以帮助我们理解为什么要这么做,后文将对如何进行相关配置进行细节描述。

配置网关和防火墙#

在 Windows 上我们可以检查虚拟网卡的信息,默认应该是动态分配的。但是大多时候,我们不希望我们的虚拟机 IP 地址经常改动,为了相互匹配,所以对宿主机一般也是静态分配。

# 参考 https://ubuntu.com/server/docs/network-configuration
cat <<EOF | sudo tee /etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:  # 通过 ip addr 查询网络名称
      addresses:
        - 192.168.?.xxx/24
      routes:
        - to: default
          via: 192.168.?.2  # 通过 VMware 虚拟网络编辑器查询网关
      nameservers:
        search: [localdomain, localhost]
        addresses: [114.114.114.114, 8.8.8.8]
EOF
# 刷新网络
sudo netplan apply
# 参考 https://ubuntu.com/server/docs/network-configuration
cat <<EOF | sudo tee /etc/netplan/99_config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:  # 通过 ip addr 查询网络名称
      dhcp4: no
      addresses:
        - 192.168.?.xxx/24
      gateway4: 192.168.?.2  # 通过 VMware 虚拟网络编辑器查询网关
      nameservers:
        addresses: [114.114.114.114, 8.8.8.8]
EOF
# 刷新网络
sudo netplan apply
sudo vim /etc/network/interfaces

# 在文件中添加如下内容
auto ens33  # 通过 ip addr 查询网络名称
iface ens33 inet static
address 192.168.?.xxx
netmask 255.255.255.0
gateway 192.168.?.2  # 通过 VMware 虚拟网络编辑器查询网关

# 编辑 resolv.conf
sudo vim /etc/resolvconf/resolv.conf.d/base
# 修改 DNS 服务器
search localdomain
nameserver 114.114.114.114
nameserver 8.8.8.8

# 编辑 NetworkManager.conf
sudo vim /etc/NetworkManager/NetworkManager.conf
# 在文件中修改如下内容
managed=true

# 重启系统
sudo reboot

检查虚拟机是否可正常入网 ping www.baidu.com,如果不能上网,按下面的步骤排查:

  • 检查网关:编辑 > 虚拟机网络设置 > 选中 VMnet8 > NAT 设置 > 网关

  • 检查 DNS:中国电信 114.114.114.114、谷歌 8.8.8.8

注意:VMware 的网关应该和虚拟机的网关保持一致。

然后,宿主机和虚拟机互相 ping 一下,如果 ping 不通,按下面的步骤排查:

控制面板 > 系统和安全 > 检查防火墙状态 > 启用或关闭 Windows Defender 防火墙 > 公用网络设置 > 关闭

控制面板 > 查看网络状态和任务 > 更改适配器设置 > 禁用 VMnet8 > 启用 VMnet8

sudo apt install openssh-server
service sshd start
service ufw stop
sudo ufw disable
systemctl stop firewalld.service
yum install openssh-server
service sshd start
iptables -F
apt install openssh-server
service sshd start

虚拟机克隆#

有时候,我们需要构建多态虚拟机,每台虚拟机都是从 0 开始创建未免太耗时。所以我们一般选择用虚拟机克隆的方式创建多态虚拟机。 创建完多个虚拟机后,他们可以说是一模一样的,但是每台机器必须有一些唯一的标识,所以需要做以下修改:

  • (必须)参考 配置网关和防火墙 修改 IP 地址。

  • (必须)删除 /etc/sysconfig/network-scripts/ifcfg-* 的 MAC 地址,然后重启自动生成。

  • (必须)删除 /etc/sysconfig/network-scripts/ifcfg-* 的 UUID,重启后也会自动生成。

  • (可选)在 /etc/hostname 中修改 hostname

  • (可选)在 /etc/hosts 中添加地址映射 <ip-address> hostname

注:Ubuntu 16.04 的配置文件 /etc/network/interfaces 没有指定 UUID 和 MAC 地址,故现在不知道怎么修改,等后面出现问题,再找解决方案吧。并且,早期版本很容易出现问题,而又停止维护,故现在不推荐使用 16.04 了,有可能的话还是用更高版本的吧,不然你会浪费更多时间再配置环境上。

Windows 网络#

我们如果用 ipconfig 查看宿主机的网络信息,可能会出现很多看不懂的名词,这里来统一解释一下: