桥接还是 NAT?KVM 网络配置的最优解
在KVM虚拟化里,网络设置对于虚拟机的连接速度和性能至关重要。libvirt这个工具通过简化网络管理,提供了两种主要的网络类型:桥接网络和NAT网络。这两种方式适合不同的使用场景,比如桥接网络更适合正式的生产环境,而NAT网络则更适合开发或测试环境。
装了KVM之后,它会自动设置一个默认的NAT网络。这样,你的虚拟机就能通过这个NAT网络上网了。这个NAT网络其实就是一个虚拟的交换机加上一些网络规则组成的。听起来可能有点复杂,我们可以通过一张图来更清楚地理解。
在KVM的NAT网络中,虚拟机通过虚拟交换机与宿主机相连。通过iptables的SNAT规则,将虚拟机的IP地址转换为宿主机的IP地址后,虚拟机就能利用宿主机的物理网卡访问外部网络了。由于只设置了SNAT而没有设置DNAT,因此虚拟机可以访问外部网络,但外部网络不能直接访问虚拟机。若要让外部网络能够访问虚拟机的服务,则需手动配置DNAT。"外部网络"在这里指的是局域网(如办公环境内的网络),而非互联网。
enp6s18是电脑的真实网卡,而virbr0是KVM为默认NAT网络设置的虚拟交换机。使用默认NAT时,虚拟机会连接到virbr0。由于当前没有运行虚拟机,因此看不到网卡变化。如果启动一个虚拟机(如ubuntu-cloud),KVM会为其创建一个新的虚拟网卡。接下来我们通过启动这台虚拟机来看看会发生什么。
当你启动了ubuntu-cloud虚拟机之后,再次运行ip a命令来检查网络接口的信息时,你会发现比之前多了一个新的网络接口。这个变化如下所示:
当你启动ubuntu-cloud虚拟机时,会发现多了一个名为vnet0的网卡。这个vnet0网卡的作用是连接ubuntu-cloud虚拟机到virbr0交换机。可以想象成一根网线,一端连接ubuntu-cloud虚拟机(通过其内部的虚拟网卡),另一端连接virbr0交换机(通过vnet0)。简而言之,vnet0是为了让ubuntu-cloud能够与virbr0通信而专门设置的虚拟网卡。运行brctl show命令可以帮助你更清楚地看到virbr0和vnet0之间的关系。
现在有一个叫virbr0的虚拟交换机。它有两个接口,一个是virbr0-nic,另一个是vnet0。virbr0-nic这个接口是用来连接宿主机上的物理网卡(eth网卡)的,而vnet0这个接口是用来连接ubuntu-cloud虚拟机里的虚拟网卡(eth网卡)的。这样应该能想象出它们是怎么连接起来的了吧?
了解了上面的知识,我们可以把nat网络的模型图细化一下,理解成下面的样子:
在我们的生产环境中,我选择了桥接网络模型。这种模式让虚拟机和宿主机在网络层面上处于同一级别。例如,我们公司的服务器位于192.168.99.0/24网段,其中一台服务器A的IP地址是192.168.99.66。在这台服务器上,我们使用KVM创建了两台虚拟机A1和A2,并通过桥接网络配置分别分配给它们192.168.99.67和192.168.99.68作为IP地址。
从物理交换机的角度来看,宿主机A和虚拟机A1、A2被视为独立设备,直接连接到交换机。这意味着在网络层面,这三者被视为独立个体。因此,公司内部其他计算机可以直接通过A1或A2的IP地址访问其上的服务,就像访问普通网络节点一样。这样的设置简化了网络管理,提高了资源利用率和服务可访问性。
在创建桥接网络前,建议先查看一下当前的网络信息。
从virbr0桥接设备中移除enp6s18网络接口:
配置桥指向br0:
配置br0:
添加一个网络接口到桥接设备:
成功配置后,通过以下命令查看结果如下:
到这里我们创建的网桥br0就可以使用了,我们创建的虚拟机就可以使用这两个网桥,其中br0就是桥接模式,virbr0就是nat模式。