Set up network bonding for link aggregation and failover protection while implementing VLAN tagging for network segmentation. This tutorial covers bond configuration with Netplan and NetworkManager across multiple interfaces.
Prerequisites
- Root or sudo access
- Two or more network interfaces
- Basic understanding of networking concepts
- Switch with VLAN/trunking support
What this solves
Network bonding (link aggregation) combines multiple network interfaces into a single logical bond interface, providing increased bandwidth and redundancy. VLAN tagging allows you to segment network traffic across the same physical infrastructure, improving security and organization. This configuration is essential for production servers requiring high availability and network isolation.
Understanding network bonding modes
Linux supports several bonding modes, each optimized for different use cases. The most common modes are:
| Mode | Name | Description | Use Case |
|---|---|---|---|
| 0 | balance-rr | Round-robin load balancing | Maximum throughput, requires switch support |
| 1 | active-backup | One active, others standby | Failover protection, works with any switch |
| 2 | balance-xor | XOR hash load balancing | Load balancing with fault tolerance |
| 4 | 802.3ad | IEEE 802.3ad LACP | Standards-based aggregation, requires LACP |
| 5 | balance-tlb | Transmit load balancing | Outbound load balancing without switch config |
| 6 | balance-alb | Adaptive load balancing | Bidirectional load balancing without switch config |
Step-by-step configuration
Install bonding kernel module
Load the bonding module and ensure it loads on boot. This module provides the bonding functionality in the Linux kernel.
sudo modprobe bonding
echo 'bonding' | sudo tee -a /etc/modules
Identify network interfaces
List available network interfaces to determine which ones you want to bond together. You'll need at least two physical interfaces for bonding.
ip link show
lshw -class network -short
Configure bonding with Netplan (Ubuntu/Debian)
Create a Netplan configuration for network bonding with VLAN tagging. This example uses active-backup mode for failover protection.
network:
version: 2
renderer: networkd
ethernets:
enp1s0:
dhcp4: no
dhcp6: no
enp2s0:
dhcp4: no
dhcp6: no
bonds:
bond0:
interfaces:
- enp1s0
- enp2s0
parameters:
mode: active-backup
primary: enp1s0
mii-monitor-interval: 100
fail-over-mac-policy: active
dhcp4: no
dhcp6: no
vlans:
bond0.100:
id: 100
link: bond0
addresses:
- 192.168.100.10/24
routes:
- to: 0.0.0.0/0
via: 192.168.100.1
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
bond0.200:
id: 200
link: bond0
addresses:
- 192.168.200.10/24
Configure bonding with NetworkManager (RHEL-based)
Use NetworkManager commands to create bond and VLAN interfaces on AlmaLinux, Rocky Linux, and Fedora systems.
# Create the bond interface
sudo nmcli connection add type bond ifname bond0 con-name bond0 bond.options "mode=active-backup,miimon=100,primary=enp1s0"
Add slave interfaces to the bond
sudo nmcli connection add type ethernet ifname enp1s0 con-name bond0-slave1 master bond0
sudo nmcli connection add type ethernet ifname enp2s0 con-name bond0-slave2 master bond0
Create VLAN interfaces on the bond
sudo nmcli connection add type vlan ifname bond0.100 con-name vlan100 dev bond0 vlan.id 100 ip4 192.168.100.10/24 gw4 192.168.100.1
sudo nmcli connection add type vlan ifname bond0.200 con-name vlan200 dev bond0 vlan.id 200 ip4 192.168.200.10/24
Apply network configuration
Apply the network configuration and restart networking services to activate the bonding and VLAN setup.
sudo netplan apply
Configure advanced bonding mode (802.3ad LACP)
For maximum performance with switch support, configure 802.3ad LACP mode. This requires LACP configuration on your switch.
network:
version: 2
renderer: networkd
ethernets:
enp1s0:
dhcp4: no
dhcp6: no
enp2s0:
dhcp4: no
dhcp6: no
bonds:
bond0:
interfaces:
- enp1s0
- enp2s0
parameters:
mode: 802.3ad
lacp-rate: fast
mii-monitor-interval: 100
transmit-hash-policy: layer3+4
dhcp4: no
dhcp6: no
Configure trunk interface for multiple VLANs
Set up a trunk interface to carry multiple VLAN tags across the bonded connection. This allows you to segment traffic effectively.
# Create additional VLAN interfaces
sudo ip link add link bond0 name bond0.300 type vlan id 300
sudo ip link add link bond0 name bond0.400 type vlan id 400
Assign IP addresses to VLAN interfaces
sudo ip addr add 192.168.300.10/24 dev bond0.300
sudo ip addr add 192.168.400.10/24 dev bond0.400
Bring interfaces up
sudo ip link set bond0.300 up
sudo ip link set bond0.400 up
Set up bond monitoring script
Create a monitoring script to track bond status and automatically handle failover events.
#!/bin/bash
Bond monitoring script
BOND_INTERFACE="bond0"
LOG_FILE="/var/log/bond-monitor.log"
log_message() {
echo "$(date): $1" >> $LOG_FILE
}
check_bond_status() {
if [ -f "/proc/net/bonding/$BOND_INTERFACE" ]; then
ACTIVE_SLAVE=$(grep "Currently Active Slave" /proc/net/bonding/$BOND_INTERFACE | awk '{print $4}')
BOND_STATUS=$(grep "Bonding Mode" /proc/net/bonding/$BOND_INTERFACE)
log_message "Bond Status: $BOND_STATUS"
log_message "Active Slave: $ACTIVE_SLAVE"
# Check for any down slaves
grep -A 1 "Slave Interface" /proc/net/bonding/$BOND_INTERFACE | grep -B 1 "MII Status: down" | grep "Slave Interface" | while read line; do
FAILED_SLAVE=$(echo $line | awk '{print $3}')
log_message "WARNING: Slave interface $FAILED_SLAVE is down"
done
else
log_message "ERROR: Bond interface $BOND_INTERFACE not found"
fi
}
check_bond_status
sudo chmod 755 /usr/local/bin/bond-monitor.sh
Create systemd timer for bond monitoring
Set up automated monitoring using systemd timers to regularly check bond status and log any issues.
[Unit]
Description=Bond Interface Monitor
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/bond-monitor.sh
User=root
StandardOutput=journal
StandardError=journal
[Unit]
Description=Run bond monitor every 5 minutes
Requires=bond-monitor.service
[Timer]
OnCalendar=*:0/5
Persistent=true
[Install]
WantedBy=timers.target
sudo systemctl daemon-reload
sudo systemctl enable --now bond-monitor.timer
Test failover scenarios
Verify that your bonding configuration properly handles interface failures and maintains connectivity.
Simulate interface failure
Test failover by bringing down the primary interface and monitoring bond behavior.
# Check current active slave
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"
Bring down primary interface
sudo ip link set enp1s0 down
Check new active slave
cat /proc/net/bonding/bond0 | grep "Currently Active Slave"
Test connectivity
ping -c 4 192.168.100.1
Bring primary interface back up
sudo ip link set enp1s0 up
Monitor bond performance
Use monitoring tools to track bond interface performance and verify load balancing behavior.
# Monitor real-time interface statistics
watch -n 1 'cat /proc/net/dev | grep -E "(bond0|enp[12]s0)"'
Check bonding driver information
modinfo bonding
View detailed bond status
cat /proc/net/bonding/bond0
Configure VLAN switching and routing
Set up advanced VLAN routing to enable communication between different network segments through your bonded interface.
Enable IP forwarding
Configure the system to forward packets between VLAN interfaces for inter-VLAN routing.
echo 'net.ipv4.ip_forward=1' | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
Configure VLAN routing rules
Set up routing rules to control traffic flow between different VLAN segments.
# Add routing rules for VLAN communication
sudo ip route add 192.168.200.0/24 via 192.168.100.1 dev bond0.100
sudo ip route add 192.168.300.0/24 via 192.168.100.1 dev bond0.100
Make routes persistent
echo '192.168.200.0/24 via 192.168.100.1 dev bond0.100' | sudo tee -a /etc/systemd/network/bond0.network
echo '192.168.300.0/24 via 192.168.100.1 dev bond0.100' | sudo tee -a /etc/systemd/network/bond0.network
Verify your setup
Confirm that your network bonding and VLAN configuration is working correctly across all interfaces.
# Check bond interface status
ip link show bond0
cat /proc/net/bonding/bond0
Verify VLAN interfaces
ip addr show bond0.100
ip addr show bond0.200
Test connectivity on each VLAN
ping -I bond0.100 -c 4 192.168.100.1
ping -I bond0.200 -c 4 192.168.200.1
Check routing table
ip route show
Verify bond mode and parameters
ethtool bond0
Monitor bond statistics
cat /sys/class/net/bond0/statistics/rx_bytes
cat /sys/class/net/bond0/statistics/tx_bytes
Troubleshoot common bonding and VLAN issues
Use these diagnostic steps to identify and resolve network bonding problems.
| Symptom | Cause | Fix |
|---|---|---|
| Bond interface not created | Bonding module not loaded | sudo modprobe bonding; echo bonding | sudo tee -a /etc/modules |
| Slave interfaces not bonding | Interfaces already configured with IP | sudo ip addr flush dev enp1s0; sudo ip addr flush dev enp2s0 |
| VLAN traffic not working | Switch port not configured as trunk | Configure switch port for VLAN tagging/trunking |
| Bond failover not working | MII monitoring disabled | Add mii-monitor-interval: 100 to bond parameters |
| 802.3ad mode not working | LACP not enabled on switch | Enable LACP on switch port channel |
| Poor performance | Wrong transmit hash policy | Set transmit-hash-policy: layer3+4 for better distribution |
| NetworkManager conflicts | Multiple network managers | sudo systemctl disable NetworkManager or use nmcli exclusively |
Security and performance optimization
Implement additional security measures and performance optimizations for your bonded network configuration. This builds on the security practices covered in our nftables security hardening tutorial.
Configure network security
Set up firewall rules specific to your VLAN configuration and enable network security features.
# Configure firewall rules for VLANs
sudo nft add table inet vlan_filter
sudo nft add chain inet vlan_filter input { type filter hook input priority 0\; }
sudo nft add rule inet vlan_filter input iifname "bond0.100" ip saddr 192.168.100.0/24 accept
sudo nft add rule inet vlan_filter input iifname "bond0.200" ip saddr 192.168.200.0/24 accept
Enable ARP filtering to prevent ARP spoofing
echo 'net.ipv4.conf.all.arp_filter=1' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.conf.bond0.arp_filter=1' | sudo tee -a /etc/sysctl.conf
Optimize network performance
Configure kernel parameters and interface settings for optimal bonding performance.
# Optimize network buffers
echo 'net.core.rmem_max = 134217728' | sudo tee -a /etc/sysctl.conf
echo 'net.core.wmem_max = 134217728' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_rmem = 4096 87380 134217728' | sudo tee -a /etc/sysctl.conf
echo 'net.ipv4.tcp_wmem = 4096 65536 134217728' | sudo tee -a /etc/sysctl.conf
Apply settings
sudo sysctl -p
Configure interface ring buffers
sudo ethtool -G enp1s0 rx 4096 tx 4096
sudo ethtool -G enp2s0 rx 4096 tx 4096
Monitor and maintain bond configuration
Set up comprehensive monitoring and maintenance procedures for your bonded network interfaces. For additional monitoring capabilities, see our Linux performance monitoring tutorial.
Create comprehensive monitoring
Set up detailed logging and alerting for bond interface status changes.
#!/bin/bash
BOND="bond0"
LOG_FILE="/var/log/bond-health.log"
ALERT_EMAIL="admin@example.com"
Function to log with timestamp
log_event() {
echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" >> $LOG_FILE
}
Check bond operational status
if [ ! -f "/proc/net/bonding/$BOND" ]; then
log_event "CRITICAL: Bond interface $BOND not found"
exit 1
fi
Parse bond status
BOND_MODE=$(grep "Bonding Mode:" /proc/net/bonding/$BOND | cut -d: -f2 | xargs)
ACTIVE_SLAVE=$(grep "Currently Active Slave:" /proc/net/bonding/$BOND | cut -d: -f2 | xargs)
SLAVE_COUNT=$(grep "Slave Interface:" /proc/net/bonding/$BOND | wc -l)
UP_SLAVES=$(grep -A 1 "Slave Interface:" /proc/net/bonding/$BOND | grep "MII Status: up" | wc -l)
log_event "Bond $BOND - Mode: $BOND_MODE, Active: $ACTIVE_SLAVE, Slaves: $UP_SLAVES/$SLAVE_COUNT"
Alert on issues
if [ $UP_SLAVES -lt 1 ]; then
log_event "ALERT: No active slaves in bond $BOND"
fi
if [ $UP_SLAVES -eq 1 ] && [ $SLAVE_COUNT -gt 1 ]; then
log_event "WARNING: Only one slave active in bond $BOND - redundancy lost"
fi
sudo chmod 755 /usr/local/bin/bond-health-check.sh
Add to cron for regular monitoring
echo "/5 * /usr/local/bin/bond-health-check.sh" | sudo crontab -
Common issues
| Symptom | Cause | Fix |
|---|---|---|
| Bond interface not created | Bonding module not loaded | sudo modprobe bonding; echo bonding | sudo tee -a /etc/modules |
| Slave interfaces won't join bond | Interfaces have existing IP configuration | sudo ip addr flush dev enp1s0; sudo ip addr flush dev enp2s0 |
| VLAN traffic not passing | Switch port not configured as trunk | Configure switch port for 802.1Q trunking |
| Failover not working | Missing MII monitoring | Add mii-monitor-interval: 100 to bond configuration |
| 802.3ad mode fails | LACP not configured on switch | Enable LACP/port-channel on connected switch ports |
| Uneven load distribution | Suboptimal hash policy | Use transmit-hash-policy: layer3+4 for better balance |
| Configuration not persistent | Network manager conflicts | Use consistent configuration method (Netplan or NetworkManager) |
| Poor bonding performance | Interface speed/duplex mismatch | sudo ethtool -s enp1s0 speed 1000 duplex full autoneg on |
Next steps
- Configure HAProxy load balancing to complement your bonded network setup
- Set up BGP routing with FRRouting for advanced network routing capabilities
- Configure network bridging with VLAN support for virtualization environments
- Set up network monitoring with SNMP to monitor your bonded interfaces
Automated install script
Run this to automate the entire setup
#!/usr/bin/env bash
set -euo pipefail
# Colors for output
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color
# Configuration variables
BOND_INTERFACE="bond0"
BOND_MODE="active-backup"
VLAN_IDS=(100 200)
VLAN_IPS=("192.168.100.10/24" "192.168.200.10/24")
GATEWAY="192.168.100.1"
DNS_SERVERS="8.8.8.8 8.8.4.4"
# Function to print colored output
print_status() {
echo -e "${GREEN}[INFO]${NC} $1"
}
print_warning() {
echo -e "${YELLOW}[WARNING]${NC} $1"
}
print_error() {
echo -e "${RED}[ERROR]${NC} $1"
}
# Usage message
usage() {
echo "Usage: $0 [interface1] [interface2] [bond_mode]"
echo " interface1: First network interface (default: auto-detect)"
echo " interface2: Second network interface (default: auto-detect)"
echo " bond_mode: Bonding mode (default: active-backup)"
echo " Available modes: active-backup, balance-rr, balance-xor, 802.3ad"
exit 1
}
# Cleanup function for rollback
cleanup() {
print_error "Script failed. Attempting rollback..."
if [[ "$PKG_MGR" == "apt" ]]; then
if [[ -f /etc/netplan/99-network-bonding.yaml.backup ]]; then
mv /etc/netplan/99-network-bonding.yaml.backup /etc/netplan/99-network-bonding.yaml
netplan apply
fi
else
nmcli connection show | grep -E "(bond0|vlan)" | awk '{print $1}' | xargs -I {} nmcli connection delete {} 2>/dev/null || true
fi
}
trap cleanup ERR
# Check for root privileges
if [[ $EUID -ne 0 ]]; then
print_error "This script must be run as root or with sudo"
exit 1
fi
# Auto-detect distribution
print_status "[1/8] Detecting distribution..."
if [[ -f /etc/os-release ]]; then
. /etc/os-release
case "$ID" in
ubuntu|debian)
PKG_MGR="apt"
PKG_INSTALL="apt install -y"
NETWORK_MGR="netplan"
;;
almalinux|rocky|centos|rhel|ol|fedora)
PKG_MGR="dnf"
PKG_INSTALL="dnf install -y"
NETWORK_MGR="networkmanager"
;;
amzn)
PKG_MGR="yum"
PKG_INSTALL="yum install -y"
NETWORK_MGR="networkmanager"
;;
*)
print_error "Unsupported distribution: $ID"
exit 1
;;
esac
else
print_error "Cannot detect distribution (/etc/os-release not found)"
exit 1
fi
print_status "Detected distribution: $ID using $NETWORK_MGR"
# Parse arguments
if [[ $# -gt 0 && $1 == "-h" || $1 == "--help" ]]; then
usage
fi
# Auto-detect network interfaces if not provided
print_status "[2/8] Detecting network interfaces..."
AVAILABLE_INTERFACES=($(ip link show | grep -E '^[0-9]+: (en|eth)' | cut -d':' -f2 | sed 's/^ *//'))
if [[ ${#AVAILABLE_INTERFACES[@]} -lt 2 ]]; then
print_error "At least 2 network interfaces are required for bonding"
exit 1
fi
INTERFACE1=${1:-${AVAILABLE_INTERFACES[0]}}
INTERFACE2=${2:-${AVAILABLE_INTERFACES[1]}}
BOND_MODE=${3:-$BOND_MODE}
print_status "Using interfaces: $INTERFACE1, $INTERFACE2 with mode: $BOND_MODE"
# Install required packages
print_status "[3/8] Installing required packages..."
if [[ "$PKG_MGR" == "apt" ]]; then
apt update
$PKG_INSTALL ifenslave vlan net-tools
else
$PKG_INSTALL NetworkManager NetworkManager-team
fi
# Load bonding kernel module
print_status "[4/8] Loading bonding kernel module..."
modprobe bonding
if ! grep -q "^bonding" /etc/modules 2>/dev/null; then
echo "bonding" >> /etc/modules
fi
# Configure network bonding based on distribution
print_status "[5/8] Configuring network bonding..."
if [[ "$NETWORK_MGR" == "netplan" ]]; then
# Ubuntu/Debian with Netplan
NETPLAN_CONFIG="/etc/netplan/99-network-bonding.yaml"
# Backup existing configuration
if [[ -f "$NETPLAN_CONFIG" ]]; then
cp "$NETPLAN_CONFIG" "$NETPLAN_CONFIG.backup"
fi
cat > "$NETPLAN_CONFIG" << EOF
network:
version: 2
renderer: networkd
ethernets:
$INTERFACE1:
dhcp4: no
dhcp6: no
$INTERFACE2:
dhcp4: no
dhcp6: no
bonds:
$BOND_INTERFACE:
interfaces:
- $INTERFACE1
- $INTERFACE2
parameters:
mode: $BOND_MODE
primary: $INTERFACE1
mii-monitor-interval: 100
fail-over-mac-policy: active
dhcp4: no
dhcp6: no
vlans:
EOF
# Add VLAN configurations
for i in "${!VLAN_IDS[@]}"; do
VLAN_ID=${VLAN_IDS[$i]}
VLAN_IP=${VLAN_IPS[$i]}
cat >> "$NETPLAN_CONFIG" << EOF
$BOND_INTERFACE.$VLAN_ID:
id: $VLAN_ID
link: $BOND_INTERFACE
addresses:
- $VLAN_IP
EOF
# Add gateway and DNS for the first VLAN
if [[ $i -eq 0 ]]; then
cat >> "$NETPLAN_CONFIG" << EOF
routes:
- to: 0.0.0.0/0
via: $GATEWAY
nameservers:
addresses:
- 8.8.8.8
- 8.8.4.4
EOF
fi
done
chmod 644 "$NETPLAN_CONFIG"
chown root:root "$NETPLAN_CONFIG"
else
# RHEL-based with NetworkManager
# Create bond interface
nmcli connection add type bond ifname "$BOND_INTERFACE" con-name "$BOND_INTERFACE" \
bond.options "mode=$BOND_MODE,miimon=100,primary=$INTERFACE1"
# Add slave interfaces
nmcli connection add type ethernet ifname "$INTERFACE1" con-name "$BOND_INTERFACE-slave1" master "$BOND_INTERFACE"
nmcli connection add type ethernet ifname "$INTERFACE2" con-name "$BOND_INTERFACE-slave2" master "$BOND_INTERFACE"
# Create VLAN interfaces
for i in "${!VLAN_IDS[@]}"; do
VLAN_ID=${VLAN_IDS[$i]}
VLAN_IP=${VLAN_IPS[$i]%/*}
VLAN_PREFIX=${VLAN_IPS[$i]#*/}
if [[ $i -eq 0 ]]; then
nmcli connection add type vlan ifname "$BOND_INTERFACE.$VLAN_ID" con-name "vlan$VLAN_ID" \
dev "$BOND_INTERFACE" vlan.id "$VLAN_ID" ip4 "$VLAN_IP/$VLAN_PREFIX" gw4 "$GATEWAY"
else
nmcli connection add type vlan ifname "$BOND_INTERFACE.$VLAN_ID" con-name "vlan$VLAN_ID" \
dev "$BOND_INTERFACE" vlan.id "$VLAN_ID" ip4 "$VLAN_IP/$VLAN_PREFIX"
fi
done
# Set DNS for the primary connection
nmcli connection modify vlan${VLAN_IDS[0]} ipv4.dns "$DNS_SERVERS"
fi
# Apply network configuration
print_status "[6/8] Applying network configuration..."
if [[ "$NETWORK_MGR" == "netplan" ]]; then
netplan apply
else
# Bring up NetworkManager connections
nmcli connection up "$BOND_INTERFACE"
nmcli connection up "$BOND_INTERFACE-slave1"
nmcli connection up "$BOND_INTERFACE-slave2"
for VLAN_ID in "${VLAN_IDS[@]}"; do
nmcli connection up "vlan$VLAN_ID"
done
fi
# Wait for interfaces to come up
sleep 5
# Configure firewall for VLAN traffic
print_status "[7/8] Configuring firewall..."
if command -v ufw >/dev/null 2>&1; then
# Ubuntu/Debian with UFW
for VLAN_ID in "${VLAN_IDS[@]}"; do
ufw allow in on "$BOND_INTERFACE.$VLAN_ID" 2>/dev/null || true
done
elif command -v firewall-cmd >/dev/null 2>&1; then
# RHEL-based with firewalld
systemctl start firewalld 2>/dev/null || true
for VLAN_ID in "${VLAN_IDS[@]}"; do
firewall-cmd --permanent --zone=public --add-interface="$BOND_INTERFACE.$VLAN_ID" 2>/dev/null || true
done
firewall-cmd --reload 2>/dev/null || true
fi
# Verification checks
print_status "[8/8] Verifying configuration..."
# Check bond interface
if ip link show "$BOND_INTERFACE" >/dev/null 2>&1; then
print_status "Bond interface $BOND_INTERFACE created successfully"
# Check bond status
if [[ -f "/proc/net/bonding/$BOND_INTERFACE" ]]; then
BOND_STATUS=$(cat "/proc/net/bonding/$BOND_INTERFACE" | grep -E "(Bonding Mode|MII Status)" | head -2)
print_status "Bond status:\n$BOND_STATUS"
fi
else
print_error "Bond interface $BOND_INTERFACE not found"
exit 1
fi
# Check VLAN interfaces
for VLAN_ID in "${VLAN_IDS[@]}"; do
if ip link show "$BOND_INTERFACE.$VLAN_ID" >/dev/null 2>&1; then
VLAN_IP=$(ip addr show "$BOND_INTERFACE.$VLAN_ID" | grep -oP 'inet \K[\d.]+/\d+' || echo "No IP")
print_status "VLAN $VLAN_ID interface created with IP: $VLAN_IP"
else
print_warning "VLAN $VLAN_ID interface not found"
fi
done
# Test connectivity
print_status "Testing connectivity..."
if ping -c 2 -W 5 "$GATEWAY" >/dev/null 2>&1; then
print_status "Gateway connectivity: OK"
else
print_warning "Gateway connectivity: FAILED (may be expected if gateway is not configured)"
fi
print_status "Network bonding and VLAN configuration completed successfully!"
print_status "Bond interface: $BOND_INTERFACE"
print_status "Mode: $BOND_MODE"
print_status "Physical interfaces: $INTERFACE1, $INTERFACE2"
print_status "VLAN IDs: ${VLAN_IDS[*]}"
print_warning "Please verify network connectivity and switch configuration before rebooting!"
Review the script before running. Execute with: bash install.sh