title: 结尾推荐文章

在KVM虚拟化里,网络设置对于虚拟机的连接速度和性能至关重要。libvirt这个工具通过简化网络管理,提供了两种主要的网络类型:桥接网络和NAT网络。这两种方式适合不同的使用场景,比如桥接网络更适合正式的生产环境,而NAT网络则更适合开发或测试环境。

NAT网络

装了KVM之后,它会自动设置一个默认的NAT网络。这样,你的虚拟机就能通过这个NAT网络上网了。这个NAT网络其实就是一个虚拟的交换机加上一些网络规则组成的。听起来可能有点复杂,我们可以通过一张图来更清楚地理解。

KVMNAT网络中,虚拟机通过虚拟交换机与宿主机相连。通过iptablesSNAT规则,将虚拟机的IP地址转换为宿主机的IP地址后,虚拟机就能利用宿主机的物理网卡访问外部网络了。由于只设置了SNAT而没有设置DNAT,因此虚拟机可以访问外部网络,但外部网络不能直接访问虚拟机。若要让外部网络能够访问虚拟机的服务,则需手动配置DNAT。"外部网络"在这里指的是局域网(如办公环境内的网络),而非互联网。

enp6s18是电脑的真实网卡,而virbr0KVM为默认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命令可以帮助你更清楚地看到virbr0vnet0之间的关系。

[root@kylin-node3 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
virbr0          8000.5254002285d4       yes             virbr0-nic
                                                        vnet0

现在有一个叫virbr0的虚拟交换机。它有两个接口,一个是virbr0-nic,另一个是vnet0virbr0-nic这个接口是用来连接宿主机上的物理网卡(eth网卡)的,而vnet0这个接口是用来连接ubuntu-cloud虚拟机里的虚拟网卡(eth网卡)的。这样应该能想象出它们是怎么连接起来的了吧?

了解了上面的知识,我们可以把nat网络的模型图细化一下,理解成下面的样子:

桥接网络

在我们的生产环境中,我选择了桥接网络模型。这种模式让虚拟机和宿主机在网络层面上处于同一级别。例如,我们公司的服务器位于192.168.99.0/24网段,其中一台服务器A的IP地址是192.168.99.66。在这台服务器上,我们使用KVM创建了两台虚拟机A1和A2,并通过桥接网络配置分别分配给它们192.168.99.67192.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-nic                                            
  • virbr0桥接设备中移除enp6s18网络接口
brctl delif virbr0 enp6s18
  • 配置桥指向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"
  • 配置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"
  • 添加一个网络接口到桥接设备
brctl addlif br0 enp6s18
  • 成功配置后,通过以下命令查看结果如下:
[root@kylin-node2 ~]# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.bc2411a871b4       no              enp6s18
virbr0          8000.5254002285d4       yes             virbr0-nic

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

推荐文章