Ubuntu服务器配置netplan网络参数写错了,外网直接断掉,SSH连不上、业务全停——这种情况在运维中太常见了。核心抢救思路就一句话:你必须通过带外管理(IPMI/iLO/KVM/物理直连)或者单用户模式进入系统,修改/etc/netplan/下的YAML配置文件,然后执行netplan apply恢复网络。如果你连本地都进不去,那就只能通过厂商的带外控制台或者挂载系统盘到其他机器上改文件。下面我把每一步操作、每一个坑、每一种场景全部讲透。

一、netplan到底是什么,为什么一改就断网

从Ubuntu 17.10开始,系统默认用netplan来管理网络配置,替代了之前的/etc/network/interfaces。netplan的配置文件放在/etc/netplan/目录下,文件名通常是00-installer-config.yaml或者01-netcfg.yaml这种格式。它本质上是一个YAML文件,描述网卡、IP地址、网关、DNS等参数,然后由后端renderer(networkd或NetworkManager)去实际执行。

问题出在哪?YAML对缩进极其敏感,多一个空格少一个空格都可能导致解析失败或者配置错误。常见的错误包括:网关写错导致路由丢失、子网掩码配错导致同网段不通、DNS服务器地址填错导致域名解析失败、网卡名称写错导致配置根本没生效到正确的网卡上。这些错误一旦apply,轻则部分功能异常,重则直接外网断连。

二、断网后第一步:确认你怎么进去

外网断了,SSH肯定连不上。你现在要做的不是慌,而是确认你有哪种方式能接触到这台机器:

第一种,云服务器。如果是阿里云、腾讯云、华为云等,直接用控制台的VNC远程连接功能,这个走的是带外通道,不依赖机器自身网络。第二种,物理服务器或自建机房。用IPMI、iLO、iDRAC等带外管理口,通过Web界面打开远程KVM控制台。第三种,你就在机器旁边。直接接显示器和键盘,或者用串口线连接。第四种,也是最极端的情况——你什么都没有,那就只能把系统盘拆下来挂到另一台Linux机器上修改文件。

记住一个原则:只要你能进系统的shell,不管什么方式,问题就解决了一大半。

三、进入系统后的排查流程

进了系统之后,先不要急着改配置,先看现状。执行以下命令:

ip addr show
ip route show
cat /etc/resolv.conf
ping -c 3 8.8.8.8
ping -c 3 www.baidu.com

这四步分别看:网卡有没有拿到IP、路由表有没有默认网关、DNS有没有配置、外网IP和域名能不能通。如果ip addr显示网卡没有IP,或者ip route显示没有default via,那基本就是netplan配置的问题。如果有IP但ping不通外网,可能是网关或DNS的问题。

接下来看netplan的当前生效状态:

netplan status
sudo netplan try

netplan status会显示当前每个网卡的详细配置来源。netplan try是个好东西,它会尝试应用配置,如果你120秒内不确认,它会自动回滚。但在断网抢救场景下,你可能不敢用try,因为万一改得更糟就更麻烦了。所以建议直接看配置文件内容。

四、找到并修改错误的netplan配置文件

执行以下命令找到配置文件:

ls /etc/netplan/
sudo cat /etc/netplan/*.yaml

打开文件后,仔细检查每一项。一个典型的正确配置长这样:

network:
  version: 2
  renderer: networkd
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 114.114.114.114

常见错误对照:

错误1:网卡名称写错。用ip addr show确认你的网卡到底叫ens33、ens160、eth0还是enp3s0。Ubuntu不同版本、不同虚拟化环境网卡命名不一样,写错了配置就不会生效到正确的网卡上。

错误2:缩进用了Tab。YAML严禁使用Tab缩进,必须用空格,一般是2个或4个空格。用cat -A可以看到Tab会显示为^I。

错误3:网关地址写错或者漏写。routes段落里的via地址如果填错了,或者干脆没写,默认路由就没了,外网自然不通。

错误4:子网掩码不对。比如你写成/32,那就只有一个IP能通,网关都不在同网段。如果你写成/16但实际网络是/24,也会出问题。

错误5:renderer选错。如果你的系统用的是NetworkManager(桌面版Ubuntu默认),但你写了networkd,或者反过来,配置可能不生效。

找到错误后,直接用vim或nano修改:

sudo vim /etc/netplan/00-installer-config.yaml

改完之后,先检查YAML语法是否正确:

sudo netplan try

如果try没有报错,说明语法没问题。在120秒内按回车确认应用。如果你不放心,可以先用:

sudo netplan --debug apply

这个命令会输出详细的应用过程,方便你看到底哪里出了问题。如果apply之后网络恢复了,恭喜你,抢救成功。如果还是不行,继续往下排查。

五、apply之后还是不通怎么办

有几种可能。第一,配置文件语法没错但逻辑有问题,比如你改了IP但没改网关,或者网关和IP不在同一个网段。第二,可能有多个netplan配置文件,后面的文件覆盖了前面的。netplan按文件名字母顺序加载,后面的优先级高。你可以检查是否有多个yaml文件:

ls -la /etc/netplan/

如果有多个,确认它们之间没有冲突。第三,可能是networkd服务本身挂了。重启一下:

sudo systemctl restart systemd-networkd
sudo systemctl status systemd-networkd

第四,如果你用的是NetworkManager作为renderer,那要重启NetworkManager:

sudo systemctl restart NetworkManager

第五,检查iptables或ufw有没有把流量拦掉。有时候不是netplan的问题,而是防火墙规则在你改配置的过程中被触发了:

sudo iptables -L -n
sudo ufw status
六、没有任何远程手段时的终极方案

如果你真的什么带外手段都没有,机器在远端机房,你只有一个选择:找机房的人帮你操作,或者把硬盘拆下来。把系统盘挂到另一台Linux机器上,mount之后直接编辑/etc/netplan/下的文件。操作步骤:

sudo fdisk -l  # 找到系统盘分区
sudo mount /dev/sda2 /mnt  # 假设sda2是根分区
sudo vim /mnt/etc/netplan/00-installer-config.yaml
sudo umount /mnt

改完把盘装回去,重启机器。这个方法虽然笨,但在极端情况下是唯一的救命稻草。

七、预防措施:怎么避免下次再犯

第一,改netplan之前一定要备份。cp一份到/root/目录下,或者用git管理/etc/netplan/。第二,永远先用netplan try测试,不要直接apply。第三,在配置文件里加注释,标明每个参数的含义,特别是网关和DNS。第四,如果是远程服务器,确保你有带外管理手段,这是运维的基本保障。第五,考虑用Ansible或脚本批量管理网络配置,减少手动编辑出错的概率。第六,定期用netplan status和ip命令做健康检查,发现异常早处理。

八、总结:抢救的核心逻辑

netplan配置错误导致外网断连,本质上就是YAML文件写错了参数或者语法。抢救的核心路径是:带外进入系统 → 查看当前网络状态 → 定位netplan配置文件 → 修正错误参数 → netplan apply验证 → 确认外网恢复。整个过程不需要重装系统,不需要复杂工具,只要你能进shell,十分钟内基本能搞定。关键是你得有进系统的手段,这比什么技术都重要。平时把带外管理配好、配置文件备份好、改之前先try,这三件事做到位,断网抢救就是个小case。