当 KVM 的网络是桥接且绑定接口为从属接口时,我无法通过网络访问 KVM。以下是我创建绑定接口的方法bond0

sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=802.3ad"
sudo nmcli connection add type ethernet slave-type bond con-name bond0-port1 ifname eno1np0 master bond0
sudo nmcli connection add type ethernet slave-type bond con-name bond0-port2 ifname eno2np1 master bond0

展示内容如下/proc/net/bonding/bond0

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
MII Status: up
MII Polling Interval (ms): 100
Up Delay (ms): 0
Down Delay (ms): 0
Peer Notification Delay (ms): 0

802.3ad info
LACP active: on
LACP rate: slow
Min links: 0
Aggregator selection policy (ad_select): stable
System priority: 65535
System MAC address: xx:xx:xx:xx:xx:01
Active Aggregator Info:
    Aggregator ID: 1
    Number of ports: 2
    Actor Key: 15
    Partner Key: 3
    Partner Mac Address: xx:xx:xx:xx:xx:03

Slave Interface: eno1np0
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:01
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: xx:xx:xx:xx:xx:01
    port key: 15
    port priority: 255
    port number: 1
    port state: 61
details partner lacp pdu:
    system priority: 127
    system mac address: xx:xx:xx:xx:xx:03
    oper key: 3
    port priority: 127
    port number: 1
    port state: 63

Slave Interface: eno2np1
MII Status: up
Speed: 10000 Mbps
Duplex: full
Link Failure Count: 0
Permanent HW addr: xx:xx:xx:xx:xx:02
Slave queue ID: 0
Aggregator ID: 1
Actor Churn State: none
Partner Churn State: none
Actor Churned Count: 0
Partner Churned Count: 0
details actor lacp pdu:
    system priority: 65535
    system mac address: xx:xx:xx:xx:xx:01
    port key: 15
    port priority: 255
    port number: 2
    port state: 61
details partner lacp pdu:
    system priority: 127
    system mac address: xx:xx:xx:xx:xx:03
    oper key: 3
    port priority: 127
    port number: 17
    port state: 63

交换机上的 LAG 上的端口配置如下:

> show lacp interfaces ae2
Aggregated interface: ae2
    LACP state:       Role   Exp   Def  Dist  Col  Syn  Aggr  Timeout  Activity
      xe-0/0/2 FUP    Actor   No    No   Yes  Yes  Yes   Yes     Fast    Active
      xe-0/0/2 FUP  Partner   No    No   Yes  Yes  Yes   Yes     Slow    Active
      xe-1/0/2       Actor    No    No   Yes  Yes  Yes   Yes     Fast    Active
      xe-1/0/2     Partner    No    No   Yes  Yes  Yes   Yes     Slow    Active
    LACP protocol:        Receive State  Transmit State          Mux State
      xe-0/0/2                  Current   Slow periodic Collecting distributing
      xe-1/0/2                  Current   Slow periodic Collecting distributing

以下是我创建桥梁的方法kvbr0

sudo nmcli con add ifname kvbr0 type bridge con-name kvbr0
sudo nmcli con add type bridge-slave ifname bond0 master kvbr0

sudo nmcli con mod kvbr0 ipv4.addresses 10.192.161.200/24
sudo nmcli con mod kvbr0 ipv4.gateway 10.192.161.1
sudo nmcli con mod kvbr0 ipv4.dns "10.250.0.26 10.122.64.26 10.194.0.26"
sudo nmcli con mod kvbr0 ipv4.method manual

以下是我创建虚拟机的方法:

sudo virt-install
--virt-type kvm  --name kvm1 --ram 4096  --vcpus 2  --disk size=20
--os-variant rocky9  --network network=bridged-network  --graphics none
--location /tmp/Rocky-9.4-x86_64-minimal.iso  --check all=off
--initrd-inject /tmp/kvm1.cfg --extra-args="inst.ks=file:/kvm1.cfg console=tty0 console=ttyS0,115200"
--noautoconsole  --autostart  --wait -1

bridged-network由 桥梁 组成kvbr0

我可以 pingbond0kvbr0,但我没有收到 KVM 接口的 ping 响应。以下是 VM 上接口的设置:

2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:5a:01:ed brd ff:ff:ff:ff:ff:ff
    inet 10.192.161.201/24 brd 10.192.161.255 scope global noprefixroute enp1s0
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe5a:1ed/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

如果我在虚拟机上执行tcpdump此操作enp1s0,我会看到它正在获取 ARP 请求:ARP, Request who-has 10.192.161.1 tell 10.192.161.201, length 28但没有回复

当桥接器上的底层接口是常规以太网端口时,我没有遇到任何问题。

主机运行的是 Rocky9.3,虚拟机运行的是 Rocky9.4。两者都运行内核 5.14。

2

  • “mode=active-backup” 对于 LACP 来说真的正确吗?(据我所知,这是一种静态 LAG、非 LACP 模式……)您的交换机是否显示 LACP LAG 详细信息?


    – 


  • 是的,LAG 在交换机上配置为主动/被动。mode=active-backup似乎是 Linux 方面最合适的选择。


    – 


最佳答案
1

我不能 100% 确定这里所有信息是否正确,但我有 80% 的确定:

bond.options "mode=active-backup"

这是一种静态 LAG 模式,可能与需要 LACP 的交换机不兼容。

您需要使用mode=802.3adLACP 绑定。

是的,LAG 在交换机上配置为主动/被动

不是。LACP LAG 始终是“主动/主动”的(具有自动故障转移功能)。

在 LACP 上下文中,该Activity设置定义对等角色,而不是端口角色 – “主动”对等将启动 LACP 协商,而“被动”对等则不会。因此,如果端口在两侧都设置为“被动”,则 LAG 根本不会在该端口上启动(因为两侧都会等待其他人启动 LACP 握手),并且它将仅保留为独立端口。

(换句话说,如果我正确读取了交换机输出,则您可能处于xe-0/0/2非操作状态,因为它设置为“主动”并永远尝试协商 LACP – 服务器没有响应,因为其绑定不在 LACP 模式 – 而由于xe-1/0/2是“被动”的,则作为独立端口运行,只是等待服务器首先说 LACP。)

LAG 的所有端口都应设置为相同模式。

5

  • 设置mode=802.3ad没有帮助。我会检查交换机设置。考虑到我可以 ping 通网桥但不能 ping 通网桥上的虚拟机,这是否意味着交换机设置不会导致我看到的问题?虚拟机正在接收 ARP 请求,但没有回复。


    – 


  • /proc/net/bonding/bond0我猜是它通过不同的端口回复了…在 Linux 上设置绑定模式后,交换机的输出是否有任何变化?你能检查服务器上的内容并将其添加到你的帖子中吗?


    – 


  • 谢谢,我更新了问题。虚拟机只有enp1s0lo。我应该看到 的回复吗enp1s0


    – 

  • 我的意思是,由于与交换机的模式不匹配,服务器的 bond0 通过不同的端口发送帧,因此帧丢失了。不过,现在 802.3ad(LACP) 处于活动状态,这种情况应该不再存在。


    – 

  • 另外…我仔细查看了您在帖子中引用的 ARP 请求 – 那不是虚拟机收到的 ARP 请求;而是虚拟机发送的 ARP 请求。您是否可以在 tcpdump(最好使用-e)中看到任何实际上从外部进入虚拟机的流量?


    –