Network Bonding และ Teaming บน Linux

Network Bonding คือการรวม Network Interface หลายตัวเข้าด้วยกันเป็น Interface เดียว เพื่อเพิ่ม Bandwidth หรือให้ Fault Tolerance เมื่อ Interface ใดตาย Traffic ยังคงวิ่งผ่าน Interface ที่เหลืออยู่ได้โดยไม่หยุดชะงัก ใช้งานกันบน Production Server ที่ต้องการ High Availability เช่น Database Server, Storage Server, หรือ Hypervisor

บทความนี้อธิบายการตั้งค่า Network Bonding บน Linux ตั้งแต่ Bonding Mode ที่ใช้งานบ่อย, การตั้งค่าผ่าน netplan (Ubuntu) และ nmcli (RHEL/Rocky), การตรวจสอบสถานะ Bond รวมถึง Network Teaming ซึ่งเป็นทางเลือกที่ใช้บน RHEL/Rocky

Bonding Mode — เลือกให้ตรงกับการใช้งาน

# Linux รองรับ Bonding Mode 7 แบบ:
# Mode 0 (balance-rr)   — Round-robin: กระจาย Packet สลับ Interface
#                          เพิ่ม Throughput แต่ต้องการ Switch รองรับ LACP
# Mode 1 (active-backup) — Active-Backup: Interface เดียวทำงาน ที่เหลือ Standby
#                          ใช้บ่อยที่สุด — ไม่ต้องการ Switch รองรับพิเศษ
# Mode 2 (balance-xor)  — XOR: ส่งตาม MAC Address Hash
# Mode 3 (broadcast)    — ส่งทุก Packet ไปทุก Interface พร้อมกัน
# Mode 4 (802.3ad)      — LACP: ต้องการ Switch รองรับ IEEE 802.3ad
#                          เพิ่ม Bandwidth จริง ๆ ใช้งานใน Data Center
# Mode 5 (balance-tlb)  — Adaptive Transmit Load Balancing
# Mode 6 (balance-alb)  — Adaptive Load Balancing (Transmit + Receive)

# สรุปการเลือก:
# ต้องการ Failover เท่านั้น → mode=1 (active-backup) ← ง่ายที่สุด
# ต้องการ Bandwidth + Failover พร้อมกัน → mode=4 (802.3ad/LACP)
# Switch ธรรมดา ต้องการ Load Balance → mode=6 (balance-alb)

ตรวจสอบ Bonding Module

# ตรวจสอบว่า bonding module โหลดอยู่หรือไม่
lsmod | grep bonding

# โหลด Module ด้วยตนเอง (ถ้ายังไม่โหลด)
sudo modprobe bonding

# ให้ Module โหลดอัตโนมัติเมื่อ Boot
echo "bonding" | sudo tee /etc/modules-load.d/bonding.conf

# ตรวจสอบ Network Interface ที่มีทั้งหมด
ip link show
# หรือ
nmcli device status

ตั้งค่า Bonding บน Ubuntu ด้วย Netplan

Ubuntu ใช้ Netplan เป็น Network Configuration Layer โดยค่า Config อยู่ใน /etc/netplan/

# ดู Network Interface ที่มีอยู่
ip link show

# สร้าง Netplan Config สำหรับ Bond (Mode 1: active-backup)
sudo nano /etc/netplan/01-bond.yaml
# ตัวอย่าง /etc/netplan/01-bond.yaml
# Bond Mode 1 (active-backup) — Failover
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
    eth1:
      dhcp4: false
  bonds:
    bond0:
      interfaces: [eth0, eth1]
      addresses:
        - 192.168.1.10/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses: [8.8.8.8, 8.8.4.4]
      parameters:
        mode: active-backup
        primary: eth0
        mii-monitor-interval: 100
# ตัวอย่าง Bond Mode 4 (802.3ad/LACP)
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
    eth1:
      dhcp4: false
  bonds:
    bond0:
      interfaces: [eth0, eth1]
      addresses:
        - 192.168.1.10/24
      routes:
        - to: default
          via: 192.168.1.1
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        mii-monitor-interval: 100
        transmit-hash-policy: layer3+4
# ตรวจสอบ Config ก่อน Apply
sudo netplan try

# Apply Config
sudo netplan apply

# ตรวจสอบผลลัพธ์
ip link show bond0
ip addr show bond0

ตั้งค่า Bonding บน RHEL/Rocky ด้วย nmcli

บน RHEL, Rocky Linux, และ AlmaLinux ใช้ NetworkManager (nmcli) ในการตั้งค่า Bonding

# ดู Interface ที่มีอยู่
nmcli device status

# ขั้นตอนที่ 1: สร้าง Bond Interface
sudo nmcli connection add type bond \
  con-name bond0 \
  ifname bond0 \
  bond.options "mode=active-backup,mii-monitor=100"

# ขั้นตอนที่ 2: ตั้ง IP ให้ Bond Interface
sudo nmcli connection modify bond0 \
  ipv4.addresses "192.168.1.10/24" \
  ipv4.gateway "192.168.1.1" \
  ipv4.dns "8.8.8.8 8.8.4.4" \
  ipv4.method manual

# ขั้นตอนที่ 3: เพิ่ม Slave Interface (eth0)
sudo nmcli connection add type ethernet \
  con-name bond0-eth0 \
  ifname eth0 \
  master bond0

# ขั้นตอนที่ 4: เพิ่ม Slave Interface (eth1)
sudo nmcli connection add type ethernet \
  con-name bond0-eth1 \
  ifname eth1 \
  master bond0

# ขั้นตอนที่ 5: เปิดใช้งาน Bond
sudo nmcli connection up bond0
sudo nmcli connection up bond0-eth0
sudo nmcli connection up bond0-eth1
# สร้าง Bond Mode 4 (LACP) บน RHEL/Rocky
sudo nmcli connection add type bond \
  con-name bond0-lacp \
  ifname bond0 \
  bond.options "mode=802.3ad,miimon=100,lacp_rate=fast,xmit_hash_policy=layer3+4"

# ตรวจสอบ Connection ทั้งหมด
nmcli connection show

# ตรวจสอบสถานะ Bond
nmcli device show bond0

ตรวจสอบสถานะ Bond

# ดูสถานะ Bond แบบละเอียด
cat /proc/net/bonding/bond0

# ตัวอย่าง Output (Mode 1: active-backup):
# Ethernet Channel Bonding Driver: v3.7.1
# Bonding Mode: fault-tolerance (active-backup)
# Primary Slave: eth0 (primary_reselect always)
# Currently Active Slave: eth0
# MII Status: up
# MII Polling Interval (ms): 100
# Up Delay (ms): 0
# Down Delay (ms): 0
#
# Slave Interface: eth0
# MII Status: up
# Speed: 1000 Mbps
# Duplex: full
# Link Failure Count: 0
# Permanent HW addr: 52:54:00:ab:cd:ef
# Slave queue ID: 0
#
# Slave Interface: eth1
# MII Status: up
# Speed: 1000 Mbps
# Duplex: full
# Link Failure Count: 0
# Permanent HW addr: 52:54:00:12:34:56
# Slave queue ID: 0

# ดู Interface สรุปด้วย ip
ip link show bond0
ip addr show bond0

ทดสอบ Failover

# ทดสอบ Failover โดย Disable eth0 (Active Interface)
# วิธีที่ 1: ด้วย ip command
sudo ip link set eth0 down

# ตรวจสอบว่า bond0 ยังทำงานโดยใช้ eth1 แทน
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"
# ควรเปลี่ยนเป็น: Currently Active Slave: eth1

# ทดสอบ Connectivity ขณะที่ eth0 Down
ping -c 5 8.8.8.8

# คืนค่า eth0
sudo ip link set eth0 up

# ตรวจสอบว่า eth0 กลับมาเป็น Active
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"

# ดู Link Failure Count (จำนวนครั้งที่ Interface ตาย)
cat /proc/net/bonding/bond0 | grep "Link Failure Count"

Network Teaming — ทางเลือกสำหรับ RHEL/Rocky

Network Teaming เป็นเทคโนโลยีทางเลือกที่ Red Hat พัฒนาขึ้นเพื่อแทน Bonding รองรับการทำงานใน User Space ผ่าน teamd daemon ทำให้ยืดหยุ่นกว่าและ Debug ง่ายกว่า แต่ต้องติดตั้ง teamd เพิ่มเติม

# ติดตั้ง teamd (RHEL/Rocky)
sudo dnf install teamd NetworkManager-team

# สร้าง Team Interface (Mode: activebackup)
sudo nmcli connection add type team \
  con-name team0 \
  ifname team0 \
  team.config '{"runner": {"name": "activebackup"}}'

# ตั้ง IP
sudo nmcli connection modify team0 \
  ipv4.addresses "192.168.1.10/24" \
  ipv4.gateway "192.168.1.1" \
  ipv4.method manual

# เพิ่ม Port (Slave)
sudo nmcli connection add type team-slave \
  con-name team0-eth0 \
  ifname eth0 \
  master team0

sudo nmcli connection add type team-slave \
  con-name team0-eth1 \
  ifname eth1 \
  master team0

# เปิดใช้งาน
sudo nmcli connection up team0

# ตรวจสอบสถานะ
sudo teamdctl team0 state
# Team Runner Modes:
# activebackup — คล้าย Bond Mode 1 (Failover)
# roundrobin   — คล้าย Bond Mode 0
# loadbalance  — Load Balancing พร้อม BPF Hash
# broadcast    — ส่งทุก Interface พร้อมกัน
# lacp         — IEEE 802.3ad (ต้องการ Switch รองรับ)

# ตัวอย่าง LACP Team Config
sudo nmcli connection add type team \
  con-name team0-lacp \
  ifname team0 \
  team.config '{"runner": {"name": "lacp", "active": true, "fast_rate": true}, "link_watch": {"name": "ethtool"}}'

# ดูสถานะ Teaming แบบละเอียด
sudo teamdctl team0 state view

Bonding กับ VLAN

# สร้าง VLAN บน Bond Interface (Netplan — Ubuntu)
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: false
    eth1:
      dhcp4: false
  bonds:
    bond0:
      interfaces: [eth0, eth1]
      parameters:
        mode: active-backup
        mii-monitor-interval: 100
  vlans:
    bond0.100:
      id: 100
      link: bond0
      addresses:
        - 10.0.100.10/24
    bond0.200:
      id: 200
      link: bond0
      addresses:
        - 10.0.200.10/24
# สร้าง VLAN บน Bond Interface (nmcli — RHEL/Rocky)
# สร้าง VLAN 100 บน bond0
sudo nmcli connection add type vlan \
  con-name bond0.100 \
  ifname bond0.100 \
  dev bond0 \
  id 100 \
  ipv4.addresses "10.0.100.10/24" \
  ipv4.method manual

sudo nmcli connection up bond0.100

Script ตรวจสอบสถานะ Bond อัตโนมัติ

#!/bin/bash
# /usr/local/bin/check-bond.sh
# ตรวจสอบสถานะ Bond และแจ้งเตือนถ้า Interface ตาย

BOND="bond0"
ALERT_EMAIL="[email protected]"
HOSTNAME=$(hostname)

if [ ! -f "/proc/net/bonding/${BOND}" ]; then
    echo "Bond ${BOND} ไม่พบ" | mail -s "[Alert] Bond Not Found on ${HOSTNAME}" "${ALERT_EMAIL}"
    exit 1
fi

# ตรวจสอบจำนวน Active Slaves
active_slaves=$(grep -c "MII Status: up" /proc/net/bonding/${BOND})
total_slaves=$(grep -c "Slave Interface:" /proc/net/bonding/${BOND})

if [ "${active_slaves}" -lt "${total_slaves}" ]; then
    down_count=$((total_slaves - active_slaves))
    echo "${down_count} interface(s) DOWN on ${BOND} (${active_slaves}/${total_slaves} up)" \
        | mail -s "[Alert] Bond Degraded on ${HOSTNAME}" "${ALERT_EMAIL}"
fi

# แสดงสถานะ
echo "Bond: ${BOND}"
echo "Active: ${active_slaves}/${total_slaves}"
grep "Currently Active Slave:" /proc/net/bonding/${BOND}

# เพิ่มใน Crontab ตรวจทุก 5 นาที
# */5 * * * * /usr/local/bin/check-bond.sh

สรุป

Network Bonding รวม Network Interface หลายตัวเพื่อ Failover หรือเพิ่ม Bandwidth โดย Mode 1 (active-backup) เหมาะกับการทำ Failover บน Switch ทั่วไป ส่วน Mode 4 (802.3ad/LACP) ให้ทั้ง Bandwidth และ Failover แต่ต้องการ Switch รองรับ LACP บน Ubuntu ใช้ Netplan กำหนด Bond ใน YAML ส่วนบน RHEL/Rocky ใช้ nmcli ตรวจสอบสถานะได้จาก /proc/net/bonding/bond0 ซึ่งแสดงทั้ง Active Slave, Link Failure Count, และ MII Status ของแต่ละ Interface สำหรับ RHEL/Rocky ยังมี Network Teaming เป็นทางเลือกที่ยืดหยุ่นกว่า แต่ Bonding ยังคงใช้งานได้ดีและเป็นที่นิยมกว่าในทางปฏิบัติ

แนะนำบริการ DE

การตั้งค่า Network Bonding บน Server ต้องการสิทธิ์ Root และสามารถกำหนดค่า Network Interface ได้อย่างอิสระ Cloud VPS ของ DE ให้ Root Access เต็มรูปแบบ รองรับการตั้งค่า Bonding และ Network Configuration ต่าง ๆ เพื่อให้ Server มี High Availability และ Fault Tolerance ตามต้องการ

หากต้องการโฮสต์เว็บไซต์โดยไม่ต้องจัดการ Network Configuration เอง Cloud Hosting ของ DE มีระบบ Network ที่เสถียรและ Redundant พร้อมใช้งาน รองรับการใช้งาน Production ได้โดยไม่ต้องตั้งค่าเพิ่มเติม