跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 虚拟化指南 / 使用 libvirt 管理虚拟机 / 管理网络
适用范围 SUSE Linux Enterprise Server 15 SP2

13 管理网络

本章介绍 VM 主机服务器的常用网络配置,包括 VM 主机服务器和 libvirt 本机支持的配置。这些配置对 SUSE Linux Enterprise Server 支持的所有超级管理程序(例如 KVM 或 Xen)均有效。

有两个常用网络配置可为 VM Guest 提供网络连接:

  • 充当第 2 层交换机的网桥

  • libvirt 管理且支持第 3 层转发的虚拟网络

13.1 网桥

网桥配置为 VM Guest 提供第 2 层交换机,可以基于与端口关联的 MAC 地址在网桥上的端口之间交换第 2 层以太网包。这样 VM Guest 便可通过第 2 层连接访问 VM 主机服务器的网络。此配置类似于将 VM Guest 的虚拟以太网网线连接到与主机以及主机上运行的其他 VM Guest 共享的集线器。该配置通常称为共享物理设备

SUSE Linux Enterprise Server 配置为 KVM 或 Xen 超级管理程序时,网桥配置是它的默认配置。如果您只想将 VM Guest 连接到 VM 主机服务器的 LAN,则此为首选配置。

13.1.1 使用 YaST 管理网桥

本节包含使用 YaST 添加或去除网桥的过程。

13.1.1.1 添加网桥

要在 VM 主机服务器上添加网桥,请执行以下步骤:

  1. 启动 YaST › 系统 › 网络设置

  2. 激活概述选项卡并单击添加

  3. 设备类型列表中选择网桥,然后在配置名称项中输入网桥设备接口名称。按下一步按钮继续。

  4. 地址选项卡中指定网络细节,例如 DHCP/静态 IP 地址、子网掩码或主机名。

    仅当您也将设备指派到与 DHCP 服务器连接的网桥时,动态地址才有作用。

    如果您打算创建不与实际以太网设备连接的虚拟网桥,请使用静态指派的 IP 地址。在这种情况下,比较好的做法是使用私用 IP 地址范围(例如 192.168.0.0/16172.16.0.0/1210.0.0.0/8)内的地址。

    要创建仅在不同 Guest 之间充当连接点,而不连接到主机系统的网桥,请将 IP 地址设置为 0.0.0.0,将子网掩码设置为 255.255.255.255。网络脚本会将此特殊地址作为未设置的 IP 地址来处理。

  5. 激活桥接的设备选项卡,然后激活您要包含在网桥中的网络设备。

  6. 单击下一步返回到概述选项卡,然后单击确定以确认。现在,新网桥应在 VM 主机服务器上处于活动状态。

13.1.1.2 删除网桥

要删除现有网桥,请执行以下步骤:

  1. 启动 YaST › 系统 › 网络设置

  2. 概述选项卡上的列表中选择您要删除的网桥设备。

  3. 单击删除以删除该网桥,然后单击确定以确认。

13.1.2 通过命令行管理网桥

本节包含使用命令行添加或去除网桥的过程。

13.1.2.1 添加网桥

要在 VM 主机服务器上添加新网桥设备,请执行以下步骤:

  1. 在要创建新网桥的 VM 主机服务器上以 root 身份登录。

  2. 为新网桥选择一个名称(在本示例中为 virbr_test),然后运行以下命令

    root # ip link add name VIRBR_TEST type bridge
  3. 检查是否已在 VM 主机服务器上创建了网桥:

    root # bridge vlan
    [...]
    virbr_test  1 PVID Egress Untagged

    virbr_test 存在,但不与任何物理网络接口相关联。

  4. 启动该网桥,并在其中添加一个网络接口:

    root # ip link set virbr_test up
    root # ip link set eth1 master virbr_test
    重要
    重要:网络接口必须未被使用

    只能指派尚未被其他网桥使用的网络接口。

  5. (可选)启用 STP(请参见生成树协议

    root # bridge link set dev virbr_test cost 4

13.1.2.2 删除网桥

要通过命令行删除 VM 主机服务器上的现有网桥设备,请执行以下步骤:

  1. 在要从中删除现有网桥的 VM 主机服务器上以 root 身份登录。

  2. 列出现有网桥,以识别要去除的网桥的名称:

    root # bridge vlan
    [...]
    virbr_test  1 PVID Egress Untagged
  3. 删除网桥:

    root # ip link delete dev virbr_test

13.1.3 使用 VLAN 接口

有时需要在两台 VM 主机服务器之间或者 VM Guest 系统之间创建私用连接。例如,要将 VM Guest 迁移到不同网段中的主机,或者创建只有 VM Guest 系统能够连接到的私用网桥(即使这些 VM Guest 在不同的 VM 主机服务器系统上运行)。构建此类连接的简单方法是设置 VLAN 网络。

VLAN 接口通常在 VM 主机服务器上设置。它们可以将不同的 VM 主机服务器系统互连,或者可以设置为其他仅限虚拟连接的网桥的物理接口。甚至可以创建一个使用 VLAN 作为物理接口(该接口在 VM 主机服务器中没有 IP 地址)的网桥。这样,Guest 系统就无法通过此网络访问主机。

运行 YaST 模块系统 › 网络设置。执行以下过程设置 VLAN 设备:

过程 13.1︰ 使用 YaST 设置 VLAN 接口
  1. 单击添加以创建新网络接口。

  2. 硬件对话框中,选择设备类型 VLAN

  3. 配置名称的值更改为 VLAN 的 ID。请注意,VLAN ID 1 通常用于管理目的。

  4. 单击“下一步”

  5. 将 VLAN 设备应连接到的借口选择为下面的 VLAN 的实际接口。如果所需的接口未显示在列表中,请先在不指定 IP 地址的情况下设置此接口。

  6. 选择将 IP 地址指派到 VLAN 设备的所需方法。

  7. 单击下一步完成配置。

还可将 VLAN 接口用作网桥的物理接口。这样便可以连接多个仅限 VM 主机服务器的网络,以及实时迁移与此类网络连接的 VM Guest 系统。

YaST 并非始终允许不设置 IP 地址。但有时可能需要这种功能,尤其是应该连接仅限 VM 主机服务器的网络时。在这种情况下,请使用特殊地址 0.0.0.0 和网络掩码 255.255.255.255。系统脚本会将此地址当作未设置 IP 地址来处理。

13.2 虚拟网络

libvirt 管理的虚拟网络类似于桥接的网络,但通常不与 VM 主机服务器建立第 2 层连接。与 VM 主机服务器物理网络的连接通过第 3 层转发来实现,与第 2 层桥接网络相比,第 3 层转发在 VM 主机服务器上引入了额外的包处理。虚拟网络还为 VM Guest 提供 DHCP 和 DNS 服务。有关 libvirt 虚拟网络的详细信息,请参见 https://libvirt.org/formatnetwork.html 上的《Network XML format》(网络 XML 格式)文档。

SUSE Linux Enterprise Server 上的标准 libvirt 安装已经随附了名为 default 的预定义虚拟网络,该虚拟网络为网络提供 DHCP 和 DNS 服务,并且能够通过网络地址转换 (NAT) 转发模式连接到 VM 主机服务器的物理网络。尽管已预定义了 default 虚拟网络,但它必须由管理员显式启用。有关 libvirt 支持的转发模式的详细信息,请参见 https://libvirt.org/formatnetwork.html#elementsConnect 上《Network XML format》(网络 XML 格式)文档中的“Connectivity”(连接)一节。

libvirt 管理的虚拟网络可用于满足各种用例,但通常是在进行无线连接或动态/零星网络连接的 VM 主机服务器(例如便携式计算机)上使用。虚拟网络也适用于 VM 主机服务器网络的 IP 地址有限的情形,可用来在虚拟网络与 VM 主机服务器的网络之间转发包。不过,大多数服务器用例更适合网桥配置,其中的 VM Guest 会连接到 VM 主机服务器的 LAN。

警告
警告:启用转发模式

libvirt 虚拟网络中启用转发模式会通过将 /proc/sys/net/ipv4/ip_forward/proc/sys/net/ipv6/conf/all/forwarding 设置为 1 在 VM 主机服务器中启用转发,而这本质上是将 VM 主机服务器转变成路由器。重启动 VM 主机服务器的网络可能会重设置值并禁用转发。要避免这种行为,请通过编辑 /etc/sysctl.conf 文件并添加以下设置,在 VM 主机服务器中显式启用转发:

net.ipv4.ip_forward = 1
net.ipv6.conf.all.forwarding = 1

13.2.1 使用虚拟机管理器管理虚拟网络

您可以使用虚拟机管理器定义、配置和操作虚拟网络。

13.2.1.1 定义虚拟网络

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。右侧会显示选定虚拟网络的细节。

    连接细节
    图 13.1︰ 连接细节
  3. 要添加新虚拟网络,请单击添加

  4. 指定新虚拟网络的名称,然后单击前进

    创建虚拟网络
    图 13.2︰ 创建虚拟网络
  5. 要指定 IPv4 网络地址空间定义,请激活相关选项,并在网络文本项中键入定义。

    创建虚拟网络
    图 13.3︰ 创建虚拟网络
  6. libvirt 可为虚拟网络提供 DHCP 服务器。如果需要此服务器,请激活启用 DHCPv4,然后键入可指派地址的开始和结束 IP 地址范围。

  7. 要为新虚拟网络启用静态路由,请激活相关选项,并键入网络地址和网关地址。

  8. 单击前进继续。

  9. 要指定 IPv6 相关的选项(网络地址空间、DHCPv6 服务器或静态路由),请激活启用 IPv6 网络地址空间定义,然后激活相关选项并填写相关的框。

  10. 单击前进继续。

  11. 选择您是要创建隔离的虚拟网络还是转发的虚拟网络。

    创建虚拟网络
    图 13.4︰ 创建虚拟网络

    如果要创建转发的网络,请指定要将请求转发到的网络接口,以及以下其中一种转发模式:NAT(网络地址转换)模式会重新映射虚拟网络地址空间并允许共享单个 IP 地址,而路由模式则会将包从虚拟网络转发到 VM 主机服务器的物理网络,但不进行转换。

  12. 如果您之前未指定 IPv6 网络地址空间定义,可以在虚拟机之间启用 IPv6 内部路由。

  13. (可选) (可选)更改 DNS 域名。

  14. 单击完成以创建新虚拟网络。VM 主机服务器上即会有一个新的虚拟网桥 virbrX,该网桥对应于新建的虚拟网络。您可以使用 bridge link 进行检查。libvirt 会自动添加 iptables 规则来允许传入/传出挂接到新 virbrX 设备的 Guest 的流量。

13.2.1.2 启动虚拟网络

要启动某个暂时停止的虚拟网络,请执行以下步骤:

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。

  3. 要启动虚拟网络,请单击启动

13.2.1.3 停止虚拟网络

要停止活动的虚拟网络,请执行以下步骤:

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。

  3. 选择要停止的虚拟网络,然后单击停止

13.2.1.4 删除虚拟网络

要删除 VM 主机服务器中的虚拟网络,请执行以下步骤:

  1. 启动虚拟机管理器。在可用连接列表中,右键单击您需要为其配置虚拟网络的连接名称,然后选择细节

  2. 连接细节窗口中,单击虚拟网络选项卡。您会看到可用于当前连接的所有虚拟网络的列表。

  3. 选择要删除的虚拟网络,然后单击删除

13.2.1.5 使用 nsswitch 获取 NAT 网络的 IP 地址(在 KVM 中)

  • 在 VM 主机服务器上,安装用来为 libvirt 提供 NSS 支持的 libvirt-nss:

    tux > sudo zypper in libvirt-nss
  • libvirt 添加到 /etc/nsswitch.conf

    ...
    hosts:  files libvirt mdns_minimal [NOTFOUND=return] dns
    ...
  • 如果 NSCD 正在运行,请将其重启动:

    tux > sudo systemctl restart nscd

现在,您可以从主机按名称访问 Guest 系统了。

NSS 模块的功能有限。它会读取 /var/lib/libvirt/dnsmasq/*.status 文件,以在描述 dnsmasq 所提供的每个租约的 JSON 记录中查找主机名和对应的 IP 地址。只能使用受 dnsmasq 支持且由 libvirt 管理的桥接网络在这些 VM 主机服务器上执行主机名转换。

有关更多信息,请参见http://wiki.libvirt.org/page/NSS_module

13.2.2 使用 virsh 管理虚拟网络

您可以使用 virsh 命令行工具来管理 libvirt 提供的虚拟网络。要查看所有与网络相关的 virsh 命令,请运行以下命令

tux > sudo virsh help network
Networking (help keyword 'network'):
 net-autostart                  autostart a network
        net-create                     create a network from an XML file
        net-define                     define (but don't start) a network from an XML file
        net-destroy                    destroy (stop) a network
        net-dumpxml                    network information in XML
        net-edit                       edit XML configuration for a network
        net-event                      Network Events
        net-info                       network information
        net-list                       list networks
        net-name                       convert a network UUID to network name
        net-start                      start a (previously defined) inactive network
        net-undefine                   undefine an inactive network
        net-update                     update parts of an existing network's configuration
 net-uuid                       convert a network name to network UUID

要查看特定 virsh 命令的简要帮助信息,请运行 virsh help VIRSH_COMMAND

tux > sudo virsh help net-create
  NAME
    net-create - create a network from an XML file

  SYNOPSIS
    net-create <file>

  DESCRIPTION
    Create a network.

  OPTIONS
    [--file] <string>  file containing an XML network description

13.2.2.1 创建网络

要创建新的运行中虚拟网络,请运行以下命令

tux > sudo virsh net-create VNET_DEFINITION.xml

VNET_DEFINITION.xml XML 文件包含 libvirt 接受的虚拟网络的定义。

要定义新虚拟网络但不激活它,请运行以下命令

tux > sudo virsh net-define VNET_DEFINITION.xml

以下示例说明了不同类型的虚拟网络的定义。

例 13.1︰ 基于 NAT 的网络

下面的配置可在 VM 主机服务器上无法使用传出连接时实现 VM Guest 传出连接。当没有 VM 主机服务器网络时,此配置可让 Guest 互相直接通讯。

<network>
<name>vnet_nated</name>1
<bridge name="virbr1"/>2
 <forward mode="nat"/>3
 <ip address="192.168.122.1" netmask="255.255.255.0">4
  <dhcp>
   <range start="192.168.122.2" end="192.168.122.254"/>5
   <host mac="52:54:00:c7:92:da" name="host1.testing.com" \
    ip="192.168.1.23.101"/>6
   <host mac="52:54:00:c7:92:db" name="host2.testing.com" \
    ip="192.168.1.23.102"/>
   <host mac="52:54:00:c7:92:dc" name="host3.testing.com" \
    ip="192.168.1.23.103"/>
  </dhcp>
 </ip>
</network>

1

新虚拟网络的名称。

2

用于构造虚拟网络的网桥设备的名称。定义 <forward> 模式为“nat”或“route”的新网络(或者不包含 <forward> 元素的隔离网络)时,libvirt 将自动为网桥设备生成唯一的名称(如果未指定名称)。

3

包含 <forward> 元素表示该虚拟网络将连接到物理 LAN。mode 属性指定转发方法。最常用的模式为“nat”(默认模式,表示网络地址转换)、“route”(直接转发到物理网络,不执行地址转换)和“bridge”(在 libvirt 外部配置的网桥)。如果不指定 <forward> 元素,虚拟网络将与其他网络相隔离。有关转发模式的完整列表,请参见 http://libvirt.org/formatnetwork.html#elementsConnect

4

网桥的 IP 地址和网络掩码。

5

为虚拟网络启用 DHCP 服务器,并提供从指定的 startend 属性范围内的 IP 地址。

6

可选的 <host> 元素指定内置 DHCP 服务器要为其分配名称和预定义 IP 地址的主机。任何 IPv4 host 元素都必须指定以下设置:要为其指派给定名称的主机的 MAC 地址、要指派到该主机的 IP,以及 DHCP 服务器要为该主机分配的名称。IPv6 host 元素与 IPv4 略有不同,它没有 mac 属性,因为 MAC 地址在 IPv6 中没有明确的含义。IPv6 中使用 name 属性来标识要为其指派 IPv6 地址的主机。对于 DHCPv6,name 是由客户端发送到服务器的客户端主机的纯文本名称。请注意,您也可以使用这种指派特定 IP 地址的方法来代替 IPv4 中的 mac 属性。

例 13.2︰ 路由网络

下面的配置会在不应用任何 NAT 的情况下将流量从虚拟网络路由到 LAN。必须在 VM 主机服务器网络上的路由器的路由表中预定义 IP 地址范围。

<network>
 <name>vnet_routed</name>
 <bridge name="virbr1"/>
 <forward mode="route" dev="eth1"/>1
 <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>

1

Guest 流量只能通过 VM 主机服务器上的 eth1 网络设备传出。

例 13.3︰ 隔离网络

此配置提供完全隔离的专用网络。Guest 可以相互通讯以及与 VM 主机服务器通讯,但无法访问 LAN 上的任何其他计算机,因为 XML 说明中没有 <forward> 元素。

<network>
 <name>vnet_isolated</name>
 <bridge name="virbr3"/>
 <ip address="192.168.152.1" netmask="255.255.255.0">
  <dhcp>
   <range start="192.168.152.2" end="192.168.152.254"/>
  </dhcp>
 </ip>
 </network>
例 13.4︰ 使用 VM 主机服务器上的现有网桥

此配置说明如何使用 VM 主机服务器的现有网桥 br0。VM Guest 直接连接到物理网络。其 IP 地址全部都在物理网络的子网中,并且传入和传出连接不存在任何限制。

<network>
        <name>host-bridge</name>
        <forward mode="bridge"/>
        <bridge name="br0"/>
</network>

13.2.2.2 列出网络

要列出 libvirt 可用的所有虚拟网络,请运行以下命令:

tux > sudo virsh net-list --all

 Name                 State      Autostart     Persistent
----------------------------------------------------------
 crowbar              active     yes           yes
 vnet_nated           active     yes           yes
 vnet_routed          active     yes           yes
 vnet_isolated        inactive   yes           yes

要列出可用域,请运行以下命令:

tux > sudo virsh list
 Id    Name                           State
----------------------------------------------------
 1     nated_sles12sp3                running
 ...

要获取运行中域的接口列表,请运行 domifaddr DOMAIN,或选择性地指定接口,以在输出中仅列出此接口。默认情况下,会额外输出接口的 IP 和 MAC 地址:

tux > sudo virsh domifaddr nated_sles12sp3 --interface vnet0 --source lease
 Name       MAC address          Protocol     Address
-------------------------------------------------------------------------------
 vnet0      52:54:00:9e:0d:2b    ipv6         fd00:dead:beef:55::140/64
 -          -                    ipv4         192.168.100.168/24

要列显与指定域关联的所有虚拟接口的简要信息,请运行以下命令:

tux > sudo virsh domiflist nated_sles12sp3
Interface  Type       Source       Model       MAC
---------------------------------------------------------
vnet0      network    vnet_nated   virtio      52:54:00:9e:0d:2b

13.2.2.3 获取有关网络的细节

要获取有关网络的详细信息,请运行以下命令:

tux > sudo virsh net-info vnet_routed
Name:           vnet_routed
UUID:           756b48ff-d0c6-4c0a-804c-86c4c832a498
Active:         yes
Persistent:     yes
Autostart:      yes
Bridge:         virbr5

13.2.2.4 启动网络

要启动某个已定义的非活动网络,请使用以下命令查找其名称(或唯一标识符,即 UUID):

tux > sudo virsh net-list --inactive
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vnet_isolated        inactive   yes           yes

然后运行:

tux > sudo virsh net-start vnet_isolated
Network vnet_isolated started

13.2.2.5 停止网络

要停止某个活动的网络,请使用以下命令查找其名称(或唯一标识符,即 UUID):

tux > sudo virsh net-list --inactive
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 vnet_isolated        active     yes           yes

然后运行:

tux > sudo virsh net-destroy vnet_isolated
Network vnet_isolated destroyed

13.2.2.6 去除网络

要从 VM 主机服务器中永久去除某个非活动网络的定义,请运行以下命令:

tux > sudo virsh net-undefine vnet_isolated
Network vnet_isolated has been undefined