Ubuntu 配网实战:Netplan、静态 IP、DNS 与 SSH 排障
一台刚装好的 Ubuntu图形界面里点几下就能上网但一旦换成 Server 版、装进虚拟机、或者插上开发板配网这件事立刻从点点鼠标变成改文件、敲命令、断网自救。这篇就把 Ubuntu 配网这件事讲透从 Netplan 的写法、NetworkManager 的用法到静态 IP、DNS、网关的设置再到 SSH 连不上、域名解析失败这类高频故障的排查链路最后收在虚拟机和开发板这两个特殊场景上。不管你是刚接触 Ubuntu 网络配置的新手还是折腾过几次双网卡、多 IP 的老手这里的内容都能直接抄作业。我会尽量少讲教科书定义多讲为什么这么配和哪些坑我踩过。Ubuntu 从 17.10 之后配网方式换过一次代旧教程里gateway4满天飞新系统上跑起来直接报 warning很多人照着老博客配完发现网络没起来问题就出在这。所以下面每一处配置我都会说清楚它在哪个版本上有效、为什么不建议用另一种写法。1. 先弄清Ubuntu的网络管家是谁Netplan、NetworkManager和systemd-networkd的分工1.1 为什么同一个系统里能同时躺着三套配网工具第一次看 Ubuntu 网络相关的文档很容易被绕晕有的说改/etc/netplan/*.yaml有的说用nmcli还有的说改/etc/network/interfaces。其实这三个东西不是竞品而是分工不同。systemd-networkd是底层的网络管理守护进程负责真正把 IP 地址、路由、DNS 落到网卡上。NetworkManager是另一个更上层、更适合桌面环境的网络管理服务能自动切换 Wi-Fi、记住密码、管理各种连接。而Netplan是 Canonical 做的一层配置翻译器——你写一份 YAML它帮你翻译成 systemd-networkd 能读的配置或者交给 NetworkManager 去执行。关键点在于同一时刻这两个后端一般只跑一个。桌面版 Ubuntu 默认用 NetworkManager 当后端Server 版默认用 systemd-networkd。这就是为什么你在 Server 上折腾nmcli会发现它动不了网卡因为根本没装 NetworkManager或者装了但没接管这些接口。理解了这层关系配网时就不会瞎改文件了。你只需要问自己一个问题我的系统当前用哪个 renderer答案通常写在 netplan 配置文件的renderer:字段里或者用一条命令看服务状态systemctl is-active NetworkManager systemd-networkd哪个输出是active基本就是谁在主事。桌面版看到 NetworkManager activeServer 版看到 systemd-networkd active这属于正常现象。注意不要同时让 NetworkManager 和 systemd-networkd 去管理同一张网卡两个服务抢同一块设备会出现地址反复抖动、DNS 忽有忽无的诡异现象排查起来非常费劲。1.2 用一条命令判断该改哪个文件我习惯先看一眼当前网络状态和配置文件的位置判断改哪边最省事。ip -br a ls /etc/netplan/ nmcli -t -f NAME,DEVICE connection show 2/dev/null第一条看接口和地址第二条看有没有 netplan 配置文件第三条看 NetworkManager 里有多少个已保存的连接。如果/etc/netplan/下有50-cloud-init.yaml或01-netcfg.yaml这类文件说明这台机器是被 netplan 管的。这里有个新手常踩的坑在云主机或某些镜像里配置文件叫50-cloud-init.yaml它是由 cloud-init 生成的。你手改这个文件下次重启 cloud-init 可能又把它覆盖回去白改一场。正确做法是新建一个编号更小的文件比如01-custom.yamlnetplan 会按文件名顺序处理数字小的优先级更高覆盖掉后面文件里的同名字段。1.3 桌面版和Server版的默认差异决定了你该用哪种方式桌面版和 Server 版的配网习惯完全不同硬套会很难受。桌面版日常连 Wi-Fi用图形界面或者nmcli最顺手NetworkManager 会自动处理漫游、DHCP 续约这些事。Server 版常年插网线、跑固定服务用 netplan 写静态 IP 更稳配置全部落在文本文件里适合版本管理和批量部署。我的建议是跟着默认后端走。Server 上就用 netplan systemd-networkd别没事装个 NetworkManager桌面版要连 Wi-Fi就用 nmcli。真要在一个系统里混用也要用 netplan 的renderer字段明确指定某张网卡归谁管而不是让两个服务自己去抢。2. 从零写一份能跑通的Netplan配置静态IP、网关、DNS一个不缺2.1 netplan的YAML缩进规则与最常见的语法陷阱netplan 用的是 YAML 格式而 YAML 对缩进极其敏感——只能用空格不能用 Tab。我见过太多人复制配置后报错Invalid YAML打开一看是编辑器自动把空格转成了 Tab。写 netplan 配置前先确认编辑器把 Tab 转空格打开这一步能省掉一半的报错。第二个陷阱是冒号后面必须有空格。dhcp4:false是错的dhcp4: false才是对的。第三个陷阱是列表项的-后面也要有空格。这些小细节在 YAML 里没有任何容错空间错一个字符整份配置就废了。改完配置我强烈建议先跑一遍语法校验sudo netplan generate这条命令只做解析和生成不会立刻改网络能提前把语法错误暴露出来。等确认没报错再往下走。2.2 一份静态IP配置的完整示例和参数计算过程假设我的网卡叫enp3s0要配的地址是192.168.1.50掩码 24 位网关是路由器192.168.1.1DNS 想用公共的。配置长这样network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: false addresses: - 192.168.1.50/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [223.5.5.5, 119.29.29.29]这里几个参数我逐个解释一下为什么。/24是从子网掩码255.255.255.0换算来的。掩码里有多少个连续的 1就是多少位。255.255.255.0转二进制是 24 个 1 加 8 个 0所以写作/24。这个数字决定了你的机器认为同一局域网内的地址范围写错了就会出现 ping 不通同网段设备的情况。routes里的to: default表示默认路由也就是所有不知道往哪发的流量都交给这个网关。via后面跟网关地址。老教程里用的是gateway4: 192.168.1.1这个字段在新版 netplan 里已经被标记为废弃跑起来会提示 gateway4has been deprecated虽然还能用但迟早会被移除。新写法就是上面这个routes列表多网关、多路由表的时候它也更灵活。nameservers决定域名解析交给谁。写两个是冗余一个挂了还有另一个。DNS 地址一定得和你的网络环境匹配——如果你在内网里最好把内网 DNS 也加上否则解析内网域名会失败。2.3 netplan try和netplan apply的正确使用姿势配置写完用哪条命令生效这决定了你是优雅切换还是断网自救。sudo netplan trynetplan try会临时应用配置然后等你确认。如果新配置导致你 SSH 断了120 秒内没有确认它会自动回滚到旧配置。这是远程操作时的保命命令强烈建议经常用。sudo netplan applynetplan apply是直接生效、不回滚。本地操作、有物理访问权限的时候用它可以但如果你正通过 SSH 连着一台远程服务器改的是当前连接用的那张网卡apply一敲下去很可能把自己关在门外。我自己的习惯是远程改网络永远先try。提示如果netplan apply之后网络没起来别急着重启先看journalctl -u systemd-networkd -n 50的报错八成的配置问题都能从那几行日志里读出来。2.4 双网卡、多IP和路由优先级的处理一台机器两张网卡很常见比如一张连内网、一张连外网。这时候最容易出的问题是默认路由打架——两张网卡都想当默认出口系统随机选一个结果内外网时通时断。解决办法是给不同路由设置不同的 metric优先级数字越小越优先。示例network: version: 2 ethernets: enp3s0: dhcp4: false addresses: [192.168.1.50/24] routes: - to: default via: 192.168.1.1 metric: 100 enp4s0: dhcp4: false addresses: [10.0.0.50/24] routes: - to: 10.0.0.0/8 via: 10.0.0.1 metric: 200这里外网网卡的默认路由 metric 设小内网网卡只声明自己负责10.0.0.0/8这个网段各管各的互不打架。同一张网卡要配多个 IP直接在addresses列表里加就行比如同时挂192.168.1.50/24和192.168.1.51/24。3. Wi-Fi配网与有线共存nmcli在桌面和Server上的实操3.1 扫描、连接、保存密码的完整流程桌面版连 Wi-Fi 最简单的是点图形界面但 Server 版没图形界面nmcli就是主力工具。先确认 NetworkManager 在跑然后三步走扫描、连接、验证。nmcli device wifi list nmcli device wifi connect MyWiFi password your_password nmcli connection show --active第一条列出可见的 Wi-Fi第二条连接并保存密码下次会自动连第三条确认哪个连接是激活状态。我一般还会用nmcli device status看每张网卡是不是被 NetworkManager 接管了。如果某个无线网卡显示unmanaged说明它被别的服务接管了或者被 netplan 显式排除了这时候nmcli是连不上的得先解决接管权的问题。3.2 隐藏SSID和5GHz频段的坑连隐藏网络不广播 SSID时nmcli device wifi list里根本看不到你的网络得手动指定nmcli device wifi connect HiddenSSID password xxx hidden yes加hidden yes才会主动去探测。这一步漏了就会一直连不上很多人以为是密码错了。5GHz 频段的坑在于有些老网卡只支持 2.4GHz你在路由器上把 5GHz 单独设了个名字结果这块网卡扫不到就以为 Wi-Fi 坏了。遇到同一台路由器别人能连我连不上先确认自己网卡支持的频段。iwlist scan 2/dev/null | grep -i frequency\|channel看扫描结果里有没有 5GHz 的频段信息就知道网卡支不支持了。3.3 有线无线同时在线时的默认路由选择笔记本同时插网线和连 Wi-Fi 时系统会把默认路由交给其中一条通常是有线优先因为它的路由 metric 更小。但有时候你希望走 Wi-Fi就得手动调。nmcli connection show nmcli connection modify Wired connection 1 ipv4.route-metric 500 nmcli connection modify MyWiFi ipv4.route-metric 100 nmcli connection up MyWiFi把 Wi-Fi 的 metric 调小它就会抢到默认路由。这个技巧在调试特定网段走特定链路时特别有用。改完记得connection up让配置重新生效。4. 配网之后最常见的三类连不上SSH、网关、DNS的排查链路4.1 SSH无法连接从链路层到端口的逐层排查SSH 连不上是最多人问的问题但它其实是一类症状的总称原因可能出在链路、路由、防火墙、服务任何一个环节。我排查的固定顺序是自下而上一层层排除。第一步确认物理链路和地址有没有起来ip -br a ip route如果网卡没有 IP后面全是白搭。第二步确认网关通不通ping -c 3 192.168.1.1网关都 ping 不通说明是配网本身的问题回去查 netplan。第三步确认 SSH 服务在不在、端口通不通ss -tlnp | grep 22 sudo systemctl status ssh如果ss里看不到 22 端口说明 sshd 没起来或者改了端口。第四步查防火墙sudo ufw statusufw如果开着且没放行 22那连接会被直接拒绝。很多人装完系统第一件事就开防火墙然后忘了放行 SSH把自己锁外面。我整理了一张对照表方便快速定位现象最可能的原因验证命令ping 网卡自己都失败网卡没起来或配置语法错ip -br a能 ping 本机 ping 不通网关网关地址或掩码写错ip route网关通但 SSH 超时防火墙拦截或服务未启动ss -tlnp、ufw statusSSH 连接被拒绝sshd 未运行或端口不对systemctl status ssh能连上但立刻断端口冲突或认证配置问题journalctl -u ssh4.2 能ping通IP但域名解析失败能 ping 通 8.8.8.8 却打不开网页是经典症状几乎百分百是 DNS 问题。先看当前用的是哪个 DNSresolvectl status cat /etc/resolv.confUbuntu 用systemd-resolved做本地解析缓存/etc/resolv.conf常常是个指向127.0.0.53的软链接真正的上游 DNS 在resolvectl status里看。如果你在 netplan 里配了 DNS 却感觉没生效八成是没跑netplan apply或者被 NetworkManager 的另一份配置覆盖了。临时验证是不是 DNS 的锅直接指定 DNS 查一次nslookup example.com 223.5.5.5能查出来就说明是本地 DNS 配置的问题。想临时改可以写/etc/resolv.conf但注意它可能被systemd-resolved覆盖真正的持久化改法还是回到 netplan 或 nmcli 里改。4.3 改配置后网络彻底断掉怎么救回来远程改配网最怕的就是一改就断断了自己又连不回去。这时候分两种情况。如果我们用的是netplan try那直接等着它超时回滚就行这也是我一直强调远程用try的原因。如果已经apply且断网了那就得靠物理或带外的访问方式本地终端、虚拟机控制台、或者云服务商提供的 VNC 控制台。进去之后第一步不是急着改配置而是先看旧配置能不能恢复。netplan apply 之前的文件如果没有备份很多云镜像里还有 cloud-init 留下的原始文件可以对照。实在找不到就把当前出问题的接口先临时拉起来恢复基本连通sudo ip addr add 192.168.1.50/24 dev enp3s0 sudo ip link set enp3s0 up sudo ip route add default via 192.168.1.1这几条是临时生效的重启就没了但能让你先 SSH 回去再从容修配置文件。这是我处理改配网改到失联最常用的一招。5. 虚拟机和开发板场景下的配网差异5.1 VMware和VirtualBox的NAT、桥接、仅主机模式怎么选在虚拟机里装 Ubuntu配网第一步其实是选网络模式选错模式后面怎么配都别扭。NAT 模式虚拟机和宿主机共用宿主机的 IP 上网虚拟机在独立网段外部设备访问不到它适合只想上网、不需要被访问的场景。桥接模式虚拟机和宿主机处于同一局域网有独立 IP局域网内其他机器能直接访问适合跑需要被 SSH 访问的服务。仅主机模式只有宿主机和虚拟机互通上不了外网适合做隔离实验。选桥接时最常见的坑是宿主机用 Wi-Fi桥接有时候绑不到正确的物理网卡导致虚拟机拿不到 IP。这时候在虚拟机设置里把桥接目标从自动改成明确的物理网卡问题大多能解决。另外桥接模式下 IP 是路由器分配的如果你在虚拟机里又手配了个静态 IP很容易和局域网里别的设备冲突。5.2 开发板USB网卡挂载后的地址分配用开发板折腾的时候经常通过 USB 连接宿主机上多出一个网络接口。这类设备有的是 USB 转串口负责调试输出有的是 USB 网卡负责网络。判断方法很简单lsusb ip -br a dmesg | tail -20插上开发板后看dmesg最新几行认到网卡会打印出接口名比如usb0或enx...这样的名字。如果 networkd 没自动给它分配地址多半是因为这个接口不在 netplan 配置里systemd-networkd 默认不管它。解决办法是显式在 netplan 里给这个接口配 DHCP或者指定静态地址network: version: 2 ethernets: usb0: dhcp4: true有些开发板的 USB 网卡固定用192.168.7.1这类保留地址宿主机侧要配成同一网段才能通信。这种情况查开发板手册确认网段然后在宿主机上给对应接口配静态地址最稳妥。串口驱动比如 CH340 这类属于设备识别层面和 IP 配置是两码事——串口通了不代表网卡也认到了这俩要分开排查。6. 让配网配置可复现备份、版本化和批量部署的实用做法配网折腾通了之后我强烈建议做一件事把配置文件纳入版本管理。听起来有点重但真遇到问题能救命。最省事的做法是每次改动前先备份sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak然后在本地或私有仓库里存一份。因为 netplan 配置就是纯文本天然适合用 git 管理改了什么、什么时候改的一目了然。批量部署多台服务器时可以把一份模板里的接口名和地址抽出来做成变量用 Ansible 这类工具下发这样几十台的配置能保持一致不会出现这台改过那台忘了的情况。另一个容易被忽视的点是接口名。现代 Ubuntu 用的是可预测网卡名比如enp3s0、eno1它们和主板上的物理槽位绑定一般很稳定。但如果你换过硬件、加过扩展卡接口名可能变原来的配置就指不到设备了。所以配置里用接口名前先用ip -br a和lspci | grep -i ethernet确认一下当前实际的名字别直接照抄别人的配置。我个人还习惯在配好一台上线前跑一次完整的自检地址对不对、网关通不通、DNS 能解析、SSH 能进。这几项过了这台机器的网络才算真正配好而不是看起来能上网。折腾得多了会发现配网真正的难点从来不是把地址填进去而是知道每一步为什么这么填、出问题时从哪一层开始查。把这两件事想明白Ubuntu 配网这件事就再也不会变成玄学。