# Bond network interfaces
Combines multiple network interfaces into a single logical interface.
Provides benefits such as increased bandwidth, redundancy, and load balancing.
1. [TL;DR](#tldr)
1. [Bonding modes](#bonding-modes)
1. [Configuration](#configuration)
1. [Further readings](#further-readings)
1. [Sources](#sources)
## TL;DR
Linux bonding is implemented through the `bonding` kernel module.
It implements several [bonding modes], each with its own characteristics and use cases.
If one's switches support LACP, prefer using mode 4 (802.3ad) for compatibility and optimal performance.
LACP allows the Linux system and the switch to negotiate the link aggregation settings automatically.
Usage
```sh
# Check the status of the bonding interface.
cat '/proc/net/bonding/bond0'
# Test the redundancy of the bonding interface.
# Simulates a failure of one of the slave interfaces.
ifconfig 'eth0' down; sleep 30s; ifconfig 'eth0' up
```
## Bonding modes
| ID | Mode name | Summary | Use cases |
| --- | ------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- |
| 0 | Round Robin | Sends packets out sequentially on each available slave interface.
Provides load balancing across all used interfaces and increases the overall bandwidth. | Environments where bandwidth aggregation is the primary goal and all connected switches support load balancing |
| 1 | Active-Backup | Only one slave interface is active at a time. If the active interface fails, the driver automatically switches to one of the backup interfaces. | Scenarios where redundancy is crucial, such as in mission-critical applications |
| 2 | XOR | The driver uses a hash function to determine which slave interface to send a packet on. The hash is based on the source and destination MAC addresses. | Networks where the traffic patterns are relatively stable, and the same source-destination pairs are likely to be used frequently |
| 3 | Broadcast | All packets are sent out on all slave interfaces. Provides high redundancy, but consumes a lot of network resources. | |
| 4 | 802.3ad, Link Aggregation Control Protocol | Requires support from the connected switches. Creates a link aggregation group (LAG) between the Linux system and the switch. Provides both load balancing and redundancy. | Environments where high bandwidth and reliability are required |
| 5 | Balance-TLB | Dynamically distributes **outgoing** traffic to the interface with the least load. | Environments where the traffic distribution is uneven and load balancing is required |
| 6 | Balance-ALB | Distributes both outgoing and incoming traffic across all slave interfaces | Networks where both high bandwidth and load balancing are required |
## Configuration
1. Load the `bonding` module:
```sh
modprobe 'bonding'
```
1. Create a bonding interface.
Add a configuration file in the `/etc/sysctl.d/` directory:
```conf
# /etc/sysctl.d/bond0.conf
# miimon: interval (in milliseconds) at which the bonding driver checks the link status of the slave interfaces
bonding.modes=mode=6 miimon=100
```
1. Add the slave interfaces:
```conf
# /etc/network/interfaces
auto bond0
iface bond0 inet static
address
netmask
gateway
bond-mode
bond-miimon 100
bond-slaves eth0 eth1
```
1. Restart the network service:
```sh
sudo systemctl restart networking
```
## Further readings
### Sources
- [Understanding Linux Bonding Modes]
[Bonding modes]: #bonding-modes
[Understanding Linux Bonding Modes]: https://linuxvox.com/blog/linux-bonding-modes/