Yeah, that moment when you reboot your Ubuntu server and your bonded network interface just sits there dead — frustrating. You spent hours setting up bonding, it worked fine until restart, and now ip link show bond0 shows DOWN
and no machines can reach each other. I've trained a bunch of techs who ran into this exact thing. Here's what actually fixes it.
The Real Fix: Add the Missing auto
Line
Most people write their bonding config in /etc/network/interfaces and forget one line. Open that file:
sudo nano /etc/network/interfaces
Look for the bond interface block. It likely looks like this:
iface bond0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
bond-slaves eth0 eth1
bond-mode 4
bond-miimon 100
bond-lacp-rate 1
bond-xmit_hash_policy layer3+4
Notice what's missing? There's no auto bond0 line above the iface line. Without it, the system never brings the bond up at boot. Add it right before the iface line. Your file should look like:
auto bond0
iface bond0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.1
bond-slaves eth0 eth1
bond-mode 4
bond-miimon 100
bond-lacp-rate 1
bond-xmit_hash_policy layer3+4
Save the file. Then run:
sudo ifdown bond0 && sudo ifup bond0
Watch for error messages. If you don't see any, run ip link show bond0. You should see state UP
. Then test with ping 192.168.1.1 (or your gateway IP).
What you should see: After ifdown, the bond interface disappears. After ifup, it comes back with the correct IP and the link is green. The slave interfaces (eth0, eth1) should show MII Status: up
if you run cat /proc/net/bonding/bond0.
Why This Happens
The auto directive in /etc/network/interfaces tells the system to bring up that interface at boot time. Without it, the system reads the interface definition but never activates it. It's like having the keys to your car but no ignition switch. The weird part is that older Ubuntu versions (like 18.04) sometimes worked without auto because of how networkd handled things. But starting with Ubuntu 20.04 and definitely in 22.04, ifupdown is stricter. Skip the auto line, and your bond stays dead after restart.
Also, if you used netplan instead of ifupdown, the issue is different — but this guide assumes you're using /etc/network/interfaces because that's what most older tutorials recommend. If you switched to netplan, you wouldn't have this problem.
Less Common Variations
Bond module not loading
Sometimes the bonding kernel module doesn't load at boot. Check with lsmod | grep bonding. If nothing shows, add bonding to /etc/modules. One line:
sudo sh -c 'echo bonding >> /etc/modules'
Then reboot. Without the module, no bond interface appears at all, even with auto present.
Slave interfaces not set to manual
Your slave interfaces (eth0, eth1) need to be marked as manual
in /etc/network/interfaces. Example:
auto eth0
iface eth0 inet manual
bond-master bond0
auto eth1
iface eth1 inet manual
bond-master bond0
If you skip the auto eth0 and auto eth1 lines, the slaves never get attached to the bond at boot. The bond comes up but has no slaves — so ip link show bond0 shows up but NO-CARRIER
. Add those auto lines for each slave.
Using NetworkManager instead of ifupdown
If you have NetworkManager running (common on desktop Ubuntu), it might override your bonding config. Disable it for the bond interface:
sudo nmcli device set bond0 managed no
Or just disable NetworkManager entirely for systemd-networkd setups:
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
After that, restart networking: sudo systemctl restart networking.
Prevention: Get It Right the First Time
Do this:
- Always add
auto bond0andauto eth0,auto eth1before their iface blocks. Copy-paste from a known working example — don't rely on memory. - Test after every reboot. Before you walk away from a server,
rebootit and SSH back in. If bonding fails, you catch it immediately. - Keep a backup of the working
/etc/network/interfacesfile. One typo during an edit can break everything.sudo cp /etc/network/interfaces /etc/network/interfaces.backup - Use
systemctl status networkingto check if the service started cleanly. If it's failed,journalctl -xe | grep -i bondusually shows the exact missing auto line.
That's it. No magic. Just a missing auto line that the docs assume you know to add. Now your bond stays up after restart.