3、配置网络绑定(命令行):使用iproute2工具创建bond接口、添加从属接口、配置IP地址

说实话,很多运维兄弟一听到「命令行配网绑」就头大。总觉得要背一堆参数,生怕敲错一个字母把远程连接搞断。我刚开始带团队那会儿,也遇到过类似的事——半夜三点,生产环境网卡挂了,手忙脚乱敲命令,结果 bond 没起来,反而把主网卡也搞 down 了。嗯,从那以后我就养成了一个习惯:先在测试环境把命令跑熟,再上生产。

这一章,我们就用 iproute2 这套工具,手把手把 bond 接口搭起来。你跟着我敲一遍,其实没那么玄乎。

3.1 准备工作:确认内核模块和工具

动手之前,先看看你的系统有没有装 iproute2。现在主流发行版基本都自带,但万一你用的是精简版呢?

# 检查 ip 命令是否可用
ip link show

# 检查 bonding 内核模块是否加载
lsmod | grep bonding

# 如果没加载,手动加载
modprobe bonding

我个人习惯在加载模块时指定一下 mode,省得后面再改:

modprobe bonding mode=1 miimon=100

这里 mode=1 是主备模式,miimon=100 表示每 100 毫秒检测一次链路状态。你想想看,如果不设 miimon,链路断了内核都不知道,那绑定还有什么意义?

小提示: 如果你想让模块开机自动加载,在 /etc/modules-load.d/bonding.conf 里写一行 bonding 就行。参数可以写在 /etc/modprobe.d/bonding.conf 里。

3.2 创建 bond 接口

用 ip link add 命令创建 bond 接口,名字我一般用 bond0:

ip link add bond0 type bond mode 802.3ad miimon 100 lacp_rate fast

这条命令干了三件事:

  • 创建了一个名为 bond0 的虚拟接口
  • 指定类型为 bond
  • 设置模式为 802.3ad(动态链路聚合),链路检测间隔 100ms,LACP 报文发送频率为 fast

为什么我推荐 802.3ad?因为它在交换机侧也配了 LACP,两端协商,比静态的 balance-rr 或 balance-xor 更靠谱。我在一个数据中心项目里遇到过,用 balance-xor 结果流量全走一条链路,查了半天才发现是交换机没配聚合——802.3ad 至少会报错,不会让你「假聚合」。

注意: 创建 bond 接口时,如果系统里已经有同名的接口(比如 bond0 被 NetworkManager 占用了),会报错 File exists。可以用 ip link delete bond0 先删掉再创建。

3.3 添加从属接口

bond 接口创建好了,但它还是个「光杆司令」。得把物理网卡加进去。假设我们有两张网卡 eth0 和 eth1:

# 先把从属接口 down 掉
ip link set eth0 down
ip link set eth1 down

# 添加到 bond0
ip link set eth0 master bond0
ip link set eth1 master bond0

# 启动 bond0
ip link set bond0 up

这里有个细节:添加从属接口前,一定要先把物理网卡 down 掉。为什么?因为如果网卡处于 up 状态,它有自己的 IP 和路由,加到 bond 里会造成冲突。我曾经有一次忘了 down,结果 bond0 起来了,但 eth0 还在跑流量,网络直接乱套。

添加完成后,可以用 ip link show 查看状态:

ip link show bond0
ip link show eth0

你会看到 eth0 和 eth1 的 master 字段指向了 bond0,说明绑定成功。

3.4 配置 IP 地址

bond 接口起来了,接下来配 IP。用 ip addr add 命令:

ip addr add 192.168.1.100/24 dev bond0
ip link set bond0 up

配完之后,用 ip addr show bond0 确认:

6: bond0: <BROADCAST,MULTICAST,MASTER,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff
    inet 192.168.1.100/24 scope global bond0
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feab:cdef/64 scope link
       valid_lft forever preferred_lft forever

看到 state UP 和 inet 192.168.1.100/24,说明配置生效了。

关键点: bond 接口的 MAC 地址默认取自第一个添加的从属接口。如果你希望 bond 有固定的 MAC,可以在创建时指定:ip link add bond0 address 00:11:22:33:44:55 type bond。这在某些交换机 MAC 学习场景下很有用。

3.5 验证绑定状态

配完了,怎么确认 bond 在正常工作?我一般用这几个命令:

# 查看 bond 详细信息
cat /proc/net/bonding/bond0

# 查看从属接口状态
ip link show eth0
ip link show eth1

# 测试连通性
ping -c 4 192.168.1.1

/proc/net/bonding/bond0 这个文件是 bonding 模块暴露的内核信息,里面能看到:

  • 当前激活的从属接口(Active Slave)
  • 每个从属接口的链路状态(MII Status)
  • LACP 协商状态(如果用的是 802.3ad)
  • 收发包统计

举个例子,输出大概长这样:

Ethernet Channel Bonding Driver: v5.10.0-136.el7.x86_64

Bonding Mode: IEEE 802.3ad Dynamic link aggregation
Transmit Hash Policy: layer2 (0)
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

Slave Interface: eth1
MII Status: up
Speed: 1000 Mbps
Duplex: full
Link Failure Count: 0

看到两个 Slave 都是 MII Status: up,说明链路正常。如果其中一个 down 了,bond 会自动把流量切到另一个上——这就是绑定的核心价值。

3.6 完整配置流程一览

我把上面所有步骤串起来,给你一个可以直接复制粘贴的脚本:

#!/bin/bash
# 快速配置 bond0(802.3ad 模式)

# 1. 加载模块
modprobe bonding mode=4 miimon=100

# 2. 创建 bond 接口
ip link add bond0 type bond mode 802.3ad miimon 100 lacp_rate fast

# 3. 添加从属接口
ip link set eth0 down
ip link set eth1 down
ip link set eth0 master bond0
ip link set eth1 master bond0

# 4. 配置 IP
ip addr add 192.168.1.100/24 dev bond0
ip link set bond0 up

# 5. 验证
cat /proc/net/bonding/bond0 | grep -E "MII Status|Speed|Duplex"

这个脚本在 CentOS 7/8、Ubuntu 20.04+ 上都跑过,没出过问题。不过我还是建议你逐条执行,别一股脑全贴进去——万一哪条失败了,你至少知道卡在哪。

3.7 常见问题与避坑

问题 原因 解决办法
bond0 起不来,报错 Operation not supported 内核没加载 bonding 模块,或者内核版本太老不支持 802.3ad 执行 modprobe bonding,或者换用 mode=1(主备)
添加从属接口时提示 Device or resource busy 物理网卡处于 up 状态,或者被其他服务(如 NetworkManager)占用 先 ip link set ethX down,再添加
bond 起来了,但 ping 不通网关 交换机侧没配 LACP,或者两端聚合模式不匹配 检查交换机配置,确保 mode 一致;临时切到 mode=1 测试
拔掉一根网线,业务中断了几秒才恢复 miimon 值太大,或者链路检测机制不灵敏 把 miimon 降到 50 甚至 10,同时配合 updelay 和 downdelay 参数
血的教训: 我曾经在生产环境配 bond,忘了把 eth0 从原来的网桥里摘出来,结果 bond0 一启动,网桥和 bond 抢 MAC 地址,整个二层网络广播风暴。所以,添加从属接口之前,一定要确认它没有被其他虚拟设备(网桥、VLAN、Docker 等)占用。

3.8 知识结构图

下面这张图帮你理清整个配置流程和关键概念:

使用 iproute2 配置网络绑定(bond0) 1. 加载 bonding 模块 2. 创建 bond0 接口 3. 添加从属接口 4. 配置 IP 地址 5. 验证绑定状态 核心参数:mode(模式) | miimon(检测间隔) | lacp_rate(LACP 频率) mode=1 主备模式 容错,无负载均衡 mode=2 balance-xor 静态负载均衡 mode=4 802.3ad 动态链路聚合 mode=6 balance-alb 自适应负载均衡 验证命令:cat /proc/net/bonding/bond0 | ip link show | ping

这张图把整个流程分成了五个步骤,外加核心参数和四种常用模式。你照着这个顺序操作,基本不会乱。记住:先加载模块,再创建接口,然后添加从属,最后配 IP 和验证——顺序错了,bond 起不来。

3.9 写在最后

用 iproute2 配 bond,说白了就是几条命令的事。但真正考验人的,是对模式的理解和对异常的处理。我见过太多人把 bond 配好了,一拔网线就炸——要么是 miimon 没设,要么是交换机侧没配。

所以,我建议你配完之后,一定要做故障演练:拔一根网线,看看业务断几秒;插回去,看看能不能自动恢复。只有亲手验证过,你才敢说这个 bond 是「靠谱」的。