# Bonding и teaming - объединение интерфейсов _Сеть: L2 / L3 · LinuxLab Knowledge Base_ **TL;DR:** Bonding объединяет несколько физических интерфейсов в один логический. Режимы: active-backup (один активный), 802.3ad/LACP (LAG со свитчем), balance-xor (хэш по MAC). Используется для HA и удвоения throughput. ## Зачем bonding Один сетевой интерфейс - один SPOF. На серверах ставят 2-4 NIC и объединяют: - **High availability** - один порт лёг, второй держит линк (active-backup) - **Throughput** - 2×10G физически, до 20G на один логический интерфейс (LACP с правильным хэшированием) - **Load balancing** - распределить пропускную способность между исходящими сессиями Linux реализует это через драйвер `bonding`, создающий `bond0` поверх физических slave'ов. Альтернатива - `team` (более модульная), но bonding исторически популярнее. ## Режимы | mode | Имя | Описание | |------|------------------|----------| | 0 | balance-rr | round-robin: пакеты по очереди в каждый slave. Хорош для throughput, плох для порядка - reorder вызывает retransmit'ы | | 1 | active-backup | один активный, остальные standby. Свитч не нужно настраивать. Универсальный default | | 2 | balance-xor | хэш(src-MAC ^ dst-MAC) → slave. Стабильный «один поток - один путь» | | 3 | broadcast | всё во все slave'ы. Для special HA-кейсов | | 4 | 802.3ad (LACP) | агрегация по стандарту, нужен LAG на свитче | | 5 | balance-tlb | Transmit Load Balancing - исходящий по slave с меньшей загрузкой | | 6 | balance-alb | то же + входящий через ARP-tricks (без поддержки свитча) | Самые распространённые: **mode 1 (active-backup)** для простоты и **mode 4 (LACP)** для производительности. ## active-backup (mode 1) Простой и универсальный - со свитчем настраивать ничего не надо. ```bash ip link add bond0 type bond mode active-backup miimon 100 ip link set eth0 master bond0 ip link set eth1 master bond0 ip link set bond0 up ip addr add 10.0.0.5/24 dev bond0 ``` - **miimon 100** - проверять линк каждые 100мс через MII (PHY-status) - При обрыве линка на active slave - failover за ~200мс на backup - MAC-адрес bond'а = MAC активного slave'а (при failover может смениться - ARP-update в сеть) ## LACP (mode 4) - 802.3ad Стандартный механизм. На свитче настраивается **port-channel / LAG** с теми же портами: ```bash ip link add bond0 type bond mode 802.3ad miimon 100 \ lacp_rate fast xmit_hash_policy layer3+4 ``` - **lacp_rate fast** - LACPDU каждую секунду (vs 30с по дефолту) - **xmit_hash_policy layer3+4** - хэш по src/dst IP + порт. Один поток идёт по одному slave'у, разные потоки распределяются. **Важно:** один TCP-flow всегда через один slave. То есть от 1 клиента получишь максимум 10G на 2×10G LACP. Несколько клиентов - до 20G. ## Hash policy | xmit_hash_policy | Хэш | |------------------|-----| | layer2 | src+dst MAC | | layer2+3 | + IP-адреса | | layer3+4 | IP + порт (наиболее распределяет) | layer3+4 нарушает 802.3ad строго, но в реальности всё работает - свитчам пофиг как ты выбираешь slave для исходящего. ## Конфигурация в systemd-networkd ```ini # /etc/systemd/network/10-bond.netdev [NetDev] Name=bond0 Kind=bond [Bond] Mode=802.3ad LACPTransmitRate=fast TransmitHashPolicy=layer3+4 MIIMonitorSec=100ms # /etc/systemd/network/20-bond-eth0.network [Match] Name=eth0 [Network] Bond=bond0 # /etc/systemd/network/30-bond-ip.network [Match] Name=bond0 [Network] Address=10.0.0.5/24 Gateway=10.0.0.1 ``` ## Bonding + VLAN Чтобы поднять VLAN'ы поверх bond'а - сначала bond, потом VLAN: ```bash ip link add bond0 type bond mode 802.3ad ip link add link bond0 name bond0.10 type vlan id 10 ``` Получаешь LACP-агрегацию + теги [[vlan-and-trunk|802.1Q]] поверх. ## Bonding + bridge В виртуализации (KVM, libvirt): bond + bridge - стандартная конфигурация. VM'ы видят `br0`, наружу через bond: ``` eth0 ──┐ ├─ bond0 ── br0 ── (vnetX к VM'кам) eth1 ──┘ ``` ## Когда что-то пошло не так - **LACP не сходится** - на свитче LAG не настроен / не active mode. Проверить: `cat /proc/net/bonding/bond0` показывает per-slave LACP-state - **Нет роста throughput** - один TCP-flow, hash policy layer2. Сменить на layer3+4 + несколько потоков - **Failover медленный** - miimon слишком велик; ставь 100ms - **MAC меняется при failover** - использовать `fail_over_mac=active` (новый MAC) или `fail_over_mac=follow` (всегда MAC primary) - **Bridge поверх bond ругается** - `net.ipv4.conf.all.arp_filter=1` или `arp_ignore=1` нужны на bonding-интерфейсе ## Команды ```bash cat /proc/net/bonding/bond0 ``` Полный статус bond'а: режим, slaves, LACP info, активный slave ```bash ip -d link show bond0 ``` -d показывает bond-параметры: mode, miimon, hash policy ```bash ethtool eth0 | grep -E 'Speed|Link' ``` Проверить физический линк перед/после добавления в bond ```bash ip link set eth0 master bond0 ``` Добавить slave; интерфейс должен быть DOWN при добавлении в некоторых режимах ```bash ip link set bond0 type bond miimon 50 ``` Динамически изменить miimon - не требуется пересоздавать bond ## См. также - [Ethernet frame](/kb/ethernet-frame.md) - [MAC address](/kb/mac-address.md) - [VLAN и trunk - 802.1Q](/kb/vlan-and-trunk.md) - [Linux bridge - программный свитч](/kb/linux-bridge.md) - [tc - traffic control](/kb/cmd-tc.md)