从 Ubuntu 17.10 以后,Ubuntu 开始使用 Netplan 作为默认的网络配置方式。到了 Ubuntu Server 18.04、20.04 这些版本,服务器网络配置通常会写在 /etc/netplan/ 目录下的 YAML 文件中,再由 Netplan 交给 systemd-networkdNetworkManager 这类后端服务实际管理网络。

Netplan 的优点是配置格式统一,也更适合云服务器、自动化部署和新版本 Ubuntu 的默认网络管理方式。不过对于一些习惯老式 Linux 网络配置的人来说,/etc/network/interfaces 仍然更直观。尤其是老服务器迁移、传统脚本兼容、特定网络环境、桥接配置、内网实验机或一些旧项目部署时,继续使用 ifupdown 反而更顺手。

这篇文章记录的是在 Ubuntu Server 18.04 / 20.04 中禁用 Netplan,改回使用 ifupdown 管理网络,并将 DNS 管理切换到 resolvconf 的方法。

一、操作前提醒 #

这类操作会直接影响服务器网络连接,尤其是远程服务器、VPS、云主机,一旦配置错误,可能会导致 SSH 断开后无法重新连接。

如果是在本地物理机、虚拟机控制台、VNC 或 KVM 环境下操作,风险相对可控。如果是在远程服务器上操作,建议提前准备好以下内容:

  • 确认自己有控制台或救援模式入口
  • 记录当前 IP、网关、DNS、网卡名称
  • 备份现有 Netplan 配置
  • 先确认网络配置文件没有语法错误
  • 不要在业务高峰期操作

先查看当前网卡名称:

Bash
ip link

或者:

Bash
ip addr

常见网卡名称可能是:

TEXT
eth0
ens33
ens160
enp0s3

不同系统、虚拟化平台、云平台的网卡名称可能不同。下面示例中使用的是 eth0,实际操作时要替换成自己机器上的网卡名称。

二、备份当前 Netplan 配置 #

在修改网络管理方式之前,先备份原来的 Netplan 配置:

Bash
sudo cp -a /etc/netplan /etc/netplan.bak.$(date +%F-%H%M%S)

也可以查看当前配置内容:

Bash
ls -l /etc/netplan/
cat /etc/netplan/*.yaml

如果后续切换失败,可以通过这些备份恢复原来的网络配置。

三、安装 ifupdown 和 resolvconf #

先安装传统网络配置所需的软件包:

Bash
sudo apt update
sudo apt install ifupdown resolvconf

其中:

  • ifupdown 用来管理 /etc/network/interfaces 中定义的网络接口
  • resolvconf 用来根据接口配置生成 DNS 解析配置
  • dns-nameservers 这类配置通常需要配合 resolvconf 才能写入解析文件

安装完成后,可以检查命令是否存在:

Bash
which ifup
which ifdown
which resolvconf

四、配置 /etc/network/interfaces #

编辑传统网络配置文件:

Bash
sudo vi /etc/network/interfaces

也可以使用 nano:

Bash
sudo nano /etc/network/interfaces

静态 IP 配置示例 #

如果服务器使用固定 IP,可以参考下面的配置:

INI
# This file describes the network interfaces available on your system
# and how to activate them.

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.1.2
    netmask 255.255.255.0
    gateway 192.168.1.1
    dns-nameservers 8.8.8.8 8.8.4.4

需要根据自己的实际网络环境修改:

TEXT
eth0
192.168.1.2
255.255.255.0
192.168.1.1
8.8.8.8 8.8.4.4

如果是在内网服务器中,DNS 可以写路由器地址或内网 DNS,例如:

INI
dns-nameservers 192.168.1.1

如果公司或机房有自己的 DNS,应该优先使用内部 DNS。

DHCP 配置示例 #

如果服务器通过 DHCP 自动获取 IP,可以使用下面的配置:

INI
# This file describes the network interfaces available on your system
# and how to activate them.

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

DHCP 方式适合普通虚拟机、测试机、家庭服务器或由路由器自动分配地址的环境。

不过,如果是长期运行的服务器,通常更建议使用固定 IP,避免 IP 地址变化后影响 SSH、服务访问或防火墙规则。

五、先测试 ifupdown 配置 #

配置完成后,可以先尝试重新启用接口。

如果是本地环境,可以执行:

Bash
sudo ifdown --force eth0
sudo ifup eth0

或者:

Bash
sudo ifdown --force eth0 lo && sudo ifup -a

如果是远程 SSH 环境,不建议直接执行这类命令,因为网络接口重启期间可能会断开连接。更稳妥的做法是准备控制台入口后再执行。

执行后检查 IP 是否正常:

Bash
ip addr show eth0

检查路由:

Bash
ip route

测试网关:

Bash
ping -c 4 192.168.1.1

测试公网 IP:

Bash
ping -c 4 8.8.8.8

测试 DNS:

Bash
ping -c 4 google.com

如果 IP 能 ping 通,但域名不能解析,通常说明 DNS 配置还没有生效,需要检查 resolvconf/etc/resolv.conf

六、启用 networking 服务 #

确认 /etc/network/interfaces 配置正确后,启用传统 networking 服务:

Bash
sudo systemctl enable networking
sudo systemctl restart networking

查看服务状态:

Bash
systemctl status networking

如果状态为 active,说明 networking 服务已经正常运行。

七、停止并禁用 Netplan 相关后端服务 #

Netplan 本身是配置工具,实际管理网络的通常是 systemd-networkdNetworkManager。Ubuntu Server 默认更多见的是 systemd-networkd;桌面版通常会使用 NetworkManager

如果已经决定完全改用 ifupdown,可以停止并禁用下面这些服务:

Bash
sudo systemctl stop systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved
sudo systemctl disable systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved

其中:

  • systemd-networkd 是常见的 Netplan 后端之一
  • networkd-dispatcher 会监听 networkd 状态变化并执行相关事件脚本
  • systemd-networkd-wait-online 用来等待 networkd 管理的网络接口上线
  • systemd-resolved 是 systemd 的 DNS 解析服务

如果希望彻底防止这些服务再次被启动,可以继续 mask:

Bash
sudo systemctl mask systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved

需要注意,maskdisable 更强。被 mask 的服务即使手动 start 也无法启动,除非先执行 unmask

八、卸载 Netplan 软件包 #

如果确认不再使用 Netplan,可以卸载相关软件包:

Bash
sudo apt purge nplan netplan.io

有些系统中可能没有 nplan 这个包,只存在 netplan.io。如果提示找不到某个包,可以忽略不存在的那个。

卸载后可以清理不再需要的依赖:

Bash
sudo apt autoremove

也可以检查 Netplan 命令是否还存在:

Bash
which netplan

如果没有输出,说明 Netplan 命令已经不存在。

九、处理 DNS 解析文件 #

切换到 ifupdown + resolvconf 后,需要确认 /etc/resolv.conf 指向的是 resolvconf 生成的文件。

先查看当前链接:

Bash
ls -l /etc/resolv.conf

如果它不是指向:

TEXT
/run/resolvconf/resolv.conf

可以重新创建软链接:

Bash
sudo ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf

然后查看 DNS 配置:

Bash
cat /etc/resolv.conf

如果配置正常,里面应该能看到 nameserver 记录,例如:

TEXT
nameserver 8.8.8.8
nameserver 8.8.4.4

如果没有看到对应 DNS,可以重启 resolvconf:

Bash
sudo systemctl restart resolvconf

然后重新启用网卡:

Bash
sudo ifdown --force eth0
sudo ifup eth0

再检查:

Bash
cat /etc/resolv.conf

十、重启系统并验证 #

完成配置后,建议重启系统,确认开机后网络仍然正常:

Bash
sudo reboot

重启后依次检查:

Bash
ip addr
ip route
cat /etc/resolv.conf
systemctl status networking

测试网络:

Bash
ping -c 4 8.8.8.8
ping -c 4 google.com

如果公网 IP 和域名都能正常访问,说明网络和 DNS 都已经切换成功。

十一、安装阶段禁用 Netplan #

如果是全新安装 Ubuntu Server,也可以在安装阶段选择不用 Netplan。

在安装介质启动菜单中,可以通过启动参数加入:

TEXT
netcfg/do_not_use_netplan=true

这个方法适合全新安装时使用。对于已经安装好的系统,一般还是按照前面的方法手动切换。

如果是 VPS 或云主机,有些 VNC 控制台可能会拦截按键,导致安装阶段不方便修改启动参数。这种情况下,安装完成后再切换会更实际。

十二、常用排查命令 #

查看网卡状态:

Bash
ip addr

查看路由:

Bash
ip route

查看接口配置文件:

Bash
cat /etc/network/interfaces

查看 networking 服务状态:

Bash
systemctl status networking

查看 DNS 文件指向:

Bash
ls -l /etc/resolv.conf

查看 DNS 内容:

Bash
cat /etc/resolv.conf

查看被 mask 的服务:

Bash
systemctl list-unit-files --type=masked --all

查看某个服务的反向依赖:

Bash
systemctl list-dependencies systemd-networkd --reverse

查看 Netplan 是否仍然存在:

Bash
which netplan
dpkg -l | grep netplan

十三、如何恢复回 Netplan #

如果后续想切回 Netplan,需要恢复之前禁用的服务,并重新安装 Netplan。

先解除 mask:

Bash
sudo systemctl unmask systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved

重新安装 Netplan:

Bash
sudo apt update
sudo apt install netplan.io

恢复或重新创建 /etc/netplan/ 下的 YAML 配置文件。

例如 DHCP 配置可以写成:

YAML
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true

然后应用:

Bash
sudo netplan generate
sudo netplan apply

如果使用 systemd-networkd,还需要启用相关服务:

Bash
sudo systemctl enable systemd-networkd systemd-resolved
sudo systemctl restart systemd-networkd systemd-resolved

如果之前修改过 /etc/resolv.conf,还需要根据 systemd-resolved 的方式恢复链接。常见方式之一是:

Bash
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf

恢复完成后,测试网络和 DNS:

Bash
ping -c 4 8.8.8.8
ping -c 4 google.com

十四、完整操作命令整理 #

如果是在本地控制台操作,并且网卡名是 eth0,完整流程可以整理为:

Bash
sudo cp -a /etc/netplan /etc/netplan.bak.$(date +%F-%H%M%S)

sudo apt update
sudo apt install ifupdown resolvconf

sudo vi /etc/network/interfaces

sudo systemctl enable networking
sudo systemctl restart networking

sudo systemctl stop systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved
sudo systemctl disable systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved
sudo systemctl mask systemd-networkd networkd-dispatcher systemd-networkd-wait-online systemd-resolved

sudo apt purge nplan netplan.io
sudo apt autoremove

sudo ln -sf /run/resolvconf/resolv.conf /etc/resolv.conf

sudo reboot

注意:这只是流程整理,真正执行前一定要先把 /etc/network/interfaces 配置好,并确认网卡名称、IP、网关、DNS 都正确。

总结 #

Ubuntu 18.04 / 20.04 默认使用 Netplan 管理网络,但如果更习惯传统方式,或者需要兼容旧项目、旧脚本、特殊网络环境,也可以切换回 ifupdown

核心思路是:

  1. 安装 ifupdownresolvconf
  2. 配置 /etc/network/interfaces
  3. 启用 networking 服务
  4. 停止并禁用 systemd-networkd 等相关服务
  5. 卸载 netplan.io
  6. 修正 /etc/resolv.conf 指向 resolvconf
  7. 重启后验证 IP、路由和 DNS

这个方法在自建服务器、实验环境、物理机和普通虚拟机中比较适合。但如果是云服务器、自动化部署环境,或者依赖云平台初始化网络配置的系统,建议谨慎操作,避免因为网络配置切换导致远程无法连接。