0%

VMWare-UbuntuServer2004网络配置记录

达成的目标

在Ubuntu Server 20.04 虚拟机当中添加了两块虚拟网卡。一块VMWare虚拟网卡以桥接模式使用电脑的网线接口直接与树莓派通信,可拥有独立于物理网卡的Mac地址和IP地址,同时在树莓派上测试了Macvlan虚拟网卡,Macvlan虚拟网卡有多种工作模式,其中桥接模式可使虚拟网络接口借助物理接口与外界直接通信。另一块VMWare虚拟网卡配置为NAT模式,借助主机网络访问互联网。

主机配置

桥接网络配置

VMWare默认的桥接网络会自动选择用于桥接的实体网卡,如果需要指定通过网线接口而非无线网卡桥接,就需要专门进行配置。在虚拟网络编辑器当中为默认桥接网络指定网卡即可。

NAT网络配置

NAT网卡无需特别配置,默认的配置已经开启了DHCP,但是需要注意的是网关可能不是 192.168.227.1(以我的IP为例说明) ,我原本在虚拟机中配置了静态地址,结果无法访问互联网,也无法ping通 192.168.227.1,后来改成了 DHCP 模式,发现虚拟机自动配置的网关是 192.168.227.2,而Windows中可以看到 VMware Virtual Ethernet Adapter for VMnet8 的IP是 192.168.227.1,值得关注的还有 IPv4 WINS 服务器: 192.168.227.2,通过查看虚拟机上自动经DHCP配置好的信息,发现虚拟机的网关和DNS服务器恰好都是 192.168.227.2,因此如果想要配置静态IP,需要注意网关和DNS服务器的配置。我所采用的方法是在开启DHCP Client的同时再额外配置一个自定义的IP地址,这样既可以在局域网通过自定义IP地址访问虚拟机,也可以使虚拟机自动配置网关和DNS服务器。

虚拟机ping不通主机是因为Windows防护墙,关掉就能ping通了,不过即使能ping通,也无法将 192.168.227.1 配置为网关来访问互联网,原因上面说了。

VMware Virtual Ethernet Adapter for VMnet8 网络属性

虚拟机当中由DHCP Client配置的 DNS 以及网关

补充说明

后来发现VMWare网络编辑器里面是能看到网关信息的,确实是 192.168.227.2,如果想要手动配置,就按这个信息配置。

虚拟机配置

Ubuntu Server 20.04 的网络配置方法

Ubuntu Server 20.04 使用 netplan 进行网络管理(总是旧的还不熟悉就换了,,),还默认启用 systemd-resolve 进行域名解析,所以网络配置文件不再是 /etc/network/interfaces,DNS配置文件也不再是 /etc/resolv.conf

网络配置文件是 /etc/netplan/*,我就直接修改了安装时生成的文件 /etc/netplan/00-installer-config.yaml,修改完毕之后需要执行 sudo netplan try 命令检测配置并按Enter应用配置。

DNS配置文件我没有仔细查,看systemd-resolve文档即可,不过/etc/resolv.conf的开头是这样的,最好不要乱改。顺便说一下,查看DNS服务器的命令是 resolvectl status

1
# This file is managed by man:systemd-resolved(8). Do not edit.

我的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
# This is the network config written by 'subiquity'
network:
ethernets:
ens33:
addresses: [192.168.10.11/24]
#gateway4: 192.168.10.1
#nameservers:
# addresses: [192.168.10.1]
dhcp4: no
ens38:
addresses: [192.168.227.5/24]
dhcp4: yes
version: 2
  • 其中 ens33 是桥接网卡,配置文件中仅为其配置了静态IP地址,并关闭了dhcpv4,其余的网关、DNS等配置被注释掉是因为如果保留的话,netplan 将为根据设定的网关添加默认路由,而且该默认路由的优先级比 ens38 的默认路由要高,导致各种外网请求走没有互联网连接的 ens33。这里只为 ens33 配置IP,不配置网关,就可以避免 netplan 添加相应的默认路由。
  • ens38 本来采取的是纯静态配置,结果无法访问互联网,原因在上面讨论了,这里采用了较为稳妥的 DHCP + 静态IP 的方法,既能通过固定IP便捷访问,又能借助DHCP自动配置网关和DNS。

树莓派配置MacVLAN虚拟接口

之前使用路由器多拨时接触过MacVLAN,感觉十分神奇,居然可以通过一个实体网络接口拓展出众多虚拟接口,并且每个都可以拥有自己的Mac地址和IP,而多拨原理就是每个虚拟接口都拨号,然后带宽叠加。

最近了解到相关虚拟技术是由Linux内核提供支持的,从最初的TUN/TAP,发展到后来的MacVLAN和MacVTap,原本我是打算创建一个MacVTap虚拟接口的,结果好像报错说不支持该类型,就用了MacVLAN,并顺利为虚拟接口配置了IP,经测试可以连通。

配置工具就是一系列 ip 命令,在此不再赘述。下图当中的 macvlan0@eth0 即为基于 eth0 的虚拟网络接口,需要注意的一点是,在使用 ip 命令配置的过程中,使用 macvlan0 引用虚拟网卡,不需要带也不能带 @eth0

为什么网络接口、交换机可以虚拟化?

以前没有仔细考虑过这件事情,感觉很神奇,在这里简单地说一下现在的想法。

先来回顾一下交换机工作原理:

交换机工作于OSI参考模型中的第二层(数据链路层),交换机的工作依赖于对MAC地址的识别(所有的网络设备都有一个唯一的MAC地址,通常是由厂商直接烧录进网卡中)。
当交换机从其某个端口收到一个数据包时,先读取包头中的源MAC地址(即发送该数据包的设备网卡的MAC地址),将该MAC地址和端口对应起来添加到交换机内存里的地址表中;然后再读取包头中的目的MAC地址,对照内存里的地址表看该MAC地址与哪个端口对应,如果地址表中有该MAC地址的对应端口,则将该数据包直接复制到对应的端口上,如果没有找到,则将该数据帧作为一个广播帧发送到所有的端口,对应的MAC地址设备会自动接受该帧数据,同时,交换机将接受该帧数据的端口与这个目的MAC地址对应起来放入内存中的地址表中。

简单地说交换机的作用就是转发MAC帧,物理交换机可以用于在一些物理接口之间转发MAC帧。

那么网络接口如何实现虚拟化呢?在没有虚拟接口的情况下,一个网卡对应一个MAC地址,交换机按照转发表,把对应的MAC帧发送到特定的物理端口。只要在此基础上,允许一个物理网卡对应多个MAC地址,那么每个MAC地址都可以配置一个虚拟接口,物理网卡所属机器在拿到MAC帧之后,再根据具体内容分发到虚拟接口即可。而一个物理网卡对应多个MAC地址其实只要允许交换机转发表中一个接口对应多个表项即可。

上面说的是数据链路层的虚拟化,只要实现了数据链路层的虚拟化,那么每个虚拟接口都可以独立地实现局域网通信了,它们是物理端口还是虚拟端口对于上层协议栈来说其实是透明的。

如果接口是用软件虚拟的,那么自然地,就可以同样利用软件在这些虚拟接口间转发MAC帧,这些软件就相当于虚拟交换机了?

参考资料&相关链接

Virtual networking: TUN/TAP, MacVLAN, and MacVTap
虚拟交换机(vSwitch)原理及配置
Open vSwitch
MacVTap - Linux Virtualization Wiki
Macvlan and IPvlan basics