引言
单块网卡是服务器的网络单点——带宽不够、坏了就断。生产服务器的网络升级路径是:bonding 链路聚合(增带宽 + 高可用)→ VLAN 划分(逻辑隔离)→ 网桥/命名空间(虚拟化网络)。本文讲透这三个层级:先给 bonding 的模式全景与实战配置,再拆 VLAN 的 802.1Q 中继原理,接着讲 Linux Bridge 与网络命名空间的隔离,最后落到 systemd-networkd 与 NetworkManager 的高级配置与排错。
前置:/linux-network-commands/(网络配置与排查)。基础命令见该文,本文是其「高级网络」延伸。容器网络见 [[docker]]。
目录
- 1. bonding 链路聚合:模式、原理与配置
- 2. bond 高可用实战:active-backup 与故障切换
- 3. LACP 动态聚合:802.3ad 与交换机协商
- 4. VLAN 划分:802.1Q 原理与 Linux 配置
- 5. Linux Bridge 与虚拟交换
- 6. 网络命名空间:完全隔离的虚拟网络
- 7. systemd-networkd 高级配置
- 8. NetworkManager 的 bond/VLAN 配置
- 9. 排错:链路、聚合与中继诊断
- 10. 速查表
- 延伸阅读
1. bonding 链路聚合:模式、原理与配置
bonding 把多块物理网卡聚合成一块逻辑网卡(bond0),要么增带宽、要么做冗余:
物理网卡 eth0 + eth1 → bond0(逻辑网卡)
├── 带宽聚合:两块 1G 合成 2G(需交换机配合)
└── 冗余:一块坏另一块顶上(active-backup)
核心概念:模式(mode)——bonding 有 7 种模式,最常用 3 种:
| 模式 | 名称 | 特点 | 适用 |
|---|---|---|---|
| mode 0 | round-robin | 轮询均衡,需交换机支持聚合 | 极少用 |
| mode 1 | active-backup | 一块主用、一块备用,无需交换机支持 | 高可用首选 |
| mode 4 | 802.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) |
| 查看 bond | cat /proc/net/bonding/bond0 |
| 查看 VLAN | ip -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/网桥)
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。