32.7. 链路聚合与故障转移

FreeBSD 提供了 lagg(4)open in new window 接口,它可以用来将多个网络接口聚合到一个虚拟接口中,以便提供故障转移和链路聚合。故障转移允许流量继续流动,只要至少有一个聚合网络接口具有已建立的链接。链路聚合在支持 LACP 的交换机上效果最佳,因为此协议在响应单个链路的故障时双向分配流量。

滞后接口支持的聚合协议确定哪些端口用于传出流量以及特定端口是否接受传入流量。lagg(4)open in new window 支持以下协议:

  • failover

    此模式仅通过主端口发送和接收流量。如果主端口不可用,则使用下一个活动端口。添加到虚拟接口的第一个接口是主端口,随后添加的所有接口都用作故障转移设备。如果故障转移到非主端口,则原始端口在再次变为可用后将成为主端口。

  • loadbalance

    这提供了静态设置,并且不会与对等帧或交换帧协商聚合以监视链路。如果交换机支持 LACP,则应改用该开关。

  • lacp

    IEEE® 802.3ad 链路聚合控制协议(LACP)将一组可聚合链路与对等方协商到一个或多个链路聚合组(LAG)中。每个 LAG 由相同速度的端口组成,设置为全双工操作,并且流量在 LAG 中具有最大总速度的端口之间均衡。通常,只有一个 LAG 包含所有端口。如果物理连接发生更改,LACP 将快速收敛到新配置。

    LACP 根据散列协议标头信息均衡活动端口之间的传出流量,并接受来自任何活动端口的传入流量。哈希包括以太网源地址和目标地址,以及 VLAN 标记(如果可用)以及 IPv4 或 IPv6 源地址和目标地址。

  • roundrobin

    此模式使用轮循机制调度程序在所有活动端口之间分配传出流量,并接受来自任何活动端口的传入流量。由于此模式违反了以太网帧排序,因此应谨慎使用。

  • broadcast

    此模式将传出流量发送到滞后接口上配置的所有端口,并在任何端口上接收帧。

32.7.1. 配置示例

本节演示如何配置思科®交换机和 FreeBSD 系统以实现 LACP 负载均衡。然后,它演示如何在故障转移模式下配置两个以太网接口,以及如何在以太网和无线接口之间配置故障转移模式。

示例 1.使用思科®交换机进行 LACP 聚合

此示例将 FreeBSD 机器上的两个 fxp(4)open in new window 以太网接口连接到 Cisco® 交换机上的前两个以太网端口,作为单个负载均衡和容错链路。可以添加更多接口以提高吞吐量和容错能力。替换示例中显示的 Cisco® 端口、以太网设备、通道组编号和 IP 地址的名称,以匹配本地配置。

帧排序在以太网链路上是强制性的,两个站之间的任何流量始终流经同一物理链路,从而将最大速度限制为一个接口的速度。传输算法尝试使用尽可能多的信息来区分不同的流量,并在可用接口之间均衡流量。

在 Cisco® 交换机上,将 FastEthernet0/1FastEthernet0/2 接口添加到通道 group 1

interface FastEthernet0/1
channel-group 1 mode active
channel-protocol lacp
!
interface FastEthernet0/2
channel-group 1 mode active
channel-protocol lacp

在 FreeBSD 系统上,使用物理接口 fxp0fxp1 创建 lagg(4)open in new window 接口,并使这些接口的 IP 地址为 10.0.0.3/24

# ifconfig fxp0 up
# ifconfig fxp1 up
# ifconfig lagg0 create
# ifconfig lagg0 up laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24

接下来,验证虚拟接口的状态:

# ifconfig lagg0
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=8<VLAN_MTU>
       ether 00:05:5d:71:8d:b8
       inet 10.0.0.3 netmask 0xffffff00 broadcast 10.0.0.255
       media: Ethernet autoselect
       status: active
       laggproto lacp
       laggport: fxp1 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>
       laggport: fxp0 flags=1c<ACTIVE,COLLECTING,DISTRIBUTING>

标记为 ACTIVE 的端口是已经与远程交换机协商好的 LAG 的一部分。流量将通过这些活动端口传输和接收。在上述命令中添加 -v,以查看 LAG 标识符。

要查看 Cisco® 交换机上的端口状态:

switch# show lacp neighbor
Flags:  S - Device is requesting Slow LACPDUs
       F - Device is requesting Fast LACPDUs
       A - Device is in Active mode       P - Device is in Passive mode

Channel group 1 neighbors

Partner's information:

                 LACP port                        Oper    Port     Port
Port      Flags   Priority  Dev ID         Age     Key     Number   State
Fa0/1     SA      32768     0005.5d71.8db8  29s    0x146   0x3      0x3D
Fa0/2     SA      32768     0005.5d71.8db8  29s    0x146   0x4      0x3D

有关更多详细信息,请键入 show lacp neighbor detail

要在重新引导时保留此配置,请将以下条目添加到 FreeBSD 系统上的 /etc/rc.conf

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto lacp laggport fxp0 laggport fxp1 10.0.0.3/24"

示例 2.故障转移模式

如果主接口上的链路丢失,则故障转移模式可用于切换到辅助接口。要配置故障转移,请确保底层物理接口已启动,然后创建 lagg(4)open in new window 接口。在此示例中,fxp0 是主接口,fxp1 是辅助接口,并为虚拟接口分配了 IP 地址 10.0.0.15/24

# ifconfig fxp0 up
# ifconfig fxp1 up
# ifconfig lagg0 create
# ifconfig lagg0 up laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24

虚拟接口应如下所示:

# ifconfig lagg0
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=8<VLAN_MTU>
       ether 00:05:5d:71:8d:b8
       inet 10.0.0.15 netmask 0xffffff00 broadcast 10.0.0.255
       media: Ethernet autoselect
       status: active
       laggproto failover
       laggport: fxp1 flags=0<>
       laggport: fxp0 flags=5<MASTER,ACTIVE>

流量将在 fxp0 上传输和接收。如果链接在 fxp0 上丢失,fxp1 将成为活动链接。如果在主接口上恢复了链接,它将再次成为活动链接。

要在重新启动后保留此配置,请将以下条目添加到 /etc/rc.conf

ifconfig_fxp0="up"
ifconfig_fxp1="up"
cloned_interfaces="lagg0"
ifconfig_lagg0="laggproto failover laggport fxp0 laggport fxp1 10.0.0.15/24"

示例 3.以太网和无线接口之间的故障转移模式

对于便携式计算机用户,通常需要将无线设备配置为辅助设备,仅在以太网连接不可用时使用。使用 lagg(4)open in new window 时,可以配置一个故障转移,由于性能和安全原因,它更喜欢以太网连接,同时保持通过无线连接传输数据的能力。

这是通过将以太网接口的 MAC 地址替换为无线接口的 MAC 地址来实现的。

从理论上讲,以太网或无线MAC地址都可以更改以匹配另一个。但是,一些流行的无线接口不支持覆盖 MAC 地址。因此,我们建议为此覆盖以太网 MAC 地址。

如果无线接口的驱动程序没有在 GENERIC 或自定义内核中加载,而计算机运行的是 FreeBSD 12.1,可以在 /boot/loader.conf 中加载相应的 .ko,在该文件中加入 driver_load="YES" 并重启。另一个更好的方法是在 /etc/rc.conf 中加载驱动程序,将其添加到该文件的 kld_list,详见(rc.conf(5)open in new window)中,然后重新启动。这是有必要的,因为否则在设置 lagg(4)open in new window 接口的时候,驱动程序还没有被加载。

在此示例中,以太网接口 re0 是主接口,无线接口 wlan0 是故障转移。wlan0 接口是从 ath0 物理无线接口创建的,以太网接口将使用无线接口的 MAC 地址进行配置。首先,启动无线接口(将 FR 替换为你自己的 2 个字母的国家/地区代码),但不要设置 IP 地址。更换 wlan0 以匹配系统的无线接口名称:

# ifconfig wlan0 create wlandev ath0 country FR ssid my_router up

现在,你可以确定无线接口的 MAC 地址:

# ifconfig wlan0
wlan0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
	ether b8:ee:65:5b:32:59
	groups: wlan
	ssid Bbox-A3BD2403 channel 6 (2437 MHz 11g ht/20) bssid 00:37:b7:56:4b:60
	regdomain ETSI country FR indoor ecm authmode WPA2/802.11i privacy ON
	deftxkey UNDEF AES-CCM 2:128-bit txpower 30 bmiss 7 scanvalid 60
	protmode CTS ampdulimit 64k ampdudensity 8 shortgi -stbctx stbcrx
	-ldpc wme burst roaming MANUAL
	media: IEEE 802.11 Wireless Ethernet MCS mode 11ng
	status: associated
	nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

ether 行将包含指定接口的 MAC 地址。现在,更改以太网接口的 MAC 地址以匹配:

# ifconfig re0 ether b8:ee:65:5b:32:59

确保 re0 接口已启动,然后创建以 re0 作为主接口的 lagg(4)open in new window 接口,并故障转移到 wlan0

# ifconfig re0 up
# ifconfig lagg0 create
# ifconfig lagg0 up laggproto failover laggport re0 laggport wlan0

虚拟接口应如下所示:

# ifconfig lagg0
lagg0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
       options=8<VLAN_MTU>
       ether b8:ee:65:5b:32:59
       laggproto failover lagghash l2,l3,l4
       laggport: re0 flags=5<MASTER,ACTIVE>
       laggport: wlan0 flags=0<>
       groups: lagg
      media: Ethernet autoselect
       status: active

然后,启动 DHCP 客户端以获取 IP 地址:

# dhclient lagg0

要在重新启动后保留此配置,请将以下条目添加到 /etc/rc.conf

ifconfig_re0="ether b8:ee:65:5b:32:59"
wlans_ath0="wlan0"
ifconfig_wlan0="WPA"
create_args_wlan0="country FR"
cloned_interfaces="lagg0"
ifconfig_lagg0="up laggproto failover laggport re0 laggport wlan0 DHCP"