资讯详情

资讯详情

Ubuntu配置静态IP全攻略:Netplan YAML从入门到排障

先说结论Ubuntu 上配静态 IP 这件事本身不复杂但坑是真的多。我帮人排查过太多次“重启就断网”“IP 明明改了却不生效”“YAML 缩进看着没问题就是报错”之类的问题绝大多数都不是配置本身难而是没搞清楚 Ubuntu 现在用的是哪套网络管理方案。这篇文章就把整个链路完整走一遍从网卡识别、Netplan 配置、多场景变体到故障排查最后再给一套可以直接抄的作业。1. 先搞清楚配置静态 IP 之前得知道 Ubuntu 现在到底归谁管1.1 为什么现代 Ubuntu 都在用 NetplanUbuntu 从 17.10 开始默认的网络配置工具换成了 Netplan。这是 Canonical 自己做的一套 YAML 抽象层它本身不直接干活而是负责把 YAML 配置翻译成后端服务能读懂的配置。听起来绕但你只要理解一件事在 Ubuntu 18.04 之后的系统里改静态 IP 通常改的就是 /etc/netplan/ 下面的 .yaml 文件然后执行 netplan apply。为什么 Canonical 要搞这么一层因为历史上比较混乱桌面版默认用 NetworkManager服务器版默认用 systemd-networkd。两套工具各有各的配置格式和习惯用户切来切去很容易出问题。Netplan 的出现就是为了统一这个体验——你面向 YAML 写一套配置Netplan 根据系统情况决定交给 NetworkManager 还是 systemd-networkd 去落地。我在学习这个工具时最大的启发是把 Netplan 理解为一个“翻译官”。你写的 YAML 不是最终生效的配置最终生效的是 systemd 生成的 .network 文件或 NetworkManager 的 keyfile。所以当你排查问题时如果 YAML 看着没问题却还是通不了网不妨去看一眼后端生成的文件往往能发现真正的问题。1.2 网卡命名规则你的网卡叫 eth0 还是 ens33背后有讲究很多新手上来就找 eth0结果发现 Ubuntu 服务器上根本找不到这个名字反而冒出 ens33、enp0s3、eno1 这种奇奇怪怪的接口名。这不是系统抽风而是 systemd 的“可预测网卡命名规则”在起作用——从 Ubuntu 16.04 之后网卡名称不再是任意的或依赖加载顺序的而是根据硬件位置、总线信息、MAC 地址等生成固定名字。VMware 虚拟机里常见的 ens33就是根据 PCI 槽位信息生成的。我见过太多人卡在这一步配置文档里写着 eth0自己的机器上却只有 ens160于是觉得文档不对。实际只要换个思路——先看看自己机器上到底有哪些网卡再决定配置哪张。查看网卡的基本命令ip link show # 查看所有网络接口的状态 ip -4 addr show # 查看 IPv4 地址信息 ip route show # 查看路由表从这些命令的输出里你可以确认网卡名、是否 up、当前的 IP、默认网关。这些信息是你写 YAML 之前必须掌握的。另外顺便说一句ifconfig 这个老牌命令在新系统上往往需要额外安装 net-tools 包才存在而 ip 命令是 iproute2 套件的一部分系统默认就带。长期来看直接用 ip 命令更省心。1.3 Netplan 的两个后端NetworkManager 和 systemd-networkdNetplan 的 YAML 里有一个可选项 renderer NetworkManager 或 networkd。桌面版 Ubuntu 默认会用 NetworkManager服务器版则更常见 to networkd。还有一个 trick如果你用的是 Ubuntu 桌面版又在终端里手动改了 YAML但没有留意 renderer 是哪个就可能出现“改了配置但网络管理程序把它覆盖了”的情况。所以操作前建议先确认系统用的谁systemctl status NetworkManager # 看是否运行 systemctl status systemd-networkd # 看是否运行如果两个都在跑一般以 NetworkManager 为主桌面版就是这样。此时你改 Netplan 就不一定管用或者要用 nmcli 去改。为了不让文章一开始就把人绕晕我建议服务器版往 systemd-networkd 方向走直接用 Netplan桌面版优先用 GNOME 图形界面改或者用 nmcli 改。这样各自走自己最顺的路避免两头打架。2. 动手之前的三件事备份、查设备、记下当前网络信息2.1 备份现有配置这是成本最低的后悔药修改网络配置最怕的是改完之后连不上服务器。尤其是通过 SSH 远程操作的时候一旦 IP 失效、断线你只能跑去机房或者用带外管理控制台去恢复。所以我的习惯是改任何东西之前先把整个 /etc/netplan/ 目录备份一份。sudo mkdir -p /root/netplan-backup sudo cp -r /etc/netplan/* /root/netplan-backup/备份为什么重要因为你一旦把现有配置破坏掉至少能快速回滚。另一个实用技巧是备份之后把当前生效的 IP、网关、DNS 都记在本子上或本地文件里万一后面需要手动配临时 IP 才能重新连上这些信息就是救命的数据。2.2 确认网卡状态和使用场景这部分我强烈建议做一次“体检”。命令如下ip link show # 确认 UP 状态 cat /sys/class/net/*/address # 查看 MAC 地址多网卡时很有用 lspci | grep -i ethernet # 查看 PCI 网卡型号可选关键点在于你要搞清楚自己到底要配哪张网卡。很多服务器上有多个网口比如管理口、业务口、存储口。配置错了不仅静态 IP 不生效还会导致路由错乱。我的做法是先拔掉不用的网线看哪个网卡 link 状态变成 DOWN这样就能定位到具体接口但生产环境下不能拔线的话就用 MAC 地址和物理位置去对号入座。如果是在虚拟化环境VMware、VirtualBox、KVM网卡通常只有一块命名一般是 ens33、enp0s3、eth0 这类反而简单。不过虚拟机里有一个常见的坑网卡的硬件 MAC 可能会变。如果你是克隆出来的虚拟机Ubuntu 可能会把新网卡识别成一个新接口ens34导致 Netplan 里写的 ens33 找不到。这种情况后文会专门讲。2.3 记录当前的 IP、网关、DNS在改配置前把当前网络参数完整抄下来ip addr show # 查看 IP 和掩码 ip route show # 查看默认网关 cat /etc/resolv.conf # 查看 DNS注意有的版本是软链记录这些信息有双重意义一是配置模板里需要网关和 DNS 作为参考二是万一新配置失败你还能用旧参数临时恢复。我的体会是很多人着急改静态 IP结果忘记把 DNS 填上导致外网域名解析失败。IP 能 ping 通网关但域名解析不了都是这一步偷懒的后果。3. 核心实操用 Netplan 配置静态 IP 的完整流程3.1 定位 Netplan 配置文件Ubuntu 的 Netplan 配置路径在 /etc/netplan/目录下常见的文件有99-config.yaml自定义配置命名序号不同00-installer-config.yaml安装器自动生成的配置01-network-manager-all.yaml桌面版常见的无线配置文件命名规则是两位数字开头数字小的优先读取。多文件并存时如果同台机器上有多个接口每个文件管不同接口通常没问题但如果两个文件定义了同一接口后面的“合并或覆盖”规则就会非常令人困惑。所以建议的做法是只保留一个你认可的配置文件或者把旧文件移动到备份目录。查看当前配置ls /etc/netplan/ sudo cat /etc/netplan/*.yaml你大概率会看到类似下面的内容network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: true这是典型的安装器生成的默认配置——开启 DHCP。我们要做的事情就是把它改成静态 IP。3.2 写 YAML 的核心格式缩进、冒号和缩进的魔鬼细节Netplan 配置最让人脑袋疼的地方就是 YAML 的缩进格式。YAML 不认 Tab只能空格同一个层级缩进必须一致键和值之间要在冒号后加空格列表项要以“- ”开头并且后面有空格。这些看起来很基础但我见过太多生产事故就是因为缩进不一致。举个例子错误写法network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: false addresses: - 192.168.1.100/24 # 这里其实是合法但容易导致歧义正确且可读性更高的写法是在列表元素上方多缩进一层network: version: 2 renderer: networkd ethernets: enp0s3: dhcp4: false addresses: - 192.168.1.100/24配置的核心选项包括addresses: 一个列表可以写多个 IP格式是“IP/掩码长度”。注意这里不再是“IP netmask”的写法而是直接写 CIDR 格式例如 192.168.1.100/24 表示掩码 255.255.255.0。routes: 网关通过路由表配置默认路由写法是 to: defaultvia: 网关地址。nameservers: DNS 服务器的列表以及搜索域 search。dhcp4 / dhcp6: 布尔值 true/false不需要加引号。3.3 一份完整可用的静态 IP 配置示例假设你的网卡是 enp0s3想配置以下参数IP 地址192.168.1.100掩码255.255.255.0即 /24网关192.168.1.1DNS 首选114.114.114.114DNS 备用192.168.1.1那么 /etc/netplan/00-installer-config.yaml 的内容应该是network: version: 2 renderer: systemd-networkd ethernets: enp0s3: dhcp4: false dhcp6: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 114.114.114.114 - 192.168.1.1 search: - localdomain写完之后最好先做一些语法校验。Netplan 自带测试命令sudo netplan get # 查看当前解析后的配置如果 YAML 语法有问题netplan get 或后续的 apply 都会给出错误提示。我习惯把它当作文法检查器用。3.4 应用配置netplan try 和 netplan apply 有什么区别这是整套流程里最需要养成习惯的一个环节。很多教程只说“执行 sudo netplan apply”但我强烈建议在远程操作时用sudo netplan try。netplan try 的特点它会先应用新配置然后等待 120 秒默认。如果你没在倒计时结束前按回车确认它会自动回滚到上一个可用配置。这个机制就是为远程维护设计的——即使你改了配置导致 SSH 断连只要你不主动确认过两分钟它就会自动回滚你还能重新连上。netplan apply 的特点立即应用配置不等待、不自动回滚。只要 YAML 语法没错它就会直接生效。本地有显示器的机器无所谓但远程服务器一旦配置错误你可能就失联了。我的个人流程是# 第一步用 try 试水 sudo netplan try # 第二步确认网络正常后按回车确认保留 # 第三步如果 try 期间就出现断连等回滚排查后再来如果你确定配置没有问题显示器就在旁边也用不到远程那直接用 apply 也完全可以。但服务器维护这行谨慎一点永远没错。3.5 应用后的验证别只看 IP 变了配置生效后要验证三件事接口确实有了新 IPip -4 addr show enp0s3默认路由正确ip route show能看到 default via 192.168.1.1DNS 能解析ping -c 3 192.168.1.1和ping -c 3 www.baidu.com第三点特别关键因为 DNS 配置经常被忽略。如果 ping IP 通ping 域名不通基本就是 nameservers 没配好或后端没正确读取配置。4. 不同场景下的静态 IP 配置变体虚拟机、桌面版、老版本、无线网卡4.1 虚拟机环境里最容易踩的坑克隆后网卡名漂移在 VMware 或 VirtualBox 里配置静态 IP常见的坑是网卡名不稳定。比如你从模板克隆一台 Ubuntu 虚拟机克隆后原网卡 ens33 变成了 ens34或者 ens33 不见了这通常是因为克隆导致网卡 MAC 变化而 systemd 的规则认为这是“新网卡”。我建议你在虚拟机里配置静态 IP 之前先用ip link show确认当前的接口名。如果发现和之前不一样需要修改 /etc/netplan/ 里的 YAML把 ethernets 下面的键改成实际存在的接口名。另一种做法是直接在 VMware 里把网卡的网络类型改成“桥接”或“NAT”之后进系统确认接口名。不要凭记忆写配置直接看新识别出来的名字。更进阶的方案是通过 netplan 的 match 参数按 MAC 地址匹配接口这样网卡名怎么变都不影响network: version: 2 ethernets: my-eth: match: macaddress: 00:0c:29:xx:xx:xx dhcp4: false addresses: [192.168.1.100/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [114.114.114.114]不过这个写法仅建议在有经验的场景下使用——毕竟如果 MAC 写错了网卡直接配不上。对新手来说老老实实确认接口名更稳妥。4.2 桌面版 Ubuntu就别折腾 Netplan 了用 GUI 或 nmcliUbuntu 桌面版默认带 NetworkManager你在系统设置里看到的“网络”面板就是它的图形界面。点击右上角的网络图标选择“有线设置”然后按以下顺序操作选择对应的网卡如 Wired 或以太网点“IPv4”标签页方法选“手动”填 Address、Netmask、GatewayDNS 填在 DNS 输入框点“应用”并重新连接这种方式最直观也最适合不会命令行的用户。但问题是命令行玩家总觉得 GUI 不够爽又想去改 /etc/netplan/。我的建议是桌面版就理想你了 GUI或者用 nmcli 改不要混用 Netplan。如果你实在想在桌面版上用 Netplan也不是不行但需要把 NetworkManager 停掉或者改变 renderer 为 networkd。这会导致你失去桌面网络管理功能我认为完全没必要。桌面版还有一个常见需求设置静态 IP 后无线网卡Wi-Fi的配置。如果你连接的是无线网有线配置的方式不一定通用因为 WiFi 需要 SSID 和密码。Netplan 配置无线网卡的 YAML 大致长这样network: version: 2 renderer: networkd wifis: wlp2s0: dhcp4: false addresses: [192.168.1.101/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114] access-points: MyWiFi: password: your-password注意Netplan 里的无线配置对密码格式和引号有要求SSID 和 password 都要按字符串处理。配置生效后可能需要重启网络服务或重启系统才能连上 Wi-Fi。我的经验是无线环境下如果静态 IP 一直不生效优先考虑是不是 NetworkManager 在抢占网络控制权或者用 nmcli 直接改更省事。4.3 老版本 Ubuntu/etc/network/interfaces 时代的配置方式如果你还在 Ubuntu 18.04 或更早版本静态 IP 配置走的是另一套体系/etc/network/interfaces 配合 ifupdown。写法大概是auto ens33 iface ens33 inet static address 192.168.1.100 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 8.8.8.8 114.114.114.114修改之后需要重启网络服务sudo systemctl restart networking虽然这套体系在旧系统上很合理但如果你安装了较新版本的 Ubuntu还要强行用 /etc/network/interfaces大概率不生效因为 Netplan 会覆盖或忽略它。升级到 18.04 以后请紧跟 Netplan 的步伐别再用老命令去配网络。说句题外话和 Ubuntu 同源但走另一条路的系统也存在比如 Rocky Linux、CentOS 系列用的主要是 NetworkManager 和 nmcli。nmcli 命令风格完全不同但思路一致先找到网卡再设置 IPv4 方法和地址。这里就不展开说 RedHat 系了但如果你两个发行版都玩一定要注意“工具链”的差异不然很容易把 Ubuntu 的经验硬套到 Rocky 上。4.4 多网卡场景如何避免配置完 IP 就断网服务器上多网卡很常见。有些机器是双网卡冗余有些是管理网和业务网分离。此时配置静态 IP 要格外小心每个网卡要配独立且不冲突的网段。比如 eno1 配 192.168.1.x/24eno2 配 10.0.0.x/24。默认路由只能有一个。多网卡时如果你给两张卡都配了 default 路由系统会因为“谁谁谁先谁后”的问题出现路由混乱、出网时通时不通的现象。策略路由是处理双网卡的高级玩法新手暂不建议。我的建议先搞清楚这张机器是“单网卡走默认路由”还是“多网卡访问不同网段”。大多数新手场景都是单网卡就按最简单的默认路由配。多网卡时认真检查 ip route show除了 default不要有其他可疑路由。5. 常见故障与排查全记录我每天都能遇到的问题5.1 netplan apply 之后立刻断连这是最严重的问题。原因大概率是以下三种IP 和局域网内其他设备冲突。你把 IP 配到别人机器上网关或交换机 DHCP 绑定就会出问题。我一般先arp -a看看局域网里有没有相同 IP或者临时换个 IP 测试。网关卡名写错了实际接口并不是 YAML 里的那一个。Netplan 配置了一个不存在的接口等于没配置。默认路由配错了。比如网关应该是 192.168.1.1你写成了 192.168.2.1结果包发不出去。排查方式本地有显示器就直接看网络图标远程的话只能去控制台VNC、带外管理、云服务商控制台操作。这也是我一直强调 try 命令的原因——try 会在 120 秒后回滚至少给你留了一条活路。还有一种比较隐蔽的情况修改后 DNS 失效。如果配置里漏了 nameservers或者写了个不可达的 DNS你应用后会发现“IP 看着没问题ping 网关也通但就是上不了网”。此时优先检查 /etc/resolv.conf 的内容确认 DNS 有没有被更新。5.2 /etc/resolv.conf 是个软链不要直接改它在 Ubuntu 18.04 上/etc/resolv.conf 通常是指向 systemd-resolved 生成文件的软链。很多教程教人直接 vi /etc/resolv.conf 填 DNS 地址结果一重启就被系统覆盖回默认。正确做法是写 Netplan 时在 nameservers 里指定 DNS执行 netplan apply 来生成新的 resolv.conf如果 isystemd-resolved 占用就用resolvectl status、resolvectl dns查看 DNS。我之前也踩过这种坑配完静态 IP 后为了临时测试手改了 resolv.conf结果发现每次重启都会覆盖折腾半天才明白根源。现在凡是配置 DNS我只在 Netplan 或 nmcli 里改。5.3 YAML 语法校验和常见报错Netplan 对 YAML 的容错并不高。执行 netplan apply 时常见报错YAML syntax error缩进、Tab、引号问题。cannot parse ...键名写错或格式不对。unknown key gateway4在 Ubuntu 22.04 之后gateway4 已经被弃用要用 routes 代替。这算是一个版本坑。很多老教程还在用 gateway4在新版上会直接报错。如果你实在看不出 YAML 哪错了可以用 python 解析python3 -c import yaml, sys; yaml.safe_load(open(/etc/netplan/00-installer-config.yaml)); print(YAML OK)这比肉眼反复看缩进靠谱得多。还有一个常见问题是配置文件权限不对。Netplan 配置文件一般都要 600 权限不能太开放不过如果用户手动创建文件时用了默认权限 644系统通常也能解析但某些严格后端会报警。稳妥起见可以执行sudo chmod 600 /etc/netplan/*.yaml5.4 重启后配置丢失最容易被忽略的“网络管理服务冲突”有一种极其常见的情况静态 IP 在刚刚 apply 之后是好的但只要重启系统IP 又变回了 DHCP 获取到的地址。这种情况在桌面版或装了 NetworkManager 服务的主机上非常多核心问题是Netplan 配置的 renderer 是 networkd但 NetworkManager 在启动时接管了网络接口用自己的配置覆盖掉了 Netplan 的配置。解决方案确认 renderer 使用哪个后端如果系统里 NetworkManager 在跑而你想用 Netplan 管理该网卡有两种办法在 YAML 中明确 renderer: NetworkManager然后使用 nmcli 管理静态配置更稳禁用 NetworkManager 对这张网卡的管理或干脆停止 NetworkManager 服务。服务器版一般没这个问题因为默认只有 systemd-networkd 在跑。桌面版按第 4.2 节走 GUI 或 nmcli 就好。还有一个“重启后丢配置”的版本原因Ubuntu 24.04 开始某些场景下 Netplan 默认把它生成的配置交给 systemd-networkd但安装桌面版时页面可能选择 NetworkManager 作为后端。如果你从桌面版改服务器用途一定要先检查 renderer。5.5 无效配置后如何恢复如果配置已经应用坏了连不上机器怎么办别着急有层次可以救如果是远程连不上用云服务商的 VNC、Web Console或者本地键盘显示器登录。在终端里直接改回备份的配置sudo cp /root/netplan-backup/00-installer-config.yaml /etc/netplan/执行sudo netplan apply如果 Netplan 本身起不来了可以先用sudo dhclient eth0或sudo dhclient ens33临时让网卡从 DHCP 获取地址连上之后再去修配置。这个恢复思路在实际运维里特别重要。我见过有些人在配置服务器时临门一脚把自己锁在门外结果只能去机房物理恢复。备份 try 恢复预案这三步做到了基本可以放心大胆折腾。6. 经验心得与一套安心操作清单6.1 静态 IP 规划的三条铁律多配几台机器之后你会发现真正的问题往往不在命令而在规划。我给自己定了几条铁律IP 段要和局域网现有网段一致不能凭空想象。先看网关和同网段其他机器的 IP。静态 IP 要避开 DHCP 地址池。如果你家路由器默认分 100~200那静态 IP 建议用 2~50 或 200 的区间避免冲突。记录 IP 和 MAC 的对应关系。尤其是管理多台服务器的时候一张表格能省太多事。每台机器的网卡 MAC、IP、网关、DNS、用途写清楚后续排查会方便十倍。6.2 我的推荐操作顺序照抄版)如果你是 Ubuntu 22.04/24.04 服务器版想配置静态 IP我的建议流程是# 1. 确认网卡名 ip link show # 2. 备份配置 sudo mkdir -p /root/netplan-backup sudo cp -r /etc/netplan/* /root/netplan-backup/ # 3. 编辑配置 sudo vim /etc/netplan/00-installer-config.yaml # 4. 改完后先 test主要看 YAML 语法 sudo netplan get # 5. 试运行 自动回滚 sudo netplan try # 6. 确认没问题后正式 apply sudo netplan apply # 7. 验证 ip addr show ip route show ping -c 3 8.8.8.8这套顺序我用了很多年没有出过大问题。为了避免把网络配置改死我还习惯在 try 的时候多观察几分钟确认 SSH 不断、外网能通才敲回车。6.3 最后写给新手的一句话配置静态 IP 这件事本质上就是三步知道网卡叫什么把 YAML 写对把配置应用上。但每一步都可能藏着版本差异、服务冲突、网络规划问题。所以别急着抄一段配置就往上贴花两分钟先用 ip 命令把现状看清楚再动手改。这样至少能避免 80% 的“我不小心把自己锁在门外”事故。
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →