最近在整理一套新版本Linux发行版上的网络配置方案,顺手把netplan从入门到实战梳理了一遍。这个系列第一篇,先聊最核心的东西:netplan到底是什么、怎么读它的配置、怎么在机器上快速上手。
如果你之前一直用传统配置目录里那一堆ifcfg或interfaces文件,刚切换到netplan时会有点懵:怎么配置文件突然变成了几个YAML文档?改了配置之后到底执行什么命令才生效?这些疑问在这篇里都会逐一拆开讲清楚。
整篇文章适合两类人:一类是刚接触新版本发行版、想快速把服务器网络跑起来的运维新手;另一类是已经在用netplan但只停留在“能改IP、能重启网络”阶段、想搞清楚背后逻辑的进阶使用者。我会从设计思路讲到实操命令,再补几个真实踩坑记录。
1. netplan是什么:新一代网络配置方案的由来
1.1 传统配置方式的几个痛点
在netplan出现之前,Linux发行版的网络配置长期处于“诸侯割据”的状态。有的系统用一套配置文件管理网卡参数,有的系统靠图形界面工具,还有的系统需要手动写脚本。问题在于,这些方案各有各的语法、各有各的重启方式,换一个发行版就要重新学一遍。
更麻烦的是,很多传统配置方案对“临时生效”和“永久生效”的区分很模糊。你手工敲一条命令改了IP,当时确实通了,但一重启就回到原来的样子;你去改配置文件,语法写错一个标点,网络服务直接起不来,连排查入口都得靠单用户模式进去慢慢找。
我最早在一批物理服务器上折腾网络时,就吃过这样的亏。明明只是加一条路由,结果因为配置文件里某个参数格式不对,整台机器的网络断掉,只能跑机房连显示器操作。这种体验经历一次就足够让人想换一套更靠谱的工具了。
1.2 netplan的设计思路:YAML声明式
netplan的核心思路很简单:把网络配置从“脚本式”变成“声明式”。你不是告诉系统“第一步做什么、第二步做什么”,而是直接描述“这台机器最终应该有哪些网卡、每个网卡应该是什么状态、数据包该怎么走”。系统拿到这份描述后,自己负责把它翻译成底层可执行的东西。
这种思路其实是从容器编排和配置管理工具里借鉴过来的。你用一份结构化的文件描述期望状态,工具负责收敛当前状态和期望状态之间的差异。netplan选用的描述语言是YAML,因为YAML可读性强、层级清晰,比传统配置文件那种“键值对+枚举项”的组织方式更容易看出整体结构。
举个例子,在传统方式里,配置一个DHCP获取地址的网卡,可能需要写好几行参数,还得注意不同系统之间参数名的差异。在netplan里,一段非常短的YAML就能说清楚:这块网卡就叫某个名字,它用DHCP获取地址,仅此而已。
1.3 渲染器到底在渲染什么
netplan里最常被忽略的概念是“渲染器”。通常创建配置时,需要指定用哪一个后端来管理网络。这一层抽象让netplan可以兼容多种底层网络栈,而不需要使用者关心具体细节。
常见的是两种选择:一种偏轻量、适合服务器场景,由系统自带的服务直接管理网络接口;另一种偏桌面场景,和图形化网络管理工具配合更紧密。选哪种取决于你机器的用途。服务器上我基本都用前者,因为它的依赖更少、行为更可预期。桌面环境下如果要用图形面板管理网络,后者会更顺手。
渲染器这个词听起来高大上,其实可以理解成“翻译官”。你写的YAML是通用需求文档,渲染器把它翻译成后端网络服务能听懂的命令和配置。所以同一份netplan配置,理论上可以跑在不同的后端体系之上,这就是设计上的解耦。
2. 核心概念与配置结构
2.1 配置文件在哪、命名规则是什么
netplan的配置放在系统的网络配置目录下,通常是一批以.yaml结尾的文件。系统启动或执行应用命令时,会读取这个目录下所有配置文件,把它们合并成一份完整的期望状态。
这里有个细节务必记住:文件是按文件名顺序加载的,后面的配置会覆盖前面的内容。这就带来一个非常实用的技巧:你不需要改动发行版自带的默认配置文件,只需要新建一个编号靠后的文件,把你自己的配置写进去,就能覆盖默认项。很多刚上手的人不知道这一点,直接在默认配置上改,一旦出错就失去了出厂兜底方案。
我习惯的做法是保留系统自带的配置文件不动,新建一个以数字开头的文件,比如90-custom.yaml,把自定义内容放进去。这样配置结构清晰,也方便后期排查。
2.2 顶层字段和网卡定义的对应关系
一份netplan配置文件的顶层结构通常包含版本号字段,以及一个单独的配置区域,后者是statement的核心部分。我在写的时候,版本号字段基本固定写成指定数字,这个字段会被用于兼容性检查。
网卡配置的关键结构是几类标识:
- 以太网接口:用于传统有线网卡,一般命名为小写的接口名,比如eth0、enp3s0。
- 无线接口:用于WiFi设备,其命名方式和有线网卡一致,但配置里会额外包含无线网络相关的参数。
- 链路聚合或绑定:把多块物理网卡聚合为一块逻辑网卡,兼顾冗余和带宽扩展。
- 虚拟局域网(VLAN):在物理接口上划分出带802.1Q标签的子接口。
- 网桥:把多个接口桥接在一起,常用于虚拟化场景。
这些种类之间的字段差异不小,但netplan把它们统一在一套YAML规则里。你只要学会最核心的几个通用字段,其余按需查阅即可。
2.3 一段标准配置长什么样
我把最常见的服务器配置贴在下面,并逐行解释含义。
这是一个基础模板:
network: version: 2 renderer: networkd ethernets: enp1s0: dhcp4: true这段配置的语义是:使用版本2的配置格式,系统自带的轻量级网络服务作为后端,机器上的enp1s0这块网卡通过DHCP自动获取IPv4地址。enp1s0是系统为该网卡分配的内核名称,不同机器上可能不同。你可以随时通过ip命令查看设备实际名称。
如果你想配置成静态IP,写法就长一些:
network: version: 2 renderer: networkd ethernets: enp1s0: addresses: - 192.168.1.10/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 114.114.114.114 - 8.8.8.8这里明确写了IP地址和子网掩码长度、默认网关、DNS服务器地址。YAML的缩进和短横线列表格式如果写错,命令执行时会直接报错,而且报错信息有时候不那么直观,这是新手最容易卡住的地方。
3. 从零上手:环境准备与第一个生效配置
3.1 如何确认机器上是否已有netplan
大部分新版本的发行版会预装netplan,但仍需确认它可用。打开终端输入netplan --version查看版本号,如果提示命令不存在,则需要安装对应的软件包。安装命令在不同发行版下不太一样,但都属于常见基础包安装操作。
安装完成后,检查一下配置目录里是否有默认配置文件。正常情况下至少有一个文件存在,这才是配置正确加载的基础。
3.2 先做一个DHCP配置让机器通网
不管目标最终是什么IP规划,我建议第一步永远先确认机器能通过网络访问。先把某个网卡设为DHCP自动获取地址,排除物理链路和驱动层面的问题。
操作流程是这样:
- 查看当前网卡名称,使用ip命令列出所有网络接口。
- 在配置目录下新建一个文件,从模板开始,写上你要用的网卡名并开启dhcp4。
- 执行netplan apply让配置生效。
- 再次使用ip命令确认网卡是否拿到地址,并检查默认路由是否生成。
这个过程能顺利跑通,说明netplan本身工作正常,接下来再往里面加静态配置就有把握多了。
3.3 从DHCP切换到静态IP的完整示例
在真实服务器场景中,固定IP往往是必须的。切换时注意一个关键点:netplan的配置是整体覆盖式的,你开启dhcp4之后如果又在同一块网卡下面写了静态地址,行为会比较微妙,通常建议只采用一种地址获取方式。
具体到一个实际案例:我的某台服务器需要配置192.168.10.5/24的地址,网关是192.168.10.1,DNS用一个内网解析服务器。那么配置可以这样写:
network: version: 2 renderer: networkd ethernets: enp2s0: addresses: - 192.168.10.5/24 routes: - to: default via: 192.168.10.1 nameservers: addresses: - 10.0.0.53写完执行netplan try,这个命令会先把配置试着应用上去,并开始一段倒计时。如果倒计时内你没有取消,配置就正式生效;如果网络断了,你可以在倒计时内按回车回滚。我强烈建议所有远程操作都用try而不是apply,理由下文会细讲。
3.4 多网卡机器上的配置顺序
很多服务器不止一块网卡。此时要注意默认路由的归属问题:如果多块网卡都配置了default路由,系统会按路由优先级选一条,而优先级和网卡名、metric值都有关系。netplan允许在路由配置里显式指定metric,避免多网卡环境下的路由打架。
比如我有两块网卡,一块接内网,一块接外网。正确的做法是:内网网卡只配置内网网段的路由,不设置default路由;外网网卡才设置default路由。这样业务流量走外网,内网访问走内网,互不干扰。如果两块网卡都设default路由,很可能出现访问外部地址时从内网网卡出去的情况,然后所有请求全部超时。
netplan不好debug的一个点就在这里:每个网卡的配置单独看都正确,组合在一起就出问题。排查时一定要用ip route看实际路由表,而不是只看配置文件。
4. 实操中的关键检查与生效逻辑
4.1 netplan try和netplan apply到底差在哪
这是新手最容易混淆的一对命令。netplan apply是直接把当前配置强行应用,不问你同不同意。netplan try则多了一层保护机制:它先应用新配置,然后启动一个默认倒计时的等待窗口,并提示你在窗口内按回车确认或取消。
为什么需要这种设计?因为网络配置一旦生效,你当前的SSH连接可能立刻断开。如果是apply直接应用,配置错了就要跑机房或靠其他带外管理手段修复;如果是try,只要倒计时还在,哪怕连接断了,系统也会自动恢复旧配置。所有远程服务器操作,能用try就别用apply,这是我用了几年netplan后最深的一条经验。
还有一条隐藏规则值得注意:执行netplan try后,如果终端卡住没反应,别急着按回车,看清楚提示是“回车确认保留配置”还是“任意键回滚”。方向搞反了,反而把正确的配置取消了。
4.2 配置文件的优先级与覆盖规则
netplan加载配置的顺序是文件的字典序。这就产生了一个实际应用场景:发行版自带的配置文件通常定义了一些通用参数,你可以在后续文件里覆盖其中的网卡配置。比如默认配置把某个网卡设为DHCP,你在后序文件中把同一块网卡改成静态IP,后加载的内容会覆盖前面定义。
但覆盖的粒度是“键级别”的。你把网卡从dhcp4: true改成静态地址,如果新配置里没写dhcp4字段,那么实际上dhcp4状态就变成默认值,而不是继承。所以多文件覆盖时,最好把要覆盖的网卡配置项写完整,避免依赖继承关系。
我见过有人为了图省事,后序文件里只写了ip地址,结果网卡还是走DHCP,怎么都不生效。排查半天才发现是覆盖不彻底。netplan不会报错,因为配置在语法上合法,只是语义上不是你想象那样。
4.3 配置生成后的底层状态怎么验证
经常有人问:netplan apply执行成功了,但网络还是不通,到底哪一步出了问题?要回答这个问题,得知道netplan把YAML配置翻译成什么。
如果使用networkd渲染器,真正的网络配置会生成到系统服务的配置目录下。用systemctl status查看网络服务状态,能看到它加载了哪些配置文件、有没有报错。如果生成的配置有问题,日志里会明确提示。
用networkd时,还可以用networkctl命令查看所有受管设备的当前状态。它会列出设备名称、类型、操作状态、配置状态等信息。如果某个网卡显示“未配置”,说明netplan生成的配置没有覆盖到它;如果显示“已配置”,则说明底层已经按配置执行了。
这套命令组合非常实用:netplan负责描述,底层服务负责执行,networkctl负责给你反馈。三层各司其职,排查时逐层确认即可。
5. 常见问题与排查技巧实录
5.1 执行apply时提示“配置错误”怎么办
netplan对YAML格式有严格校验,常见错误集中在缩进、短横线、冒号后空格这几处。我整理了一张快速排查表:
| 问题现象 | 常见原因 | 排查方式 |
|---|---|---|
| 报错信息提示某行格式错误 | YAML缩进不一致 | 用支持YAML高亮的编辑器检查,确保缩进统一用空格 |
| 某字段值不合法 | 地址未带掩码长度 | 检查addresses里的IP是否写了/xx |
| 配置能应用但网卡没生效 | 网卡名称拼写错误 | 用ip命令核对设备实际名称 |
| 默认路由丢失 | 路由表被覆盖 | 检查是否多块网卡都定义了default |
还有一类隐蔽问题:配置文件里用了Tab缩进。YAML规范要求用空格缩进,Tab会导致解析器在某个层级突然断开,报错位置往往和你实际出错位置对不上。排查时第一件事就是把所有不可见字符显示出来,优先排查Tab。
5.2 远程机器配置错了网络,怎么救回来
这是最让人头疼的场景。前面推荐的netplan try就是为了这种时刻存在,但如果已经用了apply,网络断开了怎么办?
首先看有没有带外管理渠道,比如远程管理卡或云平台的控制台。这些渠道通常能给你一个访问终端的能力,即使业务网断开也能操作。如果没有带外能力,只能恢复默认配置或请现场人员协助。
从经验来看,强制要求自己养成一个习惯:任何远程修改网络配置之前,先做两件事,一是备份当前配置目录,二是写一个能自动恢复的定时任务,万一断了连接也能自动还原。虽然操作成本低,但关键时刻能救命。
备份命令很简单:
cp -r /etc/netplan /root/netplan-backup-$(date +%Y%m%d%H%M%S)5.3 无线网络配置里的一个隐藏坑
无线网络配置比有线多一个步骤:需要预共享密钥。密钥需要被转换成一个特定格式的哈希值,然后再写进YAML里。很多人直接拿明文密码填进去,connect时提示认证失败。
正确做法是用系统命令把密钥转换成哈希格式,然后把哈希值粘贴到配置文件的password字段中。转换命令依赖于你使用的发行版和加密方式,不同环境差异较大。
这里有另一个常见问题:配置文件里存储的凭据权限不足,会导致网络服务无法读取密钥。所以配置文件的权限要适当收紧,同时确保拥有者是正确的系统用户。我用过一次原本一切正常、后来突然认证失败的案例,最后发现是某个自动化脚本把配置文件的权限改宽了。
5.4 网卡名称老变导致的配置失效
某些环境下重启后网卡名称会变化,比如同样的物理位置,这次是enp3s0,下次变成enp4s0。配置文件里写死了旧名字,自然就不生效。
解决方案是用匹配规则替代固定名称。netplan允许通过MAC地址来匹配网卡。但需要注意机器有多个网卡时,要确保MAC地址正确对应目标接口。
另一种做法是用接口位置等属性匹配。对于网卡较多、需要严格对应物理位置的场景,这一招更可靠。我见过不少人在虚拟机环境里折腾,其实虚拟网卡名称很稳定,并不需要这么复杂,但物理机多网卡环境下这套技能很实用。
5.5 应用配置后DNS没生效
DNS配置错误的表现很狡猾:网络是通的,ping IP地址没问题,但解析域名失败。这时先确认配置文件里有没有写nameservers段落,再看系统当前的DNS解析配置用的什么。
在一些使用systemd的系统上,DNS配置的体现方式是生成一个符号链接或临时文件。如果netplan配置了DNS但系统解析没有走它,可能是系统里另外的DNS管理工具在起作用。
我遇到过一种情况:公司内网DNS和公共DNS同时配置时,某些域名解析到内网地址后无法访问。最后把公共DNS拆出去单独配置,问题才解决。多DNS配置排序问题值得单独验证。
6. 系列小结与下一篇预告
就我自己的使用体验而言,netplan带来的最大变化不是语法本身,而是思路上的转变:以前我是“逐条执行命令去改系统”,现在是“描述一个目标状态让系统自己去收敛”。这种声明式的思维方式,和当前主流的基础设施即代码理念是完全一致的。配置文件本身就是代码,可以纳入版本管理、可以做评审、可以回滚,这比传统手动敲命令可维护性高太多。
最后再分享一个小技巧:练习netplan时,我在虚拟机上建了好几个快照,每次改配置前拍一个,改坏了马上回滚。配合netplan try的自动回滚机制,几乎不会把自己卡死在失联状态。这种“低成本试错”的练习方式让我在短时间内把各种配置组合都试了一遍。
下一篇我准备深入系统服务相关的细节,给大家看看netplan生成的底层配置到底长什么样,在出问题时如何从底层配置反推YAML里的错误。同时会聊聊多网卡路由优先级和VLAN子接口的实际配置案例。如果你在实践过程中遇到了其他问题,欢迎在评论区留言,我会挑选高频问题整理成专题内容。
网络配置这东西,看着简单,细节里全是坑。希望这篇能帮你少走我走过的弯路。