一、网卡bond介绍
1.概念
网卡 bond 是一种网络技术,也被称为链路聚合、端口绑定或接口绑定,能将多个物理网络接口组合成一个逻辑接口。
2.工作原理及作用
| bond模式 | 增加网络带宽 | 提高网络可靠性 | 实现负载均衡 | 适用场景 | 备注 |
|---|---|---|---|---|---|
| mode 0 : balance-rr(轮询模式) | 原理:依次将数据包按顺序分配到各个成员接口发送。例如有三个成员接口,第一个数据包从接口 1 发送,第二个从接口 2 发送,第三个从接口 3 发送,之后循环。
| 原理:按顺序依次在成员接口上发送数据包,均匀分配流量。
| 适用于需要高带宽且对数据包顺序要求不高的环境,例如数据中心内部服务器之间的高速数据传输。 | 需要交换机设置 | |
| mode 1 : active-backup(主备模式) | 原理:设置一个主接口和多个备用接口,正常情况下只有主接口工作,当主接口出现故障时,自动切换到备用接口中的一个继续工作。
| 适用于对网络可靠性要求较高,但对带宽需求相对稳定的场景,像关键业务服务器的网络连接。 | |||
| mode 2 : balance-xor(基于异或的负载均衡) | 原理:根据数据包的源 mac 地址、目标 mac 地址或 ip 地址等信息通过异或算法计算,根据结果选择成员接口发送。
| 原理:依据数据包的相关地址信息计算结果选择接口发送,一定程度上分散流量。
| 适用于对数据包顺序有要求且需要一定负载均衡的场景,如视频流传输。 | 需要交换机设置 | |
| mode 3 : broadcast(广播模式) | 这种模式使用较少,主要用于一些特殊的测试环境或对网络可靠性要求极高但对带宽利用效率不敏感的场景。 | 需要交换机设置 | |||
| mode 4 : 802.3ad(动态链路聚合) | 原理:需交换机支持 802.3ad 协议,通过链路聚合控制协议(lacp)与交换机协商,动态将流量分配到成员接口。
| 原理:通过 lacp 协议与交换机协商,当某个成员接口出现故障时,协议能自动检测到并将流量重新分配到其他正常的接口上。
| 原理:通过 lacp 协议与交换机动态协商,根据接口状态和带宽使用情况分配流量。
| 适用于需要高带宽和高可靠性的企业网络环境,如数据中心的核心交换机与服务器之间的连接。 | 需要交换机设置 |
| mode 5 : balance-tlb(传输负载均衡) | 原理:无需交换机特殊支持,根据成员接口当前负载动态分配发送流量,接收流量由单个接口完成。
| 原理:根据成员接口当前负载动态分配发送流量。
| 适用于发送流量较大,但接收流量相对稳定的场景,如文件服务器。 | ||
| mode 6 : balance-alb(自适应负载均衡) | 原理:是 balance - tlb 的增强版,不仅能动态分配发送流量,还能通过 arp 协商动态分配接收流量。
| 原理:在流量分配过程中,当某个成员接口故障时,能自动将流量转移到其他正常接口。
| 原理:在发送和接收方向都能根据接口情况和 arp 协商动态分配流量。
| 适用于对网络带宽和性能要求极高的场景,如云计算数据中心。 |
常用的有三种:
mode=0:平衡负载模式,有自动备援,但需要”switch”支援及设定。
mode=1:自动备援模式,其中一条线若断线,其他线路将会自动备援。
mode=6:平衡负载模式,有自动备援。
二、网卡bond设置
方法一:基于配置文件配置(bond=0)
1.查看可用网卡:使用ifconfig -a或ip addr show命令查看系统中的可用网卡,确定要绑定的物理网卡,如eth0、eth1。
2.创建或编辑物理网卡配置文件:在/etc/sysconfig/network-scripts/目录下,编辑要绑定的物理网卡的配置文件。例如,对于eth0和eth1,打开对应的ifcfg-eth0和ifcfg-eth1文件。在文件中添加或修改以下内容:
device=eth0 或 eth1 onboot=yes bootproto=none master=bond0 slave=yes userctl=no
3.创建或编辑 bond 接口配置文件:在同一目录下创建或编辑ifcfg-bond0文件,内容如下:
type=ethernet device=bond0 onboot=yes bootproto=static ipaddr=192.168.1.100 netmask=255.255.255.0 gateway=192.168.1.1 dns1=8.8.8.8 bonding_opts="miimon=100 mode=0 fail_over_mac=1"
其中bonding_opts中的miimon表示链路监测间隔,其值为 100 表示每 100 毫秒对网络链路的状态进行一次监测;mode指定 bond 模式,mode=0 表示采用轮询模式;fail_over_mac用于设置故障切换时的 mac 地址选项,fail_over_mac=1 表示在主备切换时,绑定设备的 mac 地址会切换为当前活动接口的 mac 地址。
4.重启服务器:使用reboot重启服务器使配置生效。
方法二:基于 nmcli 命令配置(bond=1)(推荐)
1.查看可用网卡
使用nmcli device status命令查看系统中的可用网卡,确定要绑定到bond1的物理网卡,比如ens224和ens256。

2.创建 bond1 接口
执行以下命令创建名为bond1的 bond 接口,并指定模式为balance-rr(轮询模式),你也可以根据需求将模式修改为其他模式,如active-backup等。
nmcli connection add type bond ifname bond1 mode balance-rr
备注:
# 创建bond0 nmcli connection add type bond ifname bond0 mode active-backup # 创建bond1 nmcli connection add type bond ifname bond1 mode balance-rr # 创建bond2 nmcli connection add type bond ifname bond2 mode balance-xor # 创建bond3 nmcli connection add type bond ifname bond3 mode broadcast # 创建bond4 nmcli connection add type bond ifname bond4 mode 802.3ad # 创建bond5 nmcli connection add type bond ifname bond5 mode balance-tlb # 创建bond6 nmcli connection add type bond ifname bond6 mode balance-alb
3.配置 bond1 的 ip 等信息
若要设置静态 ip 地址,可使用以下命令。假设要设置 ip 地址为192.168.10.81,子网掩码为255.255.255.0,网关为192.168.10.251
nmcli connection modify bond-bond1 ipv4.addresses 192.168.10.81/24 ipv4.gateway 192.168.10.251 ipv4.method manual

若要使用 dhcp 获取 ip 地址,则执行:
nmcli connection modify bond-bond1 ipv4.method auto
4.添加物理网卡到 bond1
将ens224和ens256添加到bond1,执行以下命令:
nmcli connection add type bond-slave ifname ens224 master bond-bond1 nmcli connection add type bond-slave ifname ens256 master bond-bond1
5.启用 bond1 及相关连接
nmcli connection reload nmcli connection up bond-bond1 reboot
6.查看 bond1 配置及状态
使用nmcli connection show bond-bond1命令查看bond1的详细配置信息,使用nmcli device status命令查看设备状态,确保bond1及相关物理网卡已正确配置和启用。配置完成后,还可以使用ping命令等测试网络连接是否正常。
使用cat /proc/net/bonding/bond1查看bond1的状态,确认是否配置成功。

方法三:使用脚本
#!/usr/bin/env bash
set -euo pipefail
need_cmd() { command -v "$1" >/dev/null 2>&1 || { echo "缺少命令: $1"; exit 1; }; }
need_cmd nmcli
need_cmd ip
echo "=== bond 自动化配置脚本 ==="
# 读取可用物理网卡(排除 lo、bond、vlan、bridge、tun、docker 等)
mapfile -t ifaces < <(
nmcli -t -f device,type device status |
awk -f: '
$2=="ethernet" || $2=="infiniband" {
dev=$1;
if (dev!="lo" && dev!~/(^bond|^br|^virbr|^docker|^veth|^tun|^tap|^wg|^sit|^gre|^vlan)/) print dev
}'
)
if (( ${#ifaces[@]} < 2 )); then
echo "可用物理网卡少于 2 块,无法创建 bond。"
nmcli device status
exit 1
fi
echo
echo "发现可用网卡:"
for i in "${!ifaces[@]}"; do
dev="${ifaces[$i]}"
state="$(nmcli -t -f device,state device status | awk -f: -v d="$dev" '$1==d{print $2}')"
mac="$(nmcli -t -f general.hwaddr device show "$dev" 2>/dev/null | cut -d: -f2- || true)"
ip4="$(ip -4 -o addr show "$dev" 2>/dev/null | awk '{print $4}' | head -n1 || true)"
printf " [%d] %-12s state=%-12s ip=%-18s mac=%s\n" "$i" "$dev" "$state" "${ip4:-none}" "${mac:-unknown}"
done
echo
read -rp "请输入 bond 名称(默认 bond0): " bond_name
bond_name="${bond_name:-bond0}"
echo
echo "请选择 bond mode:"
echo " 1) balance-rr (轮询,需交换机支持/容忍乱序)"
echo " 2) active-backup(主备,最稳,无需交换机特殊配置)"
echo " 3) balance-xor (基于 hash 分流,部分场景需配合交换机)"
echo " 4) broadcast"
echo " 5) 802.3ad (lacp,推荐生产;交换机需做链路聚合)"
echo " 6) balance-tlb"
echo " 7) balance-alb"
read -rp "输入序号(默认 2): " mode_no
mode_no="${mode_no:-2}"
case "$mode_no" in
1) bond_mode="balance-rr" ;;
2) bond_mode="active-backup" ;;
3) bond_mode="balance-xor" ;;
4) bond_mode="broadcast" ;;
5) bond_mode="802.3ad" ;;
6) bond_mode="balance-tlb" ;;
7) bond_mode="balance-alb" ;;
*) echo "无效选择"; exit 1 ;;
esac
echo
read -rp "请输入 ipv4 地址(如 192.168.100.1): " ipaddr
read -rp "请输入 cidr 前缀(如 24): " prefix
addr_cidr="${ipaddr}/${prefix}"
read -rp "是否配置网关? (y/n): " gw_yn
gw_yn="${gw_yn:-n}"
gateway=""
if [[ "$gw_yn" =~ ^[yy]$ ]]; then
read -rp "请输入网关(如 192.168.100.254): " gateway
fi
read -rp "是否配置 dns? (y/n): " dns_yn
dns_yn="${dns_yn:-n}"
dns_servers=""
if [[ "$dns_yn" =~ ^[yy]$ ]]; then
read -rp "请输入 dns(可多个,用逗号分隔,如 223.5.5.5,8.8.8.8): " dns_servers
fi
echo
echo "请选择两块(或多块)网卡作为 slave(输入序号,用空格分隔,例如:0 1):"
read -rp "slave 序号: " -a idx
if (( ${#idx[@]} < 2 )); then
echo "至少选择 2 块网卡。"
exit 1
fi
slaves=()
for id in "${idx[@]}"; do
[[ "$id" =~ ^[0-9]+$ ]] || { echo "序号非法: $id"; exit 1; }
(( id < ${#ifaces[@]} )) || { echo "越界序号: $id"; exit 1; }
slaves+=("${ifaces[$id]}")
done
# 检查重复
uniq_count="$(printf "%s\n" "${slaves[@]}" | sort -u | wc -l)"
if (( uniq_count != ${#slaves[@]} )); then
echo "检测到重复网卡选择,请重新运行脚本。"
exit 1
fi
echo
echo "=== 你将创建如下配置 ==="
echo "bond: $bond_name"
echo "mode: $bond_mode"
echo "addr: $addr_cidr"
echo "gw: ${gateway:-<none>}"
echo "dns: ${dns_servers:-<none>}"
echo "slaves: ${slaves[*]}"
echo
read -rp "确认执行? (y/n): " ok
ok="${ok:-n}"
if [[ ! "$ok" =~ ^[yy]$ ]]; then
echo "已取消。"
exit 0
fi
echo
echo ">>> 开始配置..."
# 如果已有同名连接,先提示并删除(更可控)
if nmcli -t -f name connection show | grep -qx "$bond_name"; then
echo "检测到已存在连接 $bond_name,将删除后重建。"
nmcli connection delete "$bond_name" || true
fi
# 删除旧的 slave 连接(只删我们脚本命名过的)
for dev in "${slaves[@]}"; do
nmcli -t -f name connection show | grep -e "^${bond_name}-slave-${dev}$" | while ifs= read -r con; do
nmcli connection delete "$con" || true
done || true
done
# 创建 bond
nmcli connection add con-name "$bond_name" type bond ifname "$bond_name" mode "$bond_mode" >/dev/null
# 配置 ipv4
nmcli connection modify "$bond_name" ipv4.method manual ipv4.addresses "$addr_cidr"
if [[ -n "$gateway" ]]; then
nmcli connection modify "$bond_name" ipv4.gateway "$gateway"
else
nmcli connection modify "$bond_name" ipv4.gateway ""
fi
if [[ -n "$dns_servers" ]]; then
# nmcli 支持用空格或逗号,统一转空格
dns_servers="${dns_servers//,/ }"
nmcli connection modify "$bond_name" ipv4.dns "$dns_servers"
fi
# 建议:bond 承载主 ip,物理口不配 ip
for dev in "${slaves[@]}"; do
slave_con="${bond_name}-slave-${dev}"
nmcli connection add type bond-slave con-name "$slave_con" ifname "$dev" master "$bond_name" >/dev/null
done
# 启用连接(先 bond 再 slave)
nmcli connection up "$bond_name" >/dev/null || true
for dev in "${slaves[@]}"; do
nmcli connection up "${bond_name}-slave-${dev}" >/dev/null || true
done
echo
echo ">>> 完成。当前设备状态:"
nmcli device status
echo
echo ">>> bond 链路概览:"
ip -d link show "$bond_name" || true
echo
echo ">>> ipv4 地址:"
ip -4 addr show "$bond_name" || true
echo
echo "提示:如果你选的是 802.3ad (lacp),交换机侧必须配置对应端口的链路聚合(同一聚合组)。"总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论