桥接还是 NAT?KVM 网络配置的最优解

在KVM虚拟化里,网络设置对于虚拟机的连接速度和性能至关重要。libvirt这个工具通过简化网络管理,提供了两种主要的网络类型:桥接网络和NAT网络。这两种方式适合不同的使用场景,比如桥接网络更适合正式的生产环境,而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之间的关系。

复制
[root@kylin-node3 ~]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254002285d4 yes virbr0-nic vnet01.2.3.4.

现在有一个叫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地址访问其上的服务,就像访问普通网络节点一样。这样的设置简化了网络管理,提高了资源利用率和服务可访问性。

配置桥接网络

在创建桥接网络前,建议先查看一下当前的网络信息。

复制
[root@kylin-node1 network-scripts]# brctl show bridge name bridge id STP enabled interfaces virbr0 8000.5254002285d4 yes enp6s18 virbr0-nic1.2.3.4.

从virbr0桥接设备中移除enp6s18网络接口:

复制
brctl delif virbr0 enp6s181.

配置桥指向br0:

复制
[root@kylin-node1 network-scripts]# pwd /etc/sysconfig/network-scripts [root@kylin-node1 network-scripts]# cat ifcfg-enp6s18 DEVICE=enp6s18 BOOTRPOTO=none ONBOOT=yes BRIDGE="br0"1.2.3.4.5.6.7.

配置br0:

复制
[root@kylin-node1 network-scripts]# cat ifcfg-br0 DEVICE="br0" ONBOOT="yes" TYPE="Bridge" BOOTPROTO="static" IPADDR=192.168.31.231 NETMASK=255.255.255.0 GATEWAY=192.168.31.1 IPV6INIT="yes" IPV6_AUTOCONF="yes" STP="on" DELAY="0"1.2.3.4.5.6.7.8.9.10.11.12.

添加一个网络接口到桥接设备:

复制
brctl addlif br0 enp6s181.

成功配置后,通过以下命令查看结果如下:

复制
[root@kylin-node2 ~]# brctl show bridge name bridge id STP enabled interfaces br0 8000.bc2411a871b4 no enp6s18 virbr0 8000.5254002285d4 yes virbr0-nic1.2.3.4.

到这里我们创建的网桥br0就可以使用了,我们创建的虚拟机就可以使用这两个网桥,其中br0就是桥接模式,virbr0就是nat模式。

THE END