Ubuntu服务器做网络接口绑定(bonding)和VLAN配置,核心就是两件事:第一,把多块物理网卡绑成一个逻辑接口,实现链路冗余或带宽叠加;第二,在绑定接口或物理接口上划VLAN,实现网络隔离和多业务承载。具体操作上,Ubuntu 18.04以后推荐用netplan配置,老系统用/etc/network/interfaces,而bonding模块需要加载802.3ad或balance-rr等模式驱动。下面我把完整流程、每种模式的区别、常见坑和排错方法全部讲透。
一、Bonding模式选择:别选错,选错等于白干Linux bonding一共7种模式(mode 0到mode 6),生产环境常用的就三种。mode=4(802.3ad)需要交换机支持LACP聚合,是最稳妥的方案,带宽叠加+故障自动切换。mode=1(active-backup)只做主备,不叠加带宽,适合只有两块网卡的场景。mode=6(balance-xor)基于MAC地址哈希做负载均衡,不需要交换机配置,但实际效果不如802.3ad稳定。如果你是双网卡做高可用,直接用mode=1;如果四块网卡要跑满带宽,用mode=4;如果交换机不支持LACP又想负载均衡,才考虑mode=6。千万别用mode=0(round-robin),看着是轮询,实际在大多数场景下会丢包,生产环境禁用。
二、加载bonding内核模块Ubuntu默认可能没加载bonding模块,先确认一下。执行下面命令查看模块是否存在:
lsmod | grep bonding
如果没有输出,手动加载并设置开机自动加载:
sudo modprobe bonding echo "bonding" | sudo tee /etc/modules-load.d/bonding.conf
如果你需要指定具体模式参数,比如mode=4且miimon=100,可以创建配置文件:
sudo tee /etc/modprobe.d/bonding.conf << 'EOF' options bonding mode=4 miimon=100 lacp_rate=1 EOF
这一步很多人跳过,导致重启后bonding接口消失或者模式不对,务必做。
三、用Netplan配置Bonding接口(Ubuntu 18.04+)现在Ubuntu主流用netplan,配置文件在/etc/netplan/目录下,文件名一般是00-installer-config.yaml或者01-netcfg.yaml。假设你有两块网卡eth0和eth1,要绑成bond0,配置如下:
network:
version: 2
renderer: networkd
ethernets:
eth0: {}
eth1: {}
bonds:
bond0:
interfaces:
- eth0
- eth1
parameters:
mode: 802.3ad
mii-monitor-interval: 100
lacp-rate: fast
transmit-hash-policy: layer3+4
addresses:
- 192.168.1.100/24
gateway4: 192.168.1.1
nameservers:
addresses:
- 8.8.8.8
- 114.114.114.114
注意几个细节:renderer必须写networkd,别写NetworkManager,否则可能冲突。addresses写bond0的IP,不是eth0或eth1的。apply之前先验证配置语法:
sudo netplan try
确认没问题再apply:
sudo netplan apply四、在Bonding接口上配置VLAN
实际生产中,bond0上面往往还要跑多个VLAN,比如VLAN 10走业务流量、VLAN 20走管理流量。netplan支持在bond上直接建VLAN子接口:
network:
version: 2
renderer: networkd
ethernets:
eth0: {}
eth1: {}
bonds:
bond0:
interfaces:
- eth0
- eth1
parameters:
mode: 802.3ad
mii-monitor-interval: 100
vlans:
bond0.10:
id: 10
link: bond0
addresses:
- 10.0.10.100/24
bond0.20:
id: 20
link: bond0
addresses:
- 10.0.20.100/24
这里bond0本身不配IP,IP全在VLAN子接口上。这是最规范的做法,因为bond0只是二层聚合通道,三层IP应该在VLAN上。如果你的交换机trunk口允许VLAN 10和20通过,bond0.10和bond0.20就能正常通信。注意,物理交换机对应端口必须配置为trunk模式,并且允许这些VLAN通过,否则VLAN标签到不了服务器。
五、老系统用/etc/network/interfaces的写法如果你还在用Ubuntu 16.04或者更老的系统,配置方式不一样。先安装ifenslave:
sudo apt install ifenslave
然后编辑/etc/network/interfaces:
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet manual
bond-master bond0
auto eth1
iface eth1 inet manual
bond-master bond0
auto bond0
iface bond0 inet manual
bond-mode 4
bond-miimon 100
bond-lacp-rate fast
bond-slaves eth0 eth1
auto bond0.10
iface bond0.10 inet static
address 10.0.10.100
netmask 255.255.255.0
vlan-raw-device bond0
auto bond0.20
iface bond0.20 inet static
address 10.0.20.100
netmask 255.255.255.0
vlan-raw-device bond0
重启网络服务生效:
sudo systemctl restart networking
老系统的坑在于bond-mode后面的数字,4对应802.3ad,1对应active-backup,别写错。另外vlan-raw-device这个参数在某些老内核上可能不生效,需要先apt install vlan。
六、验证配置是否生效配置完了别急着走,先验证。查看bonding状态:
cat /proc/net/bonding/bond0
输出里应该看到Slave Interface: eth0和eth1,以及各自的link status是up。如果看到MII Status: up,说明链路检测正常。再看VLAN:
ip -d link show bond0.10
能看到vlan id 10就对了。最后测试连通性,从另一台同VLAN的机器ping一下bond0.10的IP,通了就说明没问题。如果不通,先检查交换机trunk配置,再检查服务器防火墙。
七、常见问题和排错思路第一个常见问题:bonding接口up了但网络不通。十有八九是交换机没配LACP或者trunk没放行VLAN。先去交换机上确认,show run interface gigabitethernet 0/1看看有没有channel-group和switchport trunk allowed vlan的配置。第二个问题:重启后bond0消失。这通常是netplan文件权限不对或者YAML缩进错误,用netplan try可以提前发现语法问题。第三个问题:VLAN接口能ping通但大流量丢包。检查bonding的hash策略,layer3+4比layer2更适合有多VLAN的场景,因为layer2只看MAC地址,多VLAN时流量可能全走一块网卡。第四个问题:网卡顺序变了导致bond0绑定到错误的物理口。用ethtool -p eth0让网卡指示灯闪烁来物理确认,或者在netplan里用match参数按MAC地址绑定,更可靠:
ethernets:
eth0:
match:
macaddress: "aa:bb:cc:dd:ee:f0"
eth1:
match:
macaddress: "aa:bb:cc:dd:ee:f1"
八、生产环境的几点建议
第一,bonding的miimon不要设太低,100ms是比较合理的值,设成10ms会增加CPU开销且没必要。第二,如果用mode=4,lacp-rate建议设fast(1秒发一次LACPDU),比slow(30秒)故障切换快得多。第三,bond0上面不要直接配IP,全部放在VLAN子接口上,这样网络结构清晰,后期扩展方便。第四,做好监控,用ip -s link show bond0可以看到每个slave的收发统计,配合zabbix或prometheus做告警,网卡故障第一时间知道。第五,如果是虚拟化环境(比如KVM),bonding的模式要选对,virtio网卡不支持某些bonding模式,建议用mode=1或mode=4,并且在宿主机层面也要做对应的网桥配置。
总结一下,Ubuntu上做bonding+VLAN并不复杂,关键是选对模式、配对交换机、验证链路。netplan的语法严格,YAML缩进错一个空格就可能导致整个网络配置失败,所以一定要用netplan try先测试。把上面这些步骤走一遍,你的服务器网络就能做到既有冗余又有隔离,生产环境稳稳的。
