Linux 高级网络管理:bonding 链路聚合、VLAN 虚拟局域网与网桥

深入 Linux 高级网络管理:bonding 链路聚合(round-robin/active-backup/LACP)、VLAN 划分与 802.1Q 中继、Linux Bridge 与虚拟交换、网络命名空间隔离、systemd-networkd 与 NetworkManager 高级配置,通过实战配置掌握服务器网络的冗余、隔离与虚拟化。

引言

单块网卡是服务器的网络单点——带宽不够、坏了就断。生产服务器的网络升级路径是:bonding 链路聚合(增带宽 + 高可用)→ VLAN 划分(逻辑隔离)→ 网桥/命名空间(虚拟化网络)。本文讲透这三个层级:先给 bonding 的模式全景与实战配置,再拆 VLAN 的 802.1Q 中继原理,接着讲 Linux Bridge 与网络命名空间的隔离,最后落到 systemd-networkd 与 NetworkManager 的高级配置与排错。

前置:/linux-network-commands/(网络配置与排查)。基础命令见该文,本文是其「高级网络」延伸。容器网络见 [[docker]]。


目录


1. bonding 链路聚合:模式、原理与配置

bonding 把多块物理网卡聚合成一块逻辑网卡(bond0),要么增带宽、要么做冗余:

物理网卡 eth0 + eth1 → bond0(逻辑网卡)
   ├── 带宽聚合:两块 1G 合成 2G(需交换机配合)
   └── 冗余:一块坏另一块顶上(active-backup)

核心概念:模式(mode)——bonding 有 7 种模式,最常用 3 种:

模式名称特点适用
mode 0round-robin轮询均衡,需交换机支持聚合极少用
mode 1active-backup一块主用、一块备用,无需交换机支持高可用首选
mode 4802.3ad (LACP)动态聚合,交换机协商带宽带宽聚合首选

心智:要「不中断」选 mode 1,要「带宽翻倍」选 mode 4——前者只需一根线备用,后者要交换机开 LACP。


2. bond 高可用实战:active-backup 与故障切换

mode 1(active-backup):同一时刻只有一块网卡工作,坏了立刻切到备用,切换 <1s:

# 1. 创建 bond 配置(用 networkd)
sudo tee /etc/systemd/network/10-bond0.network > /dev/null <<'EOF'
[Match]
Name=bond0

[Network]
Address=192.168.1.10/24
Gateway=192.168.1.1
DNS=8.8.8.8
EOF
# 2. 声明 bond0 是链路聚合(netdev 配置)
sudo tee /etc/systemd/network/10-bond0.netdev > /dev/null <<'EOF'
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=active-backup
MIIMonitorSec=100ms
EOF
# 3. 把 eth0/eth1 绑进 bond(两条 .netdev 定义从属)
sudo tee /etc/systemd/network/20-bond0-slave.network > /dev/null <<'EOF'
[Match]
Name=eth0 eth1

[Network]
Bond=bond0
EOF

sudo systemctl restart systemd-networkd
ip -br addr show bond0   # bond0 拿到 IP,UP

记忆:mode 1 是「一主一备」——主卡坏了自动切备卡,服务器网络不中断。交换机什么都不用配,是最高可用的入门方案。


3. LACP 动态聚合:802.3ad 与交换机协商

mode 4(802.3ad):两块网卡同时工作,带宽聚合,由交换机 LACP 协商:

# 同样的 bond 声明,只改 Mode
sudo tee /etc/systemd/network/10-bond0.netdev > /dev/null <<'EOF'
[NetDev]
Name=bond0
Kind=bond

[Bond]
Mode=802.3ad
LACPTransmitRate=fast
EOF
交换机侧(华为/思科通用思路):
  把接 eth0/eth1 的两个端口加入同一个聚合组(EtherChannel/LACP)
  开 LACP 模式(active/passive)
  两边都起 LACP → 协商成功 → 带宽翻倍

验证带宽是否真聚合:

# 看 bond 的链路信息
cat /proc/net/bonding/bond0
# 应显示 802.3ad,两块从属均为 UP,LACP rate fast
ip -s link show bond0    # 看总吞吐(两块网卡流量叠加)

心法:LACP 聚合的前提是「交换机支持 + 端口加入聚合组」——交换机没配置的话,聚合不成立甚至会广播风暴。先确认交换机,再切 mode 4。


4. VLAN 划分:802.1Q 原理与 Linux 配置

VLAN(虚拟局域网)把一块物理网络切成多个逻辑隔离网:服务器一个 VLAN、办公一个 VLAN、DMZ 一个 VLAN。

802.1Q 原理:
  数据帧打上 VLAN ID 标签(12 bit,1~4094)
  交换机按标签转发到对应 VLAN
  └── 一台服务器可以同时属于多个 VLAN(打多个标签)

Linux 侧配置(网络接口打 VLAN 标签):

# eth0.100 = 在 eth0 上创建 VLAN 100 子接口
sudo tee /etc/systemd/network/30-vlan100.netdev > /dev/null <<'EOF'
[NetDev]
Name=vlan100
Kind=vlan

[VLAN]
Id=100
EOF
# VLAN 子接口的网络配置
sudo tee /etc/systemd/network/30-vlan100.network > /dev/null <<'EOF'
[Match]
Name=vlan100

[Network]
Address=10.100.0.10/24
EOF
# 查看/删除 VLAN
ip link show vlan100
sudo ip link delete vlan100

记忆:VLAN 是「在一根线上划逻辑隔离」——VLAN 100 走子接口 vlan100,VLAN 200 走 vlan200,互不干扰。一台服务器可以同时是多 VLAN 的成员。


5. Linux Bridge 与虚拟交换

Linux Bridge 是内核里的「虚拟交换机」——把物理网卡和虚拟网卡(虚拟机/容器的 tap)连到同一个交换域:

Linux Bridge (br0)
   ├── 物理网卡 eth0(上联)
   ├── 虚拟机虚拟网卡 vnet0(VM1)
   └── 虚拟机虚拟网卡 vnet1(VM2)
VM1 和 VM2 通过 br0 互通,也能通过 eth0 上网
# 创建网桥
sudo ip link add br0 type bridge
sudo ip link set eth0 master br0     # 物理网卡挂进桥
sudo ip link set vnet0 master br0    # 虚拟机网卡挂进桥
sudo ip link set br0 up

# networkd 写法(虚拟化平台常见)
sudo tee /etc/systemd/network/40-br0.netdev > /dev/null <<'EOF'
[NetDev]
Name=br0
Kind=bridge
EOF

心法:网桥是 KVM/libvirt 网络的基石——虚拟机想「跟宿主机同一网络」,就是把虚拟网卡挂进宿主的网桥(见 KVM/QEMU)。


6. 网络命名空间:完全隔离的虚拟网络

网络命名空间(netns)让每个命名空间拥有独立的网卡、路由、防火墙——容器隔离的网络层实现(见 [[docker]]):

# 1. 创建两个命名空间
sudo ip netns add ns1
sudo ip netns add ns2

# 2. 创建虚拟网线(veth 对)连接两空间
sudo ip link add veth1 type veth peer name veth2

# 3. 把 veth 分别放进命名空间
sudo ip link set veth1 netns ns1
sudo ip link set veth2 netns ns2

# 4. 配 IP 并启用
sudo ip -n ns1 addr add 10.0.0.1/24 dev veth1
sudo ip -n ns2 addr add 10.0.0.2/24 dev veth2
sudo ip -n ns1 link set veth1 up
sudo ip -n ns2 link set veth2 up

# 5. 验证两空间互通
sudo ip netns exec ns1 ping 10.0.0.2   # ns1 能 ping 通 ns2

记忆:netns 是「内核级网络沙盒」——每个命名空间看得到的是「自己的网卡和路由」,看不到外面的。容器隔离就是这个原理(见 [[docker]])。


7. systemd-networkd 高级配置

networkd 是 systemd 原生的网络配置工具,适合服务器(无桌面)场景:

# 网络配置目录
/etc/systemd/network/
   ├── 10-bond0.netdev    # 声明虚拟设备(bond/vlan/bridge)
   ├── 10-bond0.network   # 网络地址配置(IP/网关/DNS)
   └── 20-bond0-slave.network  # 从属绑定

常用 networkd 配置要点:

# DHCP 或静态
[Network]
DHCP=yes
# 或 Address=192.168.1.10/24 + Gateway + DNS

# 网桥/聚合从属
[Network]
Bridge=br0          # 挂网桥
Bond=bond0          # 挂聚合
# 生效与排错
sudo systemctl restart systemd-networkd
networkctl status bond0     # 查看设备状态
networkctl list             # 列出所有网络设备

心法:networkd 把「设备声明」和「地址配置」分成 .netdev 与 .network 两个文件——先声明「有什么设备」,再配「这设备什么地址」。服务器场景用 networkd 干净可控。


8. NetworkManager 的 bond/VLAN 配置

NetworkManager 适合桌面/动态环境(笔记本切换网络、无线):

# 用 nmcli 创建 bond
sudo nmcli connection add type bond con-name bond0 ifname bond0 bond.options "mode=active-backup,miimon=100"
# 把两块网卡加进 bond
sudo nmcli connection add type ethernet con-name bond0-eth0 ifname eth0 master bond0
sudo nmcli connection add type ethernet con-name bond0-eth1 ifname eth1 master bond0
# 给 bond 配 IP
sudo nmcli connection modify bond0 ipv4.addresses 192.168.1.10/24 ipv4.method manual
sudo nmcli connection up bond0
# VLAN 子接口
sudo nmcli connection add type vlan con-name vlan100 ifname eth0.100 vlan.id 100 vlan.parent eth0

对比:networkd 适合服务器(声明式、稳定)、NetworkManager 适合桌面(动态、有 GUI)——两者都能配 bond/VLAN,按环境选。


9. 排错:链路、聚合与中继诊断

排错三板斧:

# 1. 看链路状态
ip -br link show                 # 每块网卡的 UP/DOWN
cat /proc/net/bonding/bond0      # bond 模式与从属状态

# 2. 看聚合是否生效
ip -s link show bond0            # 吞吐(mode4 应看到两块都跑)
grep -i lacp /proc/net/bonding/bond0

# 3. 看 VLAN 中继
ip -br link show | grep vlan     # VLAN 子接口是否存在
ping -I vlan100 10.100.0.1       # 指定 VLAN 接口 ping

常见问题:

现象原因解法
bond 只有一块 UP从属未绑定/对端交换机没聚合检查 slave 配置
mode4 无带宽提升交换机未开 LACP交换机加聚合组
VLAN ping 不通交换机端口未配 trunk 放行配 trunk + allowed vlan
网桥不通外网物理卡未挂进桥确认 eth0 master br0

记忆:网络排错看「链路 → 聚合 → 中继」三层——bond 看 /proc/net/bonding、VLAN 看子接口、桥看 master 关系,逐层排查。


10. 速查表

需求做法
链路冗余(不中断)bond mode 1 active-backup
带宽聚合(翻倍)bond mode 4 802.3ad + 交换机 LACP
逻辑隔离网络VLAN 子接口(eth0.100)
虚拟交换机Linux Bridge(br0)
完全隔离网络网络命名空间(ip netns)
服务器网络配置systemd-networkd
桌面/动态配置NetworkManager (nmcli)
查看 bondcat /proc/net/bonding/bond0
查看 VLANip -br link show | grep vlan
命名空间执行ip netns exec ns1 <cmd>

一句话记忆:bonding 管「多卡合一」(mode1 冗余 / mode4 带宽)、VLAN 管「一线多网」(逻辑隔离)、网桥管「虚拟交换」(VM/容器上联)、netns 管「完全隔离」(内核沙盒)——服务器网络从单点到聚合、从物理到虚拟,一套命令体系全掌握。


延伸阅读

  • /linux-network-commands/ — 网络配置与排查基础
  • /linux-virtualization-guide/ — 网桥在 KVM 里的应用
  • /linux-containers-isolation/ — 网络命名空间的容器实现
  • /linux-ha-load-balancing/ — 链路高可用与负载均衡
  • [[docker]] — 容器网络(veth/网桥)

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「linux」更多文章

  1. Linux 日志管理:rsyslog 集中收集、logrotate 轮转与日志分析
  2. Linux SSH 服务与隧道:sshd 配置、密钥认证、端口转发与安全加固
  3. Linux DNS 与 DHCP 服务:BIND/dnsmasq、zone 文件与解析排错