Ubuntu netplan 配置:bond、bridge 与 VLAN 实战 - 夜莺博客

Ubuntu netplan 配置:bond、bridge 与 VLAN 实战

Ubuntu 从 17.10 起用 netplan 取代了 /etc/network/interfaces,配置写成 YAML 再渲染给 systemd-networkd 或 NetworkManager。好处是声明式、可版本化;代价是 YAML 的缩进和层级一旦写错,networkd 可能直接拒绝整个文件,服务器重启后失联。本文用 bond、bridge 和 VLAN 三个最常见的组合说明正确写法,并给出改配置前必须做的验证步骤。

netplan 的工作方式

  1. 读取 /etc/netplan/*.yaml(注意:多个文件会合并,文件名顺序决定优先级)。
  2. netplan generate 把 YAML 渲染成后端配置(默认 systemd-networkd)。
  3. netplan apply 应用;netplan try 应用后等待确认,超时自动回滚。

关键点:netplan 只负责生成后端配置,真正的接口状态由 networkd 管理。所以排障时要同时看 netplan 和 networkd 两侧。

基础骨架

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3f0:
      dhcp4: false
      mtu: 9000
    ens3f1:
      dhcp4: false
      mtu: 9000

渲染器选择很关键:服务器用 networkd,桌面/需要 GUI 管理用 NetworkManager。混用会导致同一接口被两个后端争抢,表现为接口状态随机变化。

LACP 链路聚合(bond)

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3f0: {dhcp4: false}
    ens3f1: {dhcp4: false}
  bonds:
    bond0:
      interfaces: [ens3f0, ens3f1]
      addresses: [10.10.10.20/24]
      routes:
        - to: default
          via: 10.10.10.1
      mtu: 9000
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        mii-monitor-interval: 100
        transmit-hash-policy: layer3+4
      nameservers:
        addresses: [10.10.10.53]

三个参数值得解释:

  • mode: 802.3ad 需要交换机侧也配成 LACP(H3C/Huawei 的 Eth-Trunk 动态模式、Cisco 的 channel-group mode active),静态聚合写 balance-xor
  • transmit-hash-policy: layer3+4 让哈希包含端口号,避免单个 TCP 连接无法跑满聚合带宽——默认的 layer2 策略下,两台主机之间往往只有一条链路在工作。
  • lacp-rate: fast 把 LACPDU 间隔从 30 秒降到 1 秒,链路故障感知更快。

网桥与 VLAN 组合

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3f0: {dhcp4: false}
  vlans:
    vlan100:
      id: 100
      link: ens3f0
      dhcp4: false
  bridges:
    br0:
      interfaces: [vlan100]
      addresses: [192.168.100.10/24]
      parameters:
        stp: true
        forward-delay: 4

这是虚拟化主机的典型形态:物理口不配地址,VLAN 子接口挂在物理口上,网桥承载 VLAN 子接口并持有 L3 地址。对 KVM/Proxmox 场景,网桥 + VLAN 感知模式对应两类做法:桥接 VLAN 子接口(上面这种,简单、每 VLAN 一个 bridge)或 bridge vlan_filtering(单网桥多 VLAN,需要显式配置 VLAN 过滤表)。前者更不容易出错。

改配置前必须做的三件事

  1. 备份现有 YAMLcp /etc/netplan/*.yaml ~/netplan.bak/
  2. 用 netplan try 而非 apply:它会在 120 秒内等待确认,期间可以测连通性,不确认则自动回滚。
  3. 在带外通道上操作:远程 SSH 改网络配置,一旦地址错了就只有 IPMI/串口能救。
sudo netplan generate
sudo netplan try        # 应用并等待确认,回车确认,Ctrl+C 放弃
sudo netplan apply      # 确认变更
sudo netplan get        # 查看合并后的配置

验证与排障

ip -br link
ip -br addr
ip route
cat /proc/net/bonding/bond0
bridge link show
bridge vlan show
networkctl status bond0
journalctl -u systemd-networkd -n 100 --no-pager

常见问题与对应排查点:

现象 原因
接口名对不上,配置未生效 用了可预测命名(ens3f0)之外的旧式名字(eth0),或 YAML 缩进错误导致整文件被忽略
bond 起来了但只有一条链路在跑 哈希策略是 layer2,或交换机侧未配 LACP
VLAN 子接口无流量 交换机端口没放通该 VLAN,或父接口未 up
网桥无法转发虚拟机流量 stp 与转发延迟,或物理口被 networkd 抢管
重启后网络全部丢失 YAML 语法错误被静默忽略,networkd 回落到 DHCP

把配置纳入版本管理

虚拟化与云环境下的 netplan 差异

同一份 YAML 在物理机、虚拟机和云主机上表现不同,原因主要是网卡命名与驱动能力:

环境 常见网卡名 注意事项
物理服务器 eno1、ens3f0、enp3s0 支持完整 offload 与巨帧,可放心配 MTU 9000
KVM/VMware 虚拟机 ens3、ens160、eth0 部分型号不支持巨帧或 SR-IOV 特性
公有云主机 eth0、ens5 MAC 地址由云平台管理,不要写死 MAC;DHCP 优先
容器宿主 物理口 + bridge 注意 Docker 会自行管理 iptables 与网桥,避免规则冲突

云主机上尤其要注意两点:不要用 macaddress 匹配网卡(平台替换网卡后配置失配),以及不要在任播/弹性 IP 场景下自行配置地址,地址由平台注入的情况更常见。

一组常用的完整示例

network:
  version: 2
  renderer: networkd
  ethernets:
    ens3f0:
      dhcp4: false
      mtu: 9000
    ens3f1:
      dhcp4: false
      mtu: 9000
  bonds:
    bond0:
      interfaces: [ens3f0, ens3f1]
      parameters:
        mode: 802.3ad
        lacp-rate: fast
        transmit-hash-policy: layer3+4
        mii-monitor-interval: 100
      mtu: 9000
  vlans:
    bond0.100:
      id: 100
      link: bond0
      mtu: 9000
    bond0.200:
      id: 200
      link: bond0
      mtu: 9000
  bridges:
    br100:
      interfaces: [bond0.100]
      addresses: [10.10.100.5/24]
      routes:
        - to: default
          via: 10.10.100.1
          metric: 100
      parameters:
        stp: true
        forward-delay: 4
    br200:
      interfaces: [bond0.200]
      addresses: [10.10.200.5/24]
      routes:
        - to: 10.20.0.0/16
          via: 10.10.200.1
          metric: 200

这份配置体现了几条实践原则:物理口只负责承载,地址放在网桥上;路由的 metric 明确写出,避免多默认路由抢占;MTU 在每一层都显式声明,防止上游 9000 而下层 1500 导致的隐蔽丢包。

从 ifupdown 迁移的注意事项

  • /etc/network/interfaces 中的内容必须清空或删除,否则两套系统可能同时生效。
  • ifup/ifdown 命令在 netplan+networkd 下不再适用,脚本里要改成 netplan apply
  • 静态路由写成 routes: 列表,而不是 up ip route add 的钩子脚本。
  • DNS 配置写在 nameservers: 下,networkd 会生成 /run/systemd/resolve/ 下的配置。
  • 迁移后逐台重启验证——只运行 netplan apply 不足以暴露重启才出现的问题。

相关文章

Linux 聚合模式的原理与对比见 Linux bonding 模式与 LACP 主动备份,VLAN 子接口的底层命令见 Linux VLAN 打标与 ip link 802.1q,虚拟化网络隔离可参考 Linux network namespace 与 veth 实践

原文链接:https://netplan.readthedocs.io/en/stable/