使用 LACP 的 2 个交换机之间的服务器链路绑定,交换机间 LAG 丢弃备用 ping?

网络工程 arp IEEE-802.1ax
2021-07-23 04:14:36

我有一台带有 4 个 1Gb NIC、2 个板载和 2 个 PCI 的 Debian Linux 服务器。所有 NIC 都配置为单模式 4 LACP 绑定接口:bond0 我有两台交换机:Cisco SG300-28 和 Cisco SG300-10,分别称为 A 和 B。
两台交换机通过 2 个交换机端口上的 LACP LAG 相互连接,两条链路都列为活动链路。

两台交换机上的所有端口似乎都配置为中继端口。这似乎是默认设置,因为我在测试之前进行了出厂重置。那会有什么不同吗?在此阶段只有一个默认 VLAN。

服务器将 2 个 NIC 连接到交换机 A,将 2 个 NIC 连接到交换机 B(一个板载 NIC 和一个 PCI)。Linux 绑定驱动程序在这方面很聪明,因为它Aggregator ID为每个接口计算出一个并通过交换机将它们配对,因此只有到一个交换机的链接是活动的,即使所有 4 个都可能已启动。

我有一个工作站,我正在测试它,当前连接到交换机 A。


                   ----------------
        ===========| Server bond0 |===========
        ||         ----------------         ||
        ||                                  ||
        ||                                  ||
  ----------------                  ----------------
  |   Switch A   |=======LAG========|   Switch B   |
  ----------------                  ----------------
         |
         |
         |
    workstation

最初,服务器报告它正在使用与交换机 A 关联的聚合器 ID。我从工作站收到了稳定的 ping。

我断开了从服务器到交换机 A 的 2 根电缆,Linux 将活动的聚合器切换到连接到交换机 B 的 NIC,ping 继续并保持稳定。此时的活动路径是workstation -> Switch A -> inter-switch LAG -> Switch B -> Server

当我将电缆从服务器重新连接到交换机 A 时,Linux 会保留聚合 ID,因为它仍在使用交换机 B。

来自工作站的 Ping 开始被丢弃,如下所示:

在此处输入图片说明

一旦我再次断开交换机 A 的连接,ping 就会恢复稳定。

因此,当 ping 从交换机 A 上的端口发起到服务器交换机 B 时,它会失败,但仅当服务器与交换机 A 的链接已启动但在操作系统中未处于活动状态时才会失败。
这是可重复的。

我已经tcpdump在服务器和工作站上运行了根据上面的跟踪,我可以看到从工作站传输的所有 ping,但只有其中一些得到答复。tcpdump在服务器上运行 a ,看起来缺少的 ping 并没有那么远。所以他们被丢弃在切换的某个地方。

如果我将此损坏的设置反转到另一台交换机,将工作站插入交换机 B,那么流量路径是......workstation -> Swtich B -> inter-switch LAG -> Switch A -> Server那么它工作正常。

我确实认为这可能是端口被阻塞的某种 STP 问题,但 ping 丢弃模式过于频繁,几乎所有其他 ping 对都被丢弃。检查交换机上的日志,看起来任一交换机上都没有阻止任何端口。

我还尝试用单连接、非 LAG/LACP 替换交换机间 LAG。
我已经确认 LACP 设置在所有方面都匹配。

作为全职系统管理员和网络兼职/业余爱好者,对我而言,这表明交换机之间的配置存在某种差异。但我不知道要检查哪些部分的配置差异。他们运行不同的固件版本,并注意这些是小型企业 SG300 系列,因此没有运行完整的 iOS,但确实具有看起来功能合理的 CLI。

我有限的网络知识告诉我这有点像 ARP 问题。服务器应该只向活动对/交换机提供 MAC 地址。丢弃的 ping 可能试图路由到非活动交换机/对。
但是我怎么能用这些开关来证明呢?
不过,我本来希望有更长的成功和失败的 ping 运行。

我的下一步是执行一些 tcpdump 以查看 ARP 和 LACPDU,以查看是否存在某种“风暴”导致流量每隔几秒钟在交换机之间切换。尽管从 Linux 的角度来看,Aggregator ID与失败的 ping 相对应的活动没有变化

有没有其他人对这里的其他内容有任何建议?

编辑:为端口通道添加 RSTP 状态...


SwitchA#sh spanning-tree
Spanning tree enabled mode RSTP
Default port cost method:  long

  Root ID    Priority    32768
             Address     0c:f5:a4:c2:0e:bf
             This switch is the root
             Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec

  Number of topology changes 12 last change occurred 20:18:37 ago
  Times:  hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15

Interfaces
  Name     State   Prio.Nbr    Cost    Sts   Role PortFast       Type        
--------- -------- --------- -------- ------ ---- -------- -----------------
...
   Po1    enabled  128.1000   20000    Frw   Desg   Yes       P2P (RSTP)     
   Po2    enabled  128.1001   20000    Dsbl  Dsbl    No            -         
   Po3    enabled  128.1002   20000    Dsbl  Dsbl    No            -         
   Po4    enabled  128.1003   20000    Dsbl  Dsbl    No            -         
   Po5    enabled  128.1004   20000    Dsbl  Dsbl    No            -         
   Po6    enabled  128.1005   20000    Dsbl  Dsbl    No            -         
   Po7    enabled  128.1006   20000    Dsbl  Dsbl    No            -         
   Po8    enabled  128.1007   20000    Frw   Desg    No       P2P (RSTP)     


SwitchB#sh spanning-tree
Spanning tree enabled mode RSTP
Default port cost method:  long
Loopback guard:   Disabled

  Root ID    Priority    32768
             Address     0c:f5:a4:c2:0e:bf
             Cost        20000
             Port        Po8
             Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec
  Bridge ID  Priority    32768
             Address     1c:de:a7:75:1a:4b
             Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec

  Number of topology changes 5 last change occurred 20:26:02 ago
  Times:  hold 1, topology change 35, notification 2
          hello 2, max age 20, forward delay 15

Interfaces
  Name     State   Prio.Nbr    Cost    Sts   Role PortFast       Type        
--------- -------- --------- -------- ------ ---- -------- ----------------- 
...
   Po1    enabled  128.1000   20000    Frw   Desg   Yes       P2P (RSTP)     
   Po2    enabled  128.1001   20000    Dsbl  Dsbl    No            -         
   Po3    enabled  128.1002   20000    Dsbl  Dsbl    No            -         
   Po4    enabled  128.1003   20000    Dsbl  Dsbl    No            -         
   Po5    enabled  128.1004   20000    Dsbl  Dsbl    No            -         
   Po6    enabled  128.1005   20000    Dsbl  Dsbl    No            -         
   Po7    enabled  128.1006   20000    Dsbl  Dsbl    No            -         
   Po8    enabled  128.1007   20000    Frw   Root    No       P2P (RSTP)     

在这两种情况下,Po8 是交换机间 LAG,Po1 是服务器 LAG。
当我的设备处于损坏状态(ping 掉线)时,任一交换机上都没有记录拓扑更改。

3个回答

发生此问题是因为 802.3ad 模式下的 Linux 绑定将所有从接口设置为相同的硬件 mac 地址(从第一个从属接口“借用”)。然后使用相同的 mac 地址传输 LACP PDU,并且每个交换机都认为它与服务器有直接连接。同时,bonding 会丢弃在其非活动聚合器上接收到的数据包。很可能是这个问题:https : //sourceforge.net/p/bonding/discussion/77913/thread/520c70a8/#2b21

更新:当前内核中有解决方法:https : //github.com/opencomputeproject/OpenNetworkLinux/blob/master/packages/base/any/kernels/3.2.65-1%2Bdeb7u2/patches/network-bonding-lacp-fix-不正确的mux-state.patch

这不是受支持的配置。SG 线不支持多机箱 LACP。您可以使用两个 LACP 绑定(每个交换机一个)来模拟这一点,然后将它们绑定到一个简单的绑定中。

如果可能(不确定这些开关的可配置性如何),请更改通道负载平衡。示例: 通道负载平衡 src-dst-mac

其他选项:{dst-ip | dst-mac | src-dst-ip | src-dst-mac | src-ip | src-mac}

在我看来,滞后算法与在交换机上出现/出现但在您的服务器上未激活的链接交替出现。