Updated: 11 October 2026 · Applies to: Linux bonding driver; NetworkManager 1.54 (AlmaLinux, Rocky Linux and RHEL 9) and 1.58 (CentOS Stream 10, RHEL 10 family); netplan on Ubuntu 24.04 and 26.04; ifupdown with ifenslave 2.14 on Debian 13
Network bonding joins two or more network ports into one logical interface (usually bond0) for redundancy and, in some modes, more total bandwidth. Linux has seven bonding modes, numbered 0 to 6. In short: use mode 1 (active-backup) when you only want failover, because it needs nothing from the switch; use mode 4 (802.3ad, LACP) when the switch supports LACP and you want failover plus more total bandwidth. The mode must match the switch configuration, so decide it together with whoever runs the switch.
The seven bonding modes
The names, numbers and requirements below come from the kernel's bonding documentation; the text in brackets is how /proc/net/bonding/bond0 names each mode, according to the kernel source.
- Mode 0, balance-rr ("load balancing (round-robin)"): packets go out on each port in turn. It is the only mode in which a single connection can use more than one port, but packets can arrive out of order, which slows TCP. Needs the switch ports grouped (static EtherChannel or trunk). This is the kernel default when no mode is given.
- Mode 1, active-backup ("fault-tolerance (active-backup)"): one port carries all traffic; another takes over only if it fails. No switch configuration needed. The safe choice for redundancy.
- Mode 2, balance-xor ("load balancing (xor)"): each destination always uses the same port, chosen by a hash. Needs grouped switch ports.
- Mode 3, broadcast ("fault-tolerance (broadcast)"): every packet goes out on every port. Only for special fault-tolerant networks.
- Mode 4, 802.3ad ("IEEE 802.3ad Dynamic link aggregation"): standard LACP link aggregation. Server and switch negotiate the group; traffic is spread per connection. Needs a switch with the ports configured as an 802.3ad (LACP) group, and all ports at the same speed and duplex.
- Mode 5, balance-tlb ("transmit load balancing"): outgoing traffic is spread by load, incoming traffic arrives on one port. No switch support needed.
- Mode 6, balance-alb ("adaptive load balancing"): mode 5 plus receive load balancing for IPv4, done by answering ARP requests with different MAC addresses. No switch support needed, but the network driver must allow changing the MAC address while the card is up.
Except in mode 0, one connection never goes faster than one port: two 1 Gbit/s ports give 2 Gbit/s in total across many connections, not 2 Gbit/s for one download. With xmit_hash_policy=layer3+4 (modes 2 and 4), traffic to one host can use several ports, but each connection still stays on one port.
Which mode to choose
- Redundancy only, or switches you cannot change: active-backup.
- Redundancy and more total bandwidth, switch supports LACP: 802.3ad with
miimon=100,lacp_rate=fast(LACP messages every second instead of every 30 seconds, so a dead link is noticed sooner) andxmit_hash_policy=layer3+4. - Load spreading without any switch support: balance-alb (or balance-tlb).
- balance-rr, balance-xor and broadcast: only for setups that specifically need them.
Bonding needs two or more physical ports, so it applies to dedicated servers rather than a VPS with one virtual network card. On a dedicated server, ask the data-centre team before you switch to LACP: if the switch side does not match, the server can lose its network.
Create a bond with nmcli (AlmaLinux, Rocky Linux, RHEL, CentOS Stream, Fedora)
Work from the server's console (IPMI or KVM), because the network restarts. Replace eno1, eno2 and the addresses with yours.
- Create the bond with its mode and IP settings:
nmcli connection add type bond con-name bond0 ifname bond0 \ bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4" \ ipv4.method manual ipv4.addresses 192.0.2.10/24 ipv4.gateway 192.0.2.1 ipv4.dns "1.1.1.1"
For failover only, usebond.options "mode=active-backup,miimon=100,primary=eno1". - Add the ports:
nmcli connection add type ethernet port-type bond con-name bond0-port1 ifname eno1 controller bond0 nmcli connection add type ethernet port-type bond con-name bond0-port2 ifname eno2 controller bond0
- Let the bond bring its ports up with it, then activate it:
nmcli connection modify bond0 connection.autoconnect-ports 1 nmcli connection up bond0
- Remove or disable the old profiles of
eno1andeno2so they do not compete with the bond.
We generated these profiles with nmcli --offline on NetworkManager 1.54 and 1.58. The saved bond section looks like this:
[bond] lacp_rate=fast miimon=100 mode=802.3ad xmit_hash_policy=layer3+4
A number also works (mode=4 was saved as mode=802.3ad). A wrong name is rejected with the full list:
Error: failed to modify bond.options: 'lacp' not among [balance-rr, active-backup, balance-xor, broadcast, 802.3ad, balance-tlb, balance-alb].
Older guides use slave-type bond master bond0; port-type and controller are the current names.
Netplan (Ubuntu 24.04 and 26.04)
network:
version: 2
ethernets:
eno1: {}
eno2: {}
bonds:
bond0:
interfaces: [eno1, eno2]
addresses: [192.0.2.10/24]
routes:
- to: default
via: 192.0.2.1
nameservers:
addresses: [1.1.1.1, 8.8.8.8]
parameters:
mode: 802.3ad
lacp-rate: fast
mii-monitor-interval: 100
transmit-hash-policy: layer3+4
Save it as, for example, /etc/netplan/60-bond.yaml (mode 600) and apply it with netplan try, which rolls back if you lose the connection. On Ubuntu 24.04, netplan generate turned it into a systemd-networkd bond with Mode=802.3ad, LACPTransmitRate=fast, MIIMonitorSec=100ms and TransmitHashPolicy=layer3+4. A wrong mode stops with Error in network definition: unknown bond mode 'lacp'. For active-backup, use mode: active-backup and primary: eno1.
Debian 13 (ifupdown)
Install ifenslave (it provides the ifupdown hooks) and define the bond in /etc/network/interfaces:
auto bond0
iface bond0 inet static
address 192.0.2.10/24
gateway 192.0.2.1
bond-slaves eno1 eno2
bond-mode 802.3ad
bond-miimon 100
bond-lacp-rate fast
bond-xmit_hash_policy layer3+4
According to the package's README.Debian, you need no separate stanza for eno1 and eno2; note the underscore in bond-xmit_hash_policy. For active-backup, use bond-mode active-backup and bond-primary eno1.
Check the bond
cat /proc/net/bonding/bond0 ip -d link show bond0
The first command shows the Bonding Mode, the Transmit Hash Policy, the Currently Active Slave (active-backup), the MII Status and Link Failure Count of each port and, for 802.3ad, the LACP details of each port, including its Aggregator ID. If a port stays down or LACP never forms, check the switch side first. Test failover by unplugging one cable (or ip link set eno2 down) while a ping runs.
Network teaming is gone in RHEL 10
According to Red Hat, RHEL 10 removed teamd and libteam; bonding is the replacement. In our tests, teamd and NetworkManager-team were still available on AlmaLinux 9.8 but not on CentOS Stream 10. Move a team to a bond before you upgrade: Network Teaming on RHEL, AlmaLinux and Rocky Linux: Migrate to Bonding. Related guides: How to Configure VLAN Tagging with nmcli and netplan (VLANs on top of a bond) and How to add network bridge with nmcli (NetworkManager) on Linux? (network bridges).
Official documentation: Linux Ethernet Bonding Driver and Configuring a network bond (Red Hat).
Ucartz services for this topic
- KVM VPS hosting: NVMe SSD and full root access, with Free Basic Managed Support.
- Unmanaged dedicated servers: full root access and free IPMI KVM, with Free Basic Managed Support.
- Linux server management: hardening, patching, monitoring and automation for Ubuntu, Debian, RHEL and AlmaLinux.
