KVM网络类型介绍

KVM 包含四种网络类型:

  1. 隔离模式:虚拟机之间组建网络,该模式无法与宿主机通信,无法与其他网络通信,相当于虚拟机只是连接到一台交换机上。
  2. 路由模式:相当于虚拟机连接到一台路由器上,由路由器(物理网卡)统一转发,但不会改变源地址。
  3. NAT 模式:在路由模式中,虚拟机可以访问其他主机,但其他主机的报文无法达到虚拟机,而 NAT 模式则将源地址转换为路由器(物理网卡)地址,这样其他主机也知道报文来自那个主机,在 Docker 环境中经常被使用。
  4. 桥接模式:在宿主机中创建一张虚拟网卡作为宿主机的网卡,而物理网卡则作为交换机。

隔离模式

在隔离模式下,虚拟机之间可以相互通信,但不能与宿主机或外部网络通信。

Linux 在虚拟机中的网卡都包含前半段和后半段,前半段在虚拟机上,后半段在宿主机上。 eth0 在 Guest1 虚拟机上的网卡,对应的后半段为 vnet0,在 Guest1 上所有发往 eth0 的数据就直接发往 vnet0 了,也可以将 vnet0 看作是一张网卡。

Guest1 和 Guest2 如何通信
在宿主机中创建一个虚拟交换机,让 vnet0 和 vnet1 分别为虚拟交换机的一个接口,交换机也可以叫做 bridge,只要两个虚拟网卡的前半段 IP 地址在同一个网段内,就可以相互通信,这就是隔离模式。

路由模式及 NAT 模式

路由模式将虚拟机的网络报文通过路由器转发,不会改变源地址。NAT 模式则通过 NAT 网关将源地址转换为物理网卡地址,实现虚拟机与外部网络通信。

在该模式下,虚拟机可以通过虚拟路由器(virbr0)连接到外部网络。在 NAT 模式下,虚拟机发送的报文通过 NAT 网关转发,外部网络无法直接访问虚拟机,但虚拟机可以访问外部网络。

桥接模式

在桥接模式下,宿主机会虚拟出一张虚拟网卡作为宿主机本身的通信网卡,而宿主机的物理网卡则成为桥设备(交换机)。所以虚拟机相当于在宿主机所在局域网内的一个独立的主机,它的行为和宿主机是同等地位的,没有依存关系。

NAT 网络

NAT 网络是虚拟机默认的网络,安装好 KVM 后就会有一个网卡。

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255
    ether 52:54:00:72:d3:68 txqueuelen 1000 (Ethernet)
    RX packets 147745 bytes 8418411 (8.0 MiB)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 246399 bytes 3673149 (350.2 MiB)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

默认使用的地址是: 192.168.122.0 网段,该 virbr0 IP 地址也是使用 NAT 网络虚拟机的网关,虚拟机上网是通过防火墙配置 NAT 转换规则实现的。

virbr0 是一个桥接器,接收所有到网络 192.168.122.* 的内容。从下面命令可以验证:

brctl show
bridge name bridge id       STP enabled  interfaces
virbr0       8000.525400e6456c  yes          virbr0-nic

同时,虚拟机支持模块会修改 iptables 规则,通过命令可以查看:

iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 16924 packets, 2759K bytes)
pkts bytes target  prot opt in  out source  destination
Chain POSTROUTING (policy ACCEPT 2009 packets, 125K bytes)
pkts bytes target  prot opt in  out source  destination
421 31847 MASQUERADE  all -- * * 192.168.122.0/24 !192.168.122.0/24  ---->这条是关键,它配置了 NAT 功能。
Chain OUTPUT (policy ACCEPT 2011 packets, 125K bytes)
pkts bytes target  prot opt in  out source  destination
iptables -t filter -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target  prot opt in  out source  destination
1 74 ACCEPT  udp  -- virbr0 * 0.0.0.0/0  udp dpt:53

创建步骤

virsh net-define /usr/share/libvirt/networks/default.xml

此命令定义一个虚拟网络,default.xml 的内容:

<network>
  <name>default</name>
  <bridge name='virbr0'/>
  <forward/>
  <ip address='192.168.122.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.122.2' end='192.168.122.254'/>
    </dhcp>
  </ip>
</network>

也可以修改 xml,创建自己的虚拟网络。

标记为自动启动

virsh net-autostart default
Network default marked as autostarted

启动网络

virsh net-start default
Network default started

网络启动后可以用命令 brctl show 查看和验证

修改 /etc/sysctl.conf 中参数,允许 IP 转发:

net.ipv4.ip_forward=1

桥接网络

桥接网络允许虚拟机像物理主机一样接入物理网络,实现虚拟机与物理网络中的其他设备直接通信。下面是配置桥接网络的具体步骤,以CentOS操作系统为例。

  1. 给物理网卡设置 IP 信息
    使用 nmcli 命令配置物理网卡的 IP 地址、网关和 DNS 服务器。

    nmcli connection add con-name eno1 ifname eno1 ipv4.addresses 192.168.1.200/24 ipv4.method manual ipv4.gateway 192.168.1.1 ipv4.dns 114.114.114.114 type 802-3-ethernet
  2. 创建一个桥接网卡
    使用 nmcli 命令创建桥接网卡,并设置桥接网卡的 IP 地址、网关和 DNS 服务器。

    nmcli connection add con-name br0 ifname br0 type bridge ipv4.method manual ipv4.addresses 192.168.1.200/24 ipv4.gateway 192.168.1.1 ipv4.dns 114.114.114.114 autoconnect yes
  3. 绑定物理网卡
    使用 nmcli 命令将物理网卡绑定到桥接网卡上。

    nmcli connection add type bridge-slave ifname eno1 master br0
  4. 重启生效
    关闭并重新启动物理网卡和桥接网卡以应用配置。

    nmcli connection down eno1
    nmcli connection down br0
    nmcli connection up br0

详细解释

  1. 给物理网卡设置 IP 信息
    首先,需要为物理网卡 eno1 配置 IP 地址、网关和 DNS 服务器。这里使用 nmcli connection add 命令,其中:

    • con-name 指定连接名称,这里为 eno1
    • ifname 指定接口名称,这里也是 eno1
    • ipv4.addresses 设置 IP 地址和子网掩码,这里为 192.168.1.200/24
    • ipv4.method 设置为手动配置。
    • ipv4.gateway 设置网关地址,这里为 192.168.1.1
    • ipv4.dns 设置 DNS 服务器地址,这里为 114.114.114.114
    • type 指定网络类型,这里为以太网(802-3-ethernet)。
  2. 创建一个桥接网卡
    然后,创建一个名为 br0 的桥接网卡。使用 nmcli connection add 命令,其中:

    • con-name 指定连接名称,这里为 br0
    • ifname 指定接口名称,这里也是 br0
    • type 设置为 bridge,表示这是一个桥接网卡。
    • ipv4.method 设置为手动配置。
    • ipv4.addresses 设置 IP 地址和子网掩码,这里为 192.168.1.200/24
    • ipv4.gateway 设置网关地址,这里为 192.168.1.1
    • ipv4.dns 设置 DNS 服务器地址,这里为 114.114.114.114
    • autoconnect 设置为 yes,表示自动连接。
  3. 绑定物理网卡
    将物理网卡 eno1 绑定到桥接网卡 br0 上,使物理网卡成为桥接网卡的一部分。使用 nmcli connection add type bridge-slave 命令,其中:

    • ifname 指定物理网卡接口名称,这里为 eno1
    • master 指定桥接网卡名称,这里为 br0
  4. 重启生效
    为了使配置生效,需要关闭并重新启动物理网卡和桥接网卡。使用 nmcli connection downnmcli connection up 命令,依次关闭 eno1br0,然后重新启动 br0

本文由mdnice多平台发布


逼格高的汤圆
7 声望2 粉丝