将 bond 网卡的负载均衡策略修改为基于 IP + 端口(IP+PORT) 的哈希方式,以实现发送和接收流量都能根据 IP + 端口均匀分布到不同从网卡,以下是完整的修改步骤和验证方法。
一、核心修改步骤(临时生效 + 永久生效)
1. 临时修改(立即生效,重启网络 / 服务器后失效)
bash
# 1. 先查看当前的哈希策略(确认当前配置)
cat /sys/class/net/bond0/bonding/xmit_hash_policy
# 2. 修改为基于 IP+端口的哈希策略(值为2)
# 0=仅MAC | 1=仅IP | 2=IP+端口 | 3=自定义
echo 2 > /sys/class/net/bond0/bonding/xmit_hash_policy
# 3. 验证修改是否成功
cat /sys/class/net/bond0/bonding/xmit_hash_policy
说明:
xmit_hash_policy主要控制发送流量 的哈希策略;而接收流量的负载均衡,bond 会自动适配该策略(因为接收侧的哈希逻辑与发送侧同源,IP + 端口的哈希能让不同会话的流量分发到不同从网卡)。
2. 永久修改(重启后不失效,推荐)
不同 Linux 发行版的 bond 配置文件路径不同,以下是主流发行版的配置方法:
(1)CentOS/RHEL 7/8/9(nmcli 或 ifcfg 配置)
-
方法 1:通过 ifcfg 配置文件(推荐)
bash# 编辑 bond0 的配置文件 vi /etc/sysconfig/network-scripts/ifcfg-bond0在文件中添加 / 修改以下行:
bash# 新增哈希策略配置 BONDING_OPTS="mode=balance-xor miimon=100 xmit_hash_policy=layer3+4" # 说明: # mode=balance-xor 是基础(必须是支持哈希的模式:0/2/4/5/6) # miimon=100 是链路检测间隔(根据你的环境调整) # layer3+4 等价于 xmit_hash_policy=2(IP+端口)保存后重启网络:
bash# CentOS 7 systemctl restart network # CentOS 8/9 nmcli connection reload && nmcli connection up bond0 -
方法 2:通过 nmcli 命令配置
bash# 修改 bond0 的连接配置 nmcli con mod bond0 bond.xmit-hash-policy layer3+4 # 重启 bond0 连接 nmcli con up bond0
(2)Debian/Ubuntu(netplan 配置)
bash
# 编辑 netplan 配置文件(通常是 /etc/netplan/00-bond.yaml)
vi /etc/netplan/00-bond.yaml
修改配置内容(确保包含 xmit-hash-policy: layer3+4):
bash
network:
ethernets:
eth0:
dhcp4: no
eth1:
dhcp4: no
bonds:
bond0:
interfaces: [eth0, eth1]
dhcp4: no
addresses: [192.168.1.100/24] # 替换为你的 bond0 IP
parameters:
mode: balance-xor # 基础模式(可选 balance-rr/802.3ad/balance-tlb/balance-alb)
miimon: 100
xmit-hash-policy: layer3+4 # 核心:IP+端口哈希
应用配置:
bash
netplan apply
二、关键补充:确保接收流量也能负载均衡
接收流量的负载均衡依赖两个前提,需额外确认:
-
bond 模式必须支持接收负载均衡:
-
✅ 支持的模式:balance-xor(2)、802.3ad(4)、balance-alb(6)
-
❌ 不支持的模式:balance-rr(0,仅发送轮询)、active-backup(1)、broadcast(3)如果你当前是 mode 0(balance-rr),建议改为 mode 2(balance-xor)+ layer3+4 哈希,才能实现收发双向的 IP + 端口负载均衡。
-
-
交换机侧需匹配配置(仅 mode 4/802.3ad):如果用 mode 4(802.3ad),需在交换机上配置:
-
端口聚合模式为 LACP
-
哈希策略也设置为 "基于 IP + 端口"(而非仅 MAC)否则交换机侧仍会将所有流量发往单张从网卡,导致接收流量不均衡。
-
三、验证修改效果
修改完成后,通过以下命令验证收发流量是否均衡:
# 1. 查看最终的哈希策略配置
cat /proc/net/bonding/bond0 | grep "Xmit Hash Policy"
# 预期输出:Xmit Hash Policy: layer3+4
# 2. 同时监控两张从网卡的流量(以 UDP 端口 5000 为例)
# 开两个终端,分别执行:
tcpdump -i eth0 -n udp port 5000 # 监控 eth0 流量
tcpdump -i eth1 -n udp port 5000 # 监控 eth1 流量
# 3. 用多会话压测(如多源端口/目的端口发送 UDP 包)
# 例如用 hping3 模拟多端口流量:
hping3 -2 -p 5000 -k --spoof 192.168.1.200-210 192.168.1.100 # 多源 IP
# 或
hping3 -2 -p 5000-5010 -k 192.168.1.100 # 多目的端口
如果两张网卡的 tcpdump 都能抓到数据包,说明 IP + 端口的负载均衡已生效。
四、总结
- 核心配置 :将
xmit_hash_policy设为layer3+4(值为 2),实现基于 IP + 端口的哈希负载均衡。 - 模式匹配:接收流量要均衡,需选用 balance-xor/802.3ad/balance-alb 模式(避免 balance-rr)。
- 永久生效:需修改 bond 配置文件(而非仅临时 echo),确保重启后配置不丢失。
如果修改后仍有单网卡流量集中,大概率是测试流量的会话单一(如仅一个源 IP + 端口 + 一个目的 IP + 端口),需用多会话压测验证。