装好一台 Ubuntu 20.04 Server,满心以为能直接开工,结果一开机发现连不上网——这大概是每个运维和开发者都经历过的默契瞬间。更让人头疼的是,搜索“Ubuntu 20.04 配置网络”,出来的教程南辕北辙:有人让你改 /etc/network/interfaces,有人喊你装 net-tools,还有人直接贴一段 ifconfig eth0 up。这些方法放在今天,基本都在带新人走弯路。
Ubuntu 20.04 的网络配置,核心已经全部迁到了 Netplan 这套工具上。它把传统分散的网络配置收敛成统一的 YAML 文件,真正干活的底层是 systemd-networkd 或者 NetworkManager。这篇东西,我把装机后最常遇到的网络配置场景、Netplan 文件该怎么写、为什么这么写、踩过的坑,一次性讲清楚。适合刚接触 Ubuntu 20.04 的新手,也适合从 CentOS 转过来找配置路径的老手。
1. 别急着改配置:先看懂 Ubuntu 20.04 的网络管理脉络
1.1 为什么 Ubuntu 20.04 不再用 /etc/network/interfaces
很多人习惯性地打开 /etc/network/interfaces,发现文件还在,但改了之后重启网络服务根本不生效,然后开始怀疑人生。这不是你操作有误,是这个文件在 Ubuntu 20.04 里已经名存实亡了。
Ubuntu 从 18.04 开始大力推广 Netplan,到 20.04 已经成了默认配置方式。Netplan 的设计思路是:不直接管理网络,而是做一层“翻译器”,把你写好的 YAML 配置,转换成后端程序能识别的配置。后端有两种:
systemd-networkd:轻量、无桌面依赖,适合服务器和容器场景NetworkManager:带图形界面管理,适合桌面版 Ubuntu
你可以通过 netplan get 查看当前生效的后端类型。这个设计看起来多了一道工序,实际好处很明显:只要学一套 YAML 语法,不管后端是哪个都不会影响你改配置。传统的那套 /etc/network/interfaces 写法,在 20.04 里早就边缘化了。
1.2 网卡命名规则的变化:为什么找不到 eth0
对网络对配置迷茫,还有一个直接原因:找不到 eth0。CentOS 7 里熟悉的 eth0、eth1,在 Ubuntu 20.04 里默认变成了 ens33、ens160、enp0s3 这种看着很别扭的名字。
这套命名规则叫 Fixed Name(可预测命名),原理是根据网卡在主板上的物理位置、PCI 总线号来取名。
en:以太网p0:PCI 总线号 0s3:PCI 插槽号 3
好处是名字固定,不会因为插拔设备导致 eth0、eth1 顺序漂移。坏处就是一眼看不明白哪个是哪个。
查看实际网卡名和 MAC 地址,用:
bash复制ip link show
会列出所有网卡状态、MAC、名字。记住你要配置的那个网卡名,后面 Netplan 文件里要用它。
1.3 配置文件的路径与生效流程
Ubuntu 20.04 的 Netplan 配置文件统一放在 /etc/netplan/ 目录下,最常见的两个文件名:
01-network-manager-all.yaml:桌面版默认,后端是 NetworkManager99-config.yaml或00-installer-config.yaml:服务器版安装器生成
改配置文件之后,需要执行:
bash复制sudo netplan apply
这条命令会把 YAML 翻译成后端配置并立即应用,比 systemctl restart network-manager 之类的方式更正规。整个生效流程可以用一句话概括:改 YAML → netplan apply → 后端接管。理解了这个链路,你就知道为什么改完 interfaces 文件没用,而 netplan apply 就是那个让改动真正落地的动作。
提示:如果你不确定当前用的是哪个后端,执行
ps -ef | grep -E "NetworkManager|systemd-networkd"看进程即可。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Netplan 配置文件逐行解读:语法与字段背后的逻辑
2.1 一个标准 YAML 配置长什么样
直接上最常见的配置模板,以静态 IP 为例:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 223.5.5.5
- 114.114.114.114
如果你只是想先跑通 DHCP,配置更简单:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: true
这两份配置文件,字面上看着不难,但实际写起来全是细节。
2.2 YAML 语法严格到列:一个空格都不能错
Netplan 对 YAML 格式的严格程度,几乎到了变态级别。我见过不少同事在生产环境敲 netplan apply 后直接断连,原因就是一缩进、一个冒号写错。
几个高频坑,逐个列出来:
缩进必须一致:Netplan 官方推荐用两个空格缩进,不要用 Tab。YAML 里 Tab 和空格混用必炸,报错信息还特别隐晦。
冒号后面必须有空格:
yaml复制ethernets:
ens33: # 冒号后必须有空格
dhcp4: true # 这个 true 前面也要有空格
短横线 - 后面有空格:数组元素前面那个 - 后必须跟一个空格,再写值。
顶层字段固定:network、version、renderer 这些字段名不能自定义,拼错了直接报 unknown key。
2.3 addresses、routes、nameservers 字段详解
这三个字段是最核心的网络参数,逐个拆开说清楚。
addresses: 这是 IP 地址列表,注意格式必须是 CIDR 写法,也就是要带掩码长度。
192.168.1.100/24表示 192.168.1.100,掩码 255.255.255.0- 如果只写
192.168.1.100不写/24,netplan apply 直接报错
routes: 定义路由表。最常见的用途是设置默认网关,写法:
yaml复制routes:
- to: default
via: 192.168.1.1
to: default 表示目的地址为 0.0.0.0/0,via 是下一跳地址,也就是网关。Ubuntu 20.04 早期版本支持 gateway4 这个字段,后来被 netplan 明确废弃。还在用 Ubuntu 20.04 的建议直接用 routes 里 to: default 的写法,兼容性和可读性都好。
nameservers: DNS 配置。addresses 列表里可以写多个 DNS:
yaml复制nameservers:
addresses:
- 223.5.5.5
- 114.114.114.114
国内网络环境我习惯先用 223.5.5.5 和 114.114.114.114 这种公共 DNS 兜底,生产环境再根据内网 DNS 情况替换。
2.4 dhcp4 与手动地址的取舍逻辑
有的场景你会看到 dhcp4: true 和 addresses 同时出现。这两个其实可以共存,语义是:先尝试 DHCP 拿动态地址,同时绑定一个静态地址作为兜底。实际生产环境一般不这么配,逻辑会混乱。要么纯 DHCP,要么纯静态。
一个小提醒:如果从 DHCP 切到静态配置,dhcp4: true 要改成 false。如果你只删掉 dhcp4 字段不写 false,Netplan 默认值其实是 true,会导致你配了静态 IP 的同时还在跑 DHCP,两个地址共存,路由表混乱,现象就是时通时不通。这是很隐蔽的坑,我踩过一次之后,写配置必写显式 dhcp4: false。
3. 七种常见场景的配置实操
3.1 场景一:虚拟机/云主机纯 DHCP 动态获取
VMware、VirtualBox、云厂商控制台创建的 Ubuntu 20.04 实例,默认大多是通过 DHCP 获取 IP。如果你只想正常上网,不追求固定 IP,那么配置文件里只要这一行就够:
yaml复制network:
version: 2
ethernets:
ens33:
dhcp4: true
配置完执行:
bash复制sudo netplan apply
ip addr show ens33
看 inet 后面是否出现了 192.168.x.x 之类的地址。如果没有,先检查网卡的连接状态,以及虚拟机的网络模式是不是 NAT/桥接。
3.2 场景二:服务器手动配置固定 IP
服务器要稳定对外提供服务,IP 必须固定。完整步骤如下:
- 查看网卡名:
bash复制ip link
假设网卡名是 ens33。
- 备份原配置:
bash复制sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
-
编辑配置文件,内容参考上面贴过的静态配置模板。
-
先执行:
bash复制sudo netplan try
这条命令会先测试配置效果,如果 120 秒内你没有确认,它会自动回滚到原配置。在改远程服务器 IP 时,这个命令简直是保命符。
- 确认无误后执行:
bash复制sudo netplan apply
3.3 场景三:DNS 解析配置与 /etc/resolv.conf 的坑
Ubuntu 20.04 默认装了 systemd-resolved。它的特点就是 /etc/resolv.conf 会被软链接到 systemd-resolved 管理的文件,你手动改 /etc/resolv.conf 的内容,重启后大概率被覆盖。
正确的修改姿势是:在 Netplan 配置文件的 nameservers 里加 DNS。改完 netplan apply 后,用 resolvectl status 查看当前生效的 DNS。
如果遇到公司内网 DNS 解析不了外网域名,可以在 nameservers.addresses 里同时加内网 DNS 和公共 DNS。顺序有讲究,Netplan 会按数组顺序尝试解析,内网 DNS 放前面可以优先解析内网域名。
3.4 场景四:无线网络 WiFi 的 Netplan 配置
笔记本装 Ubuntu 20.04 桌面版,无线网络一般由 NetworkManager 图形界面接管,这是最简单的方式。如果一定要在 Netplan 里配置 WiFi,语法是:
yaml复制network:
version: 2
renderer: networkd
wifis:
wlp2s0:
dhcp4: true
access-points:
"SSID_NAME":
password: "WiFi密码"
注意 wifis 不能和 ethernets 混在同一个渲染器下用,如果网卡同时有有线和无线,可能需要分开配置文件或者指定 renderer。
3.5 场景五:修改主机名的同时调整网络
很多场景下,改主机名和配置网络是要一起做的。执行:
bash复制sudo hostnamectl set-hostname my-server
然后编辑 /etc/hosts,把原来指向旧主机名的行更新。
主机名和网络的关联体现在:有些服务(比如 SSH、Kerberos)会依赖主机名解析到正确的 IP,如果 /etc/hosts 里还写着旧主机名,表面上配置好了网络也可能出现访问异常。所以每次改完主机名,记得检查 /etc/hosts 是否把新主机名映射到了本机 IP。
3.6 场景六:桥接网卡(br0)
服务器虚拟化或容器场景经常需要桥接网卡。在 Netplan 里配置桥接:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
bridges:
br0:
interfaces: [ens33]
addresses: [192.168.1.100/24]
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses: [223.5.5.5]
注意这里 ens33 只作为成员加入桥接,自己不要再配 IP;桥接才有地址和路由。如果不小心同时给 ens33 配了 IP,路由表会出现不可预期的冲突。
3.7 场景七:临时改 IP 不想重启网络
有些情况下你只想临时手动指定一个 IP 测试,不想改动任何配置文件。直接用 ip 命令:
bash复制sudo ip addr add 192.168.1.200/24 dev ens33
sudo ip route add default via 192.168.1.1
这种方式重启网卡或重启系统后就失效,适合应急测试,不适合持久化配置。
4. 网络配完不通?一套完整的排查思路
4.1 排查链路:从配置到连通性逐层检查
网络配置完成后,如果 ping 不通,先别慌,按顺序排查,大多数问题几分钟内就能定位。
步骤一:确认配置是否生效
bash复制sudo netplan apply
netplan status
ip addr show
看网卡 ens33 是否显示 state UP,inet 字段是否是你配置的地址。如果 IP 不对,先检查配置文件里的“网卡名”。最常见的是——你在配置文件里写 eth0,而实际网卡叫 ens33,那么配置根本不会生效。
步骤二:检查默认路由
bash复制ip route
输出里必须有:default via 192.168.1.1 dev ens33 这一行。如果只有直连路由没有默认路由,说明网关配置没生效,回头检查 routes 字段。
步骤三:检查网关连通性
bash复制ping -c 3 192.168.1.1
如果网关 ping 不通,说明二层链路或交换机端口有问题,或者网关地址写错。网关通但外网不通,问题在路由或 DNS。
步骤四:检查外部 IP 连通性
bash复制ping -c 3 223.5.5.5
这个地址是纯 IP 访问,不走 DNS。能 ping 通说明三层路由没问题,接着查 DNS。
步骤五:检查 DNS 解析
bash复制nslookup baidu.com
如果解析失败,检查 resolvectl status 里的 DNS 地址是否为有效值。DNS 配置了但解析失败,大概率是 DNS 不可达,试着换成 223.5.5.5 或 114.114.114.114。
步骤六:查看系统日志
bash复制journalctl -u systemd-networkd -n 50
这一步能看到后端服务的报错,比如网卡找不到、配置格式错误等。很多配置问题在这一步就能看到真相。
4.2 常见的五大故障根因和处理
故障一:netplan apply 时提示 Invalid YAML
原因几乎都是缩进错误或 Tab 混用。解决办法:用 cat -A 查看文件里的隐藏字符,行尾如果看到 ^I 就是 Tab。
故障二:网卡显示 DOWN
检查网卡是否被物理禁用。服务器上执行 ip link set ens33 up 启用,虚拟机里检查网卡是否在 VMware/VirtualBox 中勾选已连接。
故障三:能 ping 通 IP,但无法解析域名
这个基本属于 DNS 问题,重点看 /etc/resolv.conf 是否被 systemd-resolved 接管。不要把 DNS 直接写在 /etc/resolv.conf 里,改 Netplan 配置中的 nameservers 才是持久方案。
故障四:配置了固定 IP 但 DHCP 地址还在
检查是否显式写了 dhcp4: false,另外执行完 netplan apply 后记得确认:
bash复制ip addr show ens33
如果同时出现两个 inet 地址,说明旧地址没回收,可以用 sudo dhclient -r ens33 释放,或直接重启网络。
故障五:虚拟机外部能 ping 通宿主机网关,但无法访问外网
这个多数是虚拟机网络模式问题。VMware NAT 模式下访问外网需要宿主机联网正常,桥接模式下需要保证交换机端口允许该 MAC 地址通过。检查虚拟机网络适配器的连接方式和网卡 MAC 是否被过滤。
4.3 抓包定位:当 ping 都解决不了问题
有些网络故障是“通了但服务不通”,这时就要抓包看真实数据流。Ubuntu 20.04 上可以用 tcpdump,装一下:
bash复制sudo apt install tcpdump
sudo tcpdump -i ens33 -n host 192.168.1.100
如果抓不到包,说明流量根本没有从这块网卡出去,问题在路由选择上,查 ip rule 的策略路由和 ip route 主路由表。
如果看到 SYN 包反复发送但收不到响应,可能是服务器防火墙把入站包拦了,检查:
bash复制sudo ufw status
或者 iptables 规则。
5. 进阶场景:虚拟机、WSL2 与多网卡环境
5.1 VMware 虚拟机网络模式与 Ubuntu 20.04 的配合
虚拟机装 Ubuntu,最容易踩的坑就是搞不清三种网络模式:
- NAT 模式:虚拟机通过宿主机访问外网,虚拟机之间互相访问通常也没问题。Ubuntu 20.04 配置成 DHCP 后,IP 一般是 192.168.x.x 网段,宿主机能 ping 通虚拟机,但外部机器访问不到虚拟机。
- 桥接模式:虚拟机就像局域网里的一台独立机器,直接占用物理网络的 IP,外部机器可以直接访问。适合需要对外提供服务的开发环境。
- 仅主机模式:只和宿主机通讯,无法访问外网,适合测试隔离环境。
配置 Ubuntu 20.04 的 IP 前,先确定 VMware 用哪种模式。如果你把网络配置成静态 IP,但 VMware 是 NAT 模式,网关必须填 VMware 虚拟网卡分配的网关(通常就是宿主机 VMnet8 的 IP),而不是物理路由器的网关。填错的结果就是虚拟机 ping 不通宿主机,更别说上网。
5.2 WSL2 的 Ubuntu 与 Windows 的网络互通问题
WSL2 默认使用 NAT 虚拟化网络,Ubuntu 在 WSL2 里也是一个独立的网络命名空间。从 Ubuntu 访问 Windows 宿主机,通常通过 /etc/resolv.conf 里的 nameserver IP 访问,这个 IP 就是 Windows 的虚拟网卡 IP。反过来,从 Windows 访问 WSL2 里的 Ubuntu 服务,则需要用 wsl hostname -I 查出来的 IP。
有时你会遇到“Ubuntu 能上网,但 Windows 访问不到 Ubuntu 里的服务”的情况。WSL2 端口转发是个经典问题。解决办法之一是在 Windows 里添加端口转发规则:
powershell复制netsh interface portproxy add v4tov4 listenport=2222 listenaddress=0.0.0.0 connectport=22 connectaddress=<WSL2IP>
然后允许防火墙放行对应端口。这种方式重启后不一定保留,可写脚本到启动任务里。还有一种方式是把 WSL2 网络模式从 NAT 改成镜像模式,让两者共用网络栈,但那是更高阶的玩法,对内核版本有要求。
5.3 双网卡配置:按业务网段分流
实际工作中会遇到一台 Ubuntu 20.04 服务器插了两块网卡:
ens33接业务网段 192.168.1.0/24ens37接管理网段 10.10.20.0/24
最常见的诉求是:两个网段都能相互访问,且默认网关走业务网段。配置写法:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: false
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
ens37:
dhcp4: false
addresses:
- 10.10.20.100/24
这里很有讲究:ens33 配了默认路由,ens37 只配地址不配默认路由,因为如果两个网卡同时配默认网关,系统会随机选择下一跳,导致部分流量走错口。
如果管理网段要访问 10.10.30.0/24,而该网段在 ens37 的对端,需要加一条静态路由指向 ens37 的网关 10.10.20.1:
yaml复制 routes:
- to: 10.10.30.0/24
via: 10.10.20.1
多网卡环境下,测试时用 ping -I <源IP> <目标IP> 指定源地址,避免路由选择误区。
5.4 内网环境下的 HTTP 代理配置
不少内网环境访问外部资源需要设置 HTTP 代理。如果你所在的网络环境有代理服务器,配置系统级代理可以这样:
编辑 /etc/environment:
bash复制export http_proxy="http://proxy.example.com:8080"
export https_proxy="http://proxy.example.com:8080"
export no_proxy="localhost,127.0.0.1,10.0.0.0/8"
这样对使用环境变量的工具统一生效。注意 no_proxy 要写清楚,否则内网请求也会走代理导致超时。
apt 的代理单独配置在 /etc/apt/apt.conf.d/ 下新建文件:
code复制Acquire::http::Proxy "http://proxy.example.com:8080";
Acquire::https::Proxy "http://proxy.example.com:8080";
这个配置只对 apt 生效,不影响其他程序。如果代理需要认证,URL 里可以带用户名密码格式,但这样明文存储有安全风险,适合放在权限受限的配置目录下。
6. 网络配置之外:几个容易忽略的系统细节
6.1 ufw 防火墙会不会拦掉你的网络
Ubuntu 20.04 默认可能没有启用 ufw,但如果启用过,会直接影响网络连通性。这里特别提醒一下:有时候你配置网络没问题,但就是连不上 22 端口,先查防火墙。
bash复制sudo ufw status
如果输出是 active,根据需求放行端口。放行 SSH:
bash复制sudo ufw allow 22/tcp
u 盘装好系统后,第一次配置网络,建议先把 ufw 状态看清楚,否则很容易把问题归结到网络配置上,排查半天。
6.2 网卡参数与链路协商问题
物理服务器的网卡可能涉及速率和双工模式。用 ethtool 查看:
bash复制sudo ethtool ens33
正常应该是 Speed: 1000Mb/s、Duplex: Full。如果链路协商为 10Mb/s 或半双工,说明网线质量或对端交换机端口有问题,即使 IP 配得对,传输速度也是灾难。
有些场景下需要强制设置速率:
bash复制sudo ethtool -s ens33 speed 1000 duplex full
但这种方式重启失效,而且部分网卡驱动不支持强制设置。生产环境遇到协商不对,优先检查物理链路,而不是强行设置。
6.3 多网卡环境下的主机名解析
服务器配了两个网卡,/etc/hosts 可能要把不同主机名映射到不同 IP。比如:
code复制192.168.1.100 hostname-app
10.10.20.100 hostname-mgmt
在一些依赖主机名互相访问的服务里,这种映射能避免 DNS 绕路。配置完后可以用 hostname -I 确认所有 IP 都绑定成功。
7. 经过实战检验的几点经验
最后不讲虚的,说说我在配置 Ubuntu 20.04 网络过程中的一些感受。
第一,配置文件的备份永远是第一步。无论你是用 netplan try 还是直接 netplan apply,先把原文件备份到一个带日期后缀的文件。网络配置出问题的时候,最快的恢复方式就是 cp 回去再 apply,别浪费时间回忆自己改了什么。
第二,每次改完配置先 netplan try,再 netplan apply。哪怕你觉得自己写的一点问题没有,多这一步验证不会耽误超过两分钟,换来的是远程服务器不会因为一个误配置直接失联。如果 try 超时自动回滚了,别急着骂系统,认真看错误信息,90% 是 YAML 语法问题。
第三,遇到了网卡名漂移不要慌。之前见过有人给服务器换了一块网卡,原来的 ens33 变成了 ens34,Netplan 配置里的名字对不上,整个网络直接趴窝。遇到这种问题,用 ip link 查出真实网卡名改配置即可,别迷信“重启网络服务就好”,重启一万次也解决不了名字漂移。
第四,网络配置完成后,记得验证 DNS 和路由。我的固定流程是:netplan apply → ping 网关 → ping 外部IP → 解析域名 → 测试 SSH。这条链路走通了,再继续部署服务,能省掉后面一堆排查时间。
第五,不用害怕删除重来。配置网络碰到完全改不回来的情况,就直接 sudo rm /etc/netplan/xxx.yaml 重建一个干净的文件,重启网络或重启系统,很多奇怪的问题在干净配置下反而自动消失了。配置网络这件事,本质上就是“理解工具链 → 写对格式 → 按链路验证”。
希望这些内容能帮你在 Ubuntu 20.04 上少走点弯路,把时间花在实际业务上,而不是和 YAML 缩进死磕。
