桥接还是 NAT?KVM网络配置的最优解
title: 结尾推荐文章
在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
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地址访问其上的服务,就像访问普通网络节点一样。这样的设置简化了网络管理,提高了资源利用率和服务可访问性。
配置桥接网络
- 在创建桥接网络前,建议先查看一下当前的网络信息。
[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
模式。