首页 / 资讯中心 / 文章详情

Netplan进阶实战:网桥、Bond、VLAN与策略路由一次搞定

Netplan进阶实战:网桥、Bond、VLAN与策略路由一次搞定 ★ FEATURED ARTICLE
netplan这个工具第一篇写基础概念和静态IP配置的时候就有人留言说“这些我都会能不能聊点真正生产环境用得上的”。这篇就是接着那个话头往下走的。今天这篇我打算把网桥、Bond链路聚合、VLAN、Wi-Fi、策略路由这些进阶配置一次说透前面加一个特别容易被忽略的渲染器问题。内容以服务器和虚拟化场景为主看完你至少能独立完成一台多网卡、多VLAN、带链路聚合的机器配置而不是只会在YAML里改改IP地址。1. 动手前先搞懂渲染器否则后面全是坑1.1 两种后端到底选哪个netplan本身不干活它只是个“翻译官”。你写一份YAML它负责把这份描述翻译成真实网络服务能理解的配置。真实干活的有两个systemd-networkd和NetworkManager。systemd-networkd轻量、保守、开机网络拉起得早适合无头服务器配置行为非常稳定。NetworkManager功能全有交互工具适合桌面环境。它会接管网络设备也支持Wi-Fi漫游、热插拔这些场景。很多坑就是在这一步埋下的。比如你写好了Bond配置生成完发现bond0的状态起不来回头一看原来系统里安装的NetworkManager把物理网卡劫持了netplan生成的配置根本没生效。这种情况我遇到过不止一次。注意生产环境、虚拟化宿主机、软路由设备我建议全部锁定systemd-networkd。没有图形界面需求就不要给NetworkManager留机会。1.2 怎么调渲染器才稳妥每个安装场景的默认值不一样。有的系统装完默认就是networkd有的会带上NetworkManager。判断方法很简单cat /etc/netplan/*.yaml配置文件里的renderer:字段如果没写那就看系统里装了谁。想强制指定的话network: version: 2 renderer: networkd ethernets: eth0: dhcp4: true如果机器上之前装过NetworkManager建议直接systemctl disable --now NetworkManager否则你后面配置无线网卡或者桥接的时候它还可能出来插一脚。另外注意renderer写错或者不写在两套后端下生成的配置差异非常大。同一个bridge配置networkd下是一个样子NetworkManager下完全是另一套对应的侧写。改渲染器之后一定要重新netplan generate再netplan apply别偷懒。2. 网桥配置让虚拟机跟你同网段2.1 一套直接能用的桥接配置网桥是我用得最多的配置。做KVM虚拟化时虚拟机要用bridge模式直接暴露到物理局域网做容器网络隔离要建自定义网桥测试环境里想把多个虚拟网口串在一起也要靠它。配置思路非常简单物理网卡只管收发光信号IP地址、网关这些全部挪到网桥上。network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: false bridges: br0: interfaces: - enp3s0 addresses: - 192.168.1.10/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 192.168.1.1 - 223.5.5.5 parameters: stp: false forward-delay: 0这套配置的效果是enp3s0进入桥br0所有IP和默认路由都挂在br0上对外表现就是一台IP为192.168.1.10的主机。虚拟机的虚拟网卡也加进br0它就能跟物理局域网里的其他设备直接二层互通。2.2 桥接里那点没人明说的细节先记住一个铁律物理网卡进了桥就不要再给它配IP也不要开DHCP。我见过有人把物理网卡留着dhcp4: true桥上也配一套地址结果机器重启后出现两个同网段IP线上服务时通时不通排查了半天。STP生成树协议这个参数很多人搞不清该不该开。大部分家用和单交换机环境stp直接false就行。一旦你用了多台交换机并且有环路拓扑就必须开stp否则广播风暴能把整个办公网上层打瘫。但开了stp之后虚拟机网卡up起来会慢因为要等端口收敛所以我把forward-delay也设成0实测能让虚拟机启动后更快获得网络能力。MTU问题也是桥接场景的高频坑。物理网卡是1500虚拟机网卡也按1500跑两者通过网桥转发倒是没问题。但如果你要跑VXLAN之类的overlay网络桥本身和物理口都要统一调大MTU建议放到9000左右。修改桥的MTU只需要在bridge下面加mtu: 9000物理口不用动。另外说一句无线网卡进桥的事。很多人的思路是笔记本上有个Wi-Fi想开虚拟机给同学访问就把wlan0加进bridge。结果发现虚拟机死活拿不到IP。问题出在无线网卡对802.11协议的特殊处理上大多数驱动不接收非本地MAC地址的帧所以即便网桥建起来了外面的设备也通过wlan0访问不到虚拟机。物理机做嵌套虚拟化测试时可能还能跑通真实场景基本不可用。真想共享网络老老实实配NAT转发。3. 双网卡聚合Bond带宽翻倍还是主备冗余3.1 先定模式再谈参数Bond的全称是链路聚合把多块物理网卡绑成一个逻辑网卡主要目的是两件事提升吞吐量和提供链路冗余。但并不是所有模式都能同时满足这两个目标。balance-rr数据包轮流从每个物理口发出去理论上带宽可以叠加。代价是可能出现乱序而且对端交换机也要支持对应的负载分担策略。active-backup同一时刻只有一块网卡在收发数据另一块纯待命。带宽不增加但是冗余效果最好交换机那边完全无感。802.3ad标准LACP模式需要交换机配置动态链路聚合。两台机器之间的大流量可以打满双线是最推荐的生产模式。balance-xor基于MAC地址异或计算选出口适合流量模型比较稳定的场景。提示身边没有懂交换机的同事就别开802.3ad。LACP协商不成功链路直接不通服务器也连不上那种“失联”体验很刺激。3.2 实战配置与踩坑记录下面是一份最常见的服务器双万兆网卡做LACP聚合的配置network: version: 2 renderer: networkd ethernets: eno1: {} eno2: {} bonds: bond0: interfaces: - eno1 - eno2 parameters: mode: 802.3ad mii-monitor-interval: 100 lacp-rate: fast transmit-hash-policy: layer23 addresses: - 172.16.100.2/24 routes: - to: default via: 172.16.100.1 nameservers: addresses: - 172.16.100.1注意几个细节两个物理网卡写成{}空配置表示它们只作为bond0的成员不配任何IP和路由。mii-monitor-interval: 100是链路检测间隔单位毫秒。设置太大会导致故障感知慢设置太小会占CPU。100毫秒是生产环境常用的折中值。lacp-rate: fast让LACP协商报文发得更勤交换机侧收敛速度更快。transmit-hash-policy: layer23同时参考源目的MAC和IP做流量分发多连接场景下负载更均衡。如果只做二层分片几条大流可能全压在一块卡上。家用服务器如果交换机不支持LACP用active-backup模式最省心。我曾经在一台机器上同时插了两块不同型号的千兆网卡开了802.3ad后发现数据倾斜严重——性能好的网卡跑满了老网卡还在空闲。后来改成balance-xor才算均衡。所以双网卡型号、速率不一致的时候先别急着LACP。还有个容易踩的坑在云主机或者虚拟环境里其实很多都不支持多网卡bond因为底层虚拟网卡的收包机制跟物理网卡不一样。我在某虚拟化平台试过在虚拟机里做bond结果切到802.3ad模式后流量直接乱掉ping外网丢包50%。虚拟环境老老实实用单网卡或者active-backup就行别追求LACP。4. VLAN子接口和无线网络一次说清4.1 在物理口和Bond上跑VLANVLAN最常见的场景是“一根网线当好几根用”交换机上做了trunk一些端口既跑办公网又跑服务器业务通过VLAN ID区分流量。在netplan里VLAN就是一个挂接在物理网卡或者Bond之上的虚拟子接口。network: version: 2 renderer: networkd ethernets: enp3s0: {} vlans: vlan100: id: 100 link: enp3s0 addresses: - 10.10.100.2/24 vlan200: id: 200 link: enp3s0 addresses: - 10.10.200.2/24这样一张物理网卡上就同时跑了两个网段的业务。VLAN的id范围是1到4094名字可以随便起vlan100只是方便记忆。如果你还做了BondVLAN的link直接指向bond0就行vlans: vlan10: id: 10 link: bond0 addresses: - 10.10.10.2/24这里有个细节VLAN子接口不要跟物理网卡共用同网段IP。比如物理口配了192.168.1.2/24又建了一个id为1的VLAN也配同网段路由表直接乱成一锅粥。VLAN规划时最好先把网段划分清楚别在同一个段里叠被子。4.2 Wi-Fi网络有自己的一套写法无线网络在netplan里和有线网络完全不是一个配置层级用wifis而不是ethernets。实验室或者移动工作站常见的配置是这样network: version: 2 renderer: networkd wifis: wlan0: access-points: MyLab_5G: password: mypassword dhcp4: true dhcp6: true注意两点。第一SSID如果带特殊字符钥匙里那个双引号不能省。我遇到过SSID里带点号和空格的情况不加引号netplan直接报YAML解析错误。第二密码如果全是普通字母数字还好一旦里面有$、#这些字符建议用单引号包住整个密码字符串否则shell和YAML两层转义叠加会让你怀疑人生。有件事必须提醒如果你在桌面环境里同时启动了NetworkManager服务wlan0极大概率会被NetworkManager抢占netplan写的Wi-Fi配置根本轮不到生效。桌面系统想用netplan管理Wi-Fi先把NetworkManager停掉。但这又会带来图形界面联网入口消失的问题所以我现在只建议无桌面环境才用netplan管Wi-Fi桌面上还是把渲染器留给NetworkManager。5. 多网卡多网关策略路由的正确打开方式5.1 为什么两条默认路由会打架一台机器装了两张网卡一张接办公网一张接服务器专网这个场景很常见。但如果你直接在配置里给两张网卡都写一条默认路由Linux的路由表只会留下一两条最匹配的。剩下的那条去哪了被覆盖了。结果就是你明明配了两个网关最后所有流量都从后加载的那个默认路由出去另一个网关完全成了摆设。这就是策略路由要解决的问题。Linux的策略路由机制其实不复杂系统先按优先级查一堆自定义路由表然后再查主路由表。我们可以给每张网卡各建一个路由表再告诉系统“从哪张网卡进来的流量就去查对应的那张路由表”。netplan里用routing-policy表达这个规则。5.2 用routing-policy做分流直接看配置这个是我压箱底的多网卡模板network: version: 2 renderer: networkd ethernets: eth0: addresses: - 10.0.0.2/24 routes: - to: default via: 10.0.0.1 table: 100 routing-policy: - from: 10.0.0.0/24 table: 100 eth1: addresses: - 192.168.1.2/24 routes: - to: default via: 192.168.1.1 table: 200 routing-policy: - from: 192.168.1.0/24 table: 200原理拆解一下table: 100和table: 200是自定义路由表的编号Linux允许使用200到65535之间的值100其实是示例实际用200/201之类更规范。eth0上配置了一条放进表100的默认路由同时声明“从10.0.0.0/24网段进来的流量去查表100”。eth1同理走表200。没有匹配到这两条规则的流量仍然走系统主路由表。这样办公网过来的流量从eth0对应的网关出去专网流量从eth1对应的网关出去互不干扰。配置好之后可以用这些命令验证ip route show table 100 ip rule show netplan status实际运维中我还会结合priority参数调整规则顺序routing-policy: - from: 10.0.0.0/24 table: 100 priority: 100优先级的数值越小越先匹配。如果以后出现更细粒度的分流规则比如某个特定IP段要走专线把它的优先级设高一点就能盖过网段级别的匹配。这个方案在双线接入场景里特别好使。比如一台堡垒机同时接了管理网和业务网如果不做策略路由你ssh跳板机可能一直卡在“连接超时”因为返回流量走了错误的网关。策略路由配好后两边互不干扰管理网断了也不影响业务网。6. 常见故障排查与避坑速查6.1 命令和排查链路配置netplan最怕的就是“看不出问题apply还成功但网络就是不通”。这种时候按顺序查# 1. 校验语法和生成配置 netplan generate # 2. 看当前生效的配置信息 netplan status # 3. 查自己写的YAML cat /etc/netplan/*.yaml # 4. 查看netplan生成的后端实际配置文件 ls -l /run/systemd/network/ cat /run/systemd/network/10-netplan-eth0.network # 5. 看systemd-networkd日志 journalctl -u systemd-networkd -f # 6. 检查DNS状态 resolvectl status我这里把netplan generate放在最前面。它不实际应用配置只负责将YAML翻译成后端的配置文件。如果语法有问题这步直接报错能快速排除一半的YAML坑。apply前一定要先用netplan try而不是netplan apply。try会先应用新配置然后启动一个回滚计时器。如果配置把网络弄断了你在这段时间内不去确认它自动回滚到上一个可用状态。这个机制救过我至少三次。远程操作服务器时手快直接apply的教训是血泪般的——整个人瞬间就失联了。6.2 高频报错表格与我的经验我做了一张高频问题速查表覆盖了这些年见过的大部分netplan翻车现场现象原因解决思路报错gateway4已经废弃配置里还在用老式gateway4:字段改用routes条目写默认路由apply提示YAML解析失败缩进用了Tab或者漏了空格统一用两个空格缩进别用Tab配置了静态IP但网络不通忘写DNS或者DNS指向了错误的网关检查nameservers用resolvectl确认物理网卡在桥里还反复出现IP网卡配置里留了dhcp4: true去掉物理网卡的DHCP配置DHCP获取不到地址配置缩进错dhcp4写在网卡外层确保dhcp4缩进在对应接口下面桥的虚拟机频繁断网STP开启导致收敛慢单交换机直接stp falseBond起不来成员网卡未接管网卡被NetworkManager占用停用NetworkManager重写配置无线网卡连不上SSIDSSID或密码带特殊字符引号包好密码用单引号最后再分享一个心得netplan这套配置系统的思维方式是把“网络应该是什么样”描述出来而不是写“怎么一步步实现”。一旦你接受这个理念脑子里的配置模型会清晰很多。我配置三层以上的虚拟网络时都会先在纸上画一张接口关系图再对着图写YAML基本一次到位。你也别照着网上的模板硬抄先想清楚物理口、桥、VLAN之间谁在谁的上面再动手写配置。
阅读完成 · 觉得有帮助?
咨询建站