前几天帮人调一台 Ubuntu 20.04 服务器,开机后网卡起来了,但就是死活连不上外网。一通排查下来,问题居然出在 Netplan 里 DNS 写错了一层缩进。这种问题在 Ubuntu 系统里太常见了,尤其 20.04 开始把网络配置统一收敛到 Netplan 之后,很多人还是拿老一套 /etc/network/interfaces 的思路来改,结果越改越乱。
今天我就把 Ubuntu 20.04 网络配置这件事从头到尾捋一遍,从最基础的 IP 地址设置、网卡信息查看,到静态 IP 配置、DNS 解析、路由检查,再到最后能不能顺利连上外网,全部用亲测可用的命令和配置示例讲清楚。不管是刚装好 Ubuntu 的虚拟机,还是机房里的物理服务器,这篇文章都能让你照着操作就解决问题。
1. 动手之前,先搞清楚 Ubuntu 20.04 的网络管理机制
1.1 为什么一定要从 Netplan 说起
很多从 CentOS 7 或者更老版本 Ubuntu 转过来的朋友,第一时间会去改 /etc/network/interfaces 文件,改完执行 service networking restart,然后发现要么提示服务不存在,要么配置没生效。原因很简单:Ubuntu 18.04 之后,系统默认的网络配置工具已经从 ifupdown 换成了 Netplan。
Netplan 是一个基于 YAML 的抽象网络配置工具。你在 /etc/netplan/ 目录下看到的 .yaml 文件,是它的前端配置入口。Netplan 会根据这些 YAML 文件,在系统启动时或执行 netplan apply 时,把配置转换成后端渲染器能识别的格式,再交给后端去执行。
Ubuntu 20.04 默认有两种后端可以选:NetworkManager 和 systemd-networkd。桌面版默认用 NetworkManager,服务器版默认用 systemd-networkd。这个差异对日常配置影响很大,比如你在一台桌面 Ubuntu 上手动改了 /etc/netplan/01-network-manager-all.yaml,如果没有把 renderer 指定为 NetworkManager,修改可能被 NetworkManager 接管或忽略,出现让人摸不着头脑的现象。
Netplan 的配置语法是 YAML,这意味着缩进和空格极其敏感。一个 Tab 键或两个空格用错,netplan apply 直接报错,甚至整台机器的网络都不动。我见过太多人因为 addresses 和 gateway4 的层级写错,导致配置一直不生效,这就是没有理解 Netplan 的核心机制。
1.2 你的系统里现在跑的是哪一套网络栈
在动手改配置之前,我建议你先搞清楚当前系统到底用的哪一套网络栈。这样后续排查才不会像无头苍蝇。
执行下面两条命令:
bash复制systemctl status systemd-networkd
systemctl status NetworkManager
如果 systemd-networkd 是 active 状态,说明你这台机器的网络由 systemd-networkd 管理,配置走 Netplan 的 systemd-networkd 后端即可。如果 NetworkManager 是 active 状态,说明是桌面环境或者 NetworkManager 接管了网络,改 Netplan 时要在 renderer 字段里写上 NetworkManager。
还有一种情况:两个服务都没有运行,那就看看 netplan 当前用的什么 renderer:
bash复制netplan get
这条命令会打印当前生效的 Netplan 配置。比如输出:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: true
这就说明后端是 networkd。如果你看到 renderer: NetworkManager,那后面配置静态 IP 时,renderer 字段也要保持 NetworkManager,避免两台服务互相打架。
1.3 配置之前先做三件事
每次给服务器或虚拟机改网络配置,我都会先做三件事,这三件事帮我避免过很多次灾难。
第一件:备份当前的网络配置。命令很简单:
bash复制sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak
如果文件名不同,比如是 00-installer-config.yaml,就替换成实际文件名。备份是万能的后悔药,尤其当你通过 SSH 远程修改服务器网络时,配置错了把自己关在门外,备份能让你在机房或面板里快速恢复。
第二件:确认你当前是用 IP 连接还是用主机名连接。如果是远程操作,务必关闭系统防火墙或提前放行 SSH 端口,否则静态 IP 一改,IP 变了,SSH 会话直接断掉,人就进不去了。
第三件:查看当前的网卡名称和 MAC 地址。Ubuntu 20.04 的网卡命名规则是 ens33、ens160、enp0s3 这种形式,不再是老版本的 eth0。用 ip addr 查看一下,把网卡名字记下来。后面写配置时网卡名字写错,配置直接无法生效。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 静态 IP 配置实操:从 DHCP 到固定地址
2.1 查看当前网络状态与网卡名称
先看当前网络状态:
bash复制ip addr
输出类似:
text复制2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether 00:0c:29:ab:cd:ef brd ff:ff:ff:ff:ff:ff
inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic ens33
valid_lft 86389sec preferred_lft 86389sec
inet6 fe80::20c:29ff:feab:cdef/64 scope link
valid_lft forever preferred_lft forever
可以看出网卡名是 ens33,当前 IP 是 192.168.1.100,是 DHCP 动态分配的。此时再查看路由,确认网关在哪里:
bash复制ip route
输出类似:
text复制default via 192.168.1.1 dev ens33 proto dhcp src 192.168.1.100 metric 100
192.168.1.0/24 dev ens33 proto kernel scope link src 192.168.1.100
这里能看出网关是 192.168.1.1。记录下这些信息,后面静态 IP 配置要用到。
2.2 编写 Netplan 配置文件
Netplan 配置文件都在 /etc/netplan/ 目录下。Ubuntu 20.04 服务器版常见文件名是 00-installer-config.yaml,桌面版常见文件名是 01-network-manager-all.yaml。无论哪个,编辑方式都一样。
先备份,再编辑:
bash复制sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak
sudo vim /etc/netplan/00-installer-config.yaml
一个最常见的静态 IP 配置长这样:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
dhcp4: no
dhcp6: no
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
nameservers:
addresses:
- 192.168.1.1
- 223.5.5.5
这个配置里有几个字段需要解释一下。
dhcp4: no 和 dhcp6: no 是关闭 IPv4 和 IPv6 的 DHCP 自动获取,改为手动指定。如果你还想保留 IPv6,可以只关掉 dhcp4,IPv6 部分单独配置。
addresses 是一个列表,可以写多个 IP。格式必须是 CIDR 格式,也就是 IP/掩码位数。很多人一开始只写 192.168.1.100 不带 /24,结果系统不给网卡分配 IP,因为 Netplan 要求必须带前缀长度。
routes 是路由配置。这里 to: default 表示默认路由,via: 192.168.1.1 表示下一跳网关。在 Ubuntu 20.04 里,Netplan 已经不支持老的 gateway4 写法了,虽然有些老教程还在用,但新版本会给出警告,甚至直接报错,所以统一用 routes 写法最稳妥。
nameservers.addresses 配置 DNS 服务器。这里写了两组:一个是内网网关地址,一个是公共 DNS。这样即使内网 DNS 解析失败,还能靠公共 DNS 兜底。
2.3 应用配置的正确姿势:netplan try 与 apply 的区别
配置写完后,很多人直接执行:
bash复制sudo netplan apply
这样做没有问题,但如果配置有误,网络会立刻断掉,尤其是远程操作时,可能人就被关在门外了。所以我强烈建议用 netplan try 而不是直接 apply。
netplan try 会先应用新配置,然后等待你确认。如果配置导致网络不通,它会在一段时间后自动回滚到旧配置。执行完 netplan try 后,系统会提示:
text复制Do you want to keep these settings?
Press Enter before the timeout to accept the new configuration
如果你看到网络正常,按回车确认。如果网络断了,不用管,等 120 秒自动回滚,你就安全了。
确认配置没问题后,再执行:
bash复制sudo netplan apply
执行完以后,立即验证 IP 是否生效:
bash复制ip addr show ens33
看到 inet 192.168.1.100/24 而且后面没有 dynamic 字样,就说明静态 IP 已经生效了。
2.4 同网段测试:从虚拟机到服务器场景的验证
IP 配置好后,先做同网段连通性测试,再谈外网。这一步能帮你快速区分“内网都没通”还是“只差外网”。
用网关地址测试:
bash复制ping -c 4 192.168.1.1
如果通,说明网卡、交换机、网关链路正常。如果不通,检查是不是 IP 冲突、网卡没有 up,或者交换机端口 VLAN 不对。
如果是虚拟机场景(VMware 或 VirtualBox),还要确认虚拟网络模式。VMware 里桥接模式对应物理网络,NAT 模式对应虚拟 NAT 网络,Host-Only 模式只能和宿主机通信。你配置的 IP 网段必须和虚拟网络模式匹配,否则怎么配都通不了。我之前在 VMware 里配置静态 IP 后一直 ping 不通网关,最后发现是把网络模式从“桥接”改成了“NAT”,而 IP 还是按桥接网段配置的。
如果是物理服务器,确认网线接的是哪个口,网卡是否连上了交换机,交换机端口是否启用了 STP 或端口安全策略。这些属于物理链路层的问题,光看系统配置是看不出来的。
3. DNS 配置不能靠运气:解析失效的常见原因
3.1 谁在管理你的 DNS?
Ubuntu 20.04 默认运行 systemd-resolved 服务来管理 DNS 解析。这个服务监听 127.0.0.53,所以你在 /etc/resolv.conf 里看到的 nameserver 往往是 127.0.0.53,而不是真实的 DNS 地址。
很多人不理解这一点,看到 /etc/resolv.conf 里写着 127.0.0.53,以为系统没有配置 DNS,于是手动把 nameserver 8.8.8.8 写进去,一重启又被覆盖。这是因为 /etc/resolv.conf 实际是一个指向 /run/systemd/resolve/stub-resolv.conf 的软链接,systemd-resolved 会在运行时自动生成和更新它。
正确的做法是:不要直接改 /etc/resolv.conf,而是通过 Netplan 配置 DNS,或者直接改 systemd-resolved 的配置。
用 resolvectl status 可以查看当前 DNS 状态:
bash复制resolvectl status
输出中会显示每个网卡当前使用的 DNS 服务器。如果这里显示为空,说明 Netplan 里的 nameservers 没有正确下发。
3.2 给 Netplan 加上 DNS 的正确写法和注意事项
Netplan 配置 DNS 相比老款 interfaces 文件要简洁很多。在网卡配置里加一个 nameservers 块即可:
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:
- 192.168.1.1
- 223.5.5.5
search:
- example.com
要注意的是 addresses 里写的是 DNS 服务器地址,不是域名。search 字段是搜索域,当你要访问 myserver 时,systemd-resolved 会先尝试 myserver.example.com,主要用在内网域名解析场景,普通拨号上网不用填。
配置完成后,需要重启 systemd-resolved 或执行 netplan apply 让配置生效:
bash复制sudo systemctl restart systemd-resolved
然后再次用 resolvectl status 确认 DNS 已经下发成功。
3.3 实测排查:DNS 解析失败的几种表现
DNS 解析失败的症状有很多种,最常见的三种:
第一种:ping 通 IP 但 ping 不通域名。比如 ping 223.5.5.5 通,ping baidu.com 却提示 Temporary failure in name resolution。这说明网络是通的,问题出在 DNS 配置上。优先检查 Netplan 里的 nameservers 是否写对、systemd-resolved 状态是否正常。
第二种:部分域名能解析部分不能解析。这通常是内网 DNS 服务器的问题,内网 DNS 没有正确配置转发,或者某些域名被污染。可以先切换到公共 DNS 测试,如果正常,说明问题在内网 DNS。
第三种:DNS 配置正确但是不生效。这种往往是 Netplan 配置没有正确应用,或者 systemd-resolved 被手动禁用。检查一下 /etc/resolv.conf 的软链接指向:
bash复制ls -l /etc/resolv.conf
如果指向的不是 /run/systemd/resolve/stub-resolv.conf,说明有人手动改过 resolv.conf,或者 systemd-resolved 没在运行。此时执行:
bash复制sudo systemctl enable --now systemd-resolved
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
再重启一次 systemd-resolved,基本能解决。
我还踩过一个坑:在 Netplan 的 nameservers.addresses 里写了一个不可达的 DNS 地址,比如写成了网关地址 192.168.1.254,但网关实际是 192.168.1.1。结果就是 systemd-resolved 一直尝试向 192.168.1.254 发查询,超时后才轮到下一组 DNS。导致解析特别慢,有时候要等十几秒才出结果。所以配置 DNS 时不要把网关地址想当然,一定要用 ip route 确认实际网关。
4. 从本机到外网:路由、网关与连通性排查
4.1 一条数据包到外网的完整路径
静态 IP 配好、DNS 能解析之后,回到最核心的问题:能不能连上外网。
一个数据包从你这台 Ubuntu 机器发到外部网站,路径大致是这样的:本机网卡 -> 交换机/路由器(网关)-> 运营商网络 -> 目标服务器。在这个链路里,本机要配置正确的 IP、正确的掩码、正确的网关,缺一个都不行。
IP 和掩码决定数据包能不能发到同一个二层域内,网关决定数据包出了本网段之后往哪里扔。如果你本机 IP 写的是 192.168.1.100/24,但网关写的是 10.0.0.1,那数据包出网卡后根本不知道往哪扔,因为它不在同一个网段。
4.2 网关与路由表检查指令
配置完网络后,第一步检查路由表是否正确:
bash复制ip route
正常的输出应该有一行 default via <网关IP> dev <网卡名>。如果这一行是空的,说明没有默认路由,外网肯定不通。这时候回头检查 Netplan 里的 routes 配置,确保 to: default 和 via 写对了。
如果要查看详细的 IPv6 路由,用:
bash复制ip -6 route
对于多网卡机器,还要注意路由优先级。ip route 输出的信息里,每行末尾可能有一个 metric 100 这样的字段。它表示路由的优先级,数字越小优先级越高。当有多个默认路由时,系统会优先走 metric 小的那个。如果你有两张网卡,一张连内网一张连外网,需要靠 metric 控制默认路由走向。
4.3 外网连通性测试怎么打才不踩坑
测试外网连通性,最简单的方法就是 ping 一个公网 IP:
bash复制ping -c 4 223.5.5.5
这里我推荐先 ping IP,不要一上来就 ping 域名。这样可以把“网络通不通”和“DNS 解析正不正常”分开排查。如果 ping IP 通,说明路由和网关没问题;如果 ping 域名也通,说明 DNS 也没问题。
再进一步,用 curl 或 wget 测试 HTTP 访问:
bash复制curl -I http://example.com
这样能测试端口连通性和 DNS 解析,比 ping 更贴近实际应用场景。
这里再提一个经验:ping 不通不代表不能上网。有些网络环境禁 ICMP 协议,但 HTTP/HTTPS 是正常的。所以遇到 ping 不通外网 IP 的情况,先别急着判定网络故障,用 curl 测一下再下结论。
4.4 上不了网时按这个顺序排查
当一台 Ubuntu 20.04 上不了外网时,我一般按这个顺序排查:
先看网卡状态。ip addr 确认网卡有 IP,且状态为 UP。如果网卡是 DOWN,执行 sudo ip link set ens33 up 拉起来。
再看默认路由。ip route 确认 default 路由存在且网关正确。如果网关不对,改 Netplan 配置并 apply。
然后 ping 网关。ping -c 3 <网关IP>,确认二层三层链路通。如果这里就不通,问题出在物理链路或网关设备,往上查交换机、路由器。
接着 ping 公网 IP。ping -c 3 223.5.5.5,确认 NAT 和运营商链路正常。如果这里不通,检查路由器是否做了 NAT,或者运营商有没有把 IP 封了。
最后 ping 域名。ping -c 3 example.com,确认 DNS 解析正常。
按这个顺序,几乎能定位 90% 的网络问题。不要跳步,不要上来就 ping 域名,那样出了问题你很难判断是路由问题还是 DNS 问题。
5. 进阶场景:多网卡、无线网络与命令行管理
5.1 多网卡环境下的路由策略
很多服务器不止一张网卡。比如一张网卡接内网,一张网卡接外网。这种场景下,Netplan 的配置要更精细。
先看一个例子:
yaml复制network:
version: 2
renderer: networkd
ethernets:
ens33:
addresses:
- 192.168.1.100/24
routes:
- to: default
via: 192.168.1.1
metric: 100
ens34:
addresses:
- 10.0.0.100/24
routes:
- to: 10.0.0.0/24
via: 10.0.0.1
metric: 200
这里 ens33 有一条默认路由指向外网网关,ens34 只有一条内网路由。这样内网访问走 ens34,外网访问走 ens33,互不干扰。
如果你想让某个网段强制走某张网卡,可以添加更具体的路由:
yaml复制routes:
- to: 172.16.0.0/12
via: 10.0.0.1
这样所有到 172.16.0.0/12 网段的流量都走 10.0.0.1,即使你是外网 IP 也走内网口。
多网卡配置里最容易踩的坑是:两张网卡都配置了默认路由,导致流量全走其中一张。解决方式就是用 metric 手动指定优先级,内网网卡的 metric 调大,外网网卡的 metric 调小,让系统优先走外网。
5.2 无线网卡的 Netplan 配置
Ubuntu 20.04 桌面版连接 Wi-Fi,大多数人直接用图形界面,点一下就连上了。但如果你的机器是不带图形界面的 Ubuntu 服务器版,又需要连 Wi-Fi,那就得在 Netplan 里配置无线网络。
配置示例:
yaml复制network:
version: 2
renderer: networkd
wifis:
wlp2s0:
dhcp4: yes
access-points:
"MyWiFi":
password: "your_password"
注意,access-points 下面的键名是无线网络的 SSID,必须用引号包裹,密码字段是 password。如果 Wi-Fi 是隐藏网络,还要加一行 hidden: true。
配置完成后执行 sudo netplan apply,然后看网卡是否获取到 IP:
bash复制ip addr show wlp2s0
如果获取到了 IP,基本就成功了。如果没获取到,先检查密码是不是写错了,再看网卡是否被无线网卡驱动正常驱动。可以通过 dmesg | grep wlan 查看驱动日志。
5.3 用 nmcli 管理网络:不想写 yaml 时怎么办
如果你用的是桌面版 Ubuntu,NetworkManager 接管了网络,那还有个更简单的命令行工具:nmcli。
查看当前连接:
bash复制nmcli connection show
创建一个静态 IP 连接:
bash复制sudo nmcli connection mod "Wired connection 1" \
ipv4.addresses 192.168.1.100/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns "192.168.1.1 223.5.5.5" \
ipv4.method manual
然后重启连接:
bash复制sudo nmcli connection up "Wired connection 1"
使用 nmcli 的优点是修改立即生效,不用去理解 YAML 缩进,也不容易写错配置文件。缺点是无法覆盖所有 Netplan 的高级功能,比如多路由策略。
另外要注意,如果 Netplan 里写了 renderer: NetworkManager,那 Netplan 的配置会交给 NetworkManager 去解释。此时用 nmcli 修改连接,反过来也会影响 Netplan 的配置。两者之间要保持一致,避免互相覆盖。
6. 常见问题与排查技巧实录
6.1 故障速查表
我把平时遇到最多的几类问题整理成了表格,方便你按图索骥。
| 现象 | 可能原因 | 排查命令 | 解决方法 |
|---|---|---|---|
| 网卡没有 IP | Netplan 配置未生效或网卡未启用 | ip addr |
检查配置,执行 sudo netplan apply |
| ping 不通网关 | IP 不在同一网段或网关写错 | ip addr、ip route |
核对网段和网关地址 |
| ping 通 IP,ping 不通域名 | DNS 配置错误 | resolvectl status |
修改 Netplan nameservers |
| 执行 netplan apply 报错 | YAML 缩进错误或字段名错误 | sudo netplan apply 报错信息 |
检查缩进,gateway4 改为 routes |
| 上不了外网但内网正常 | 默认路由缺失或 NAT 问题 | ip route |
添加 default 路由,检查路由器 |
| SSH 连接不上 | 防火墙拦截或 IP 配置错误 | sudo ufw status |
放行 22 端口,检查 IP 配置 |
| 网卡状态 DOWN | 驱动未加载或网卡被禁用 | ip link |
执行 sudo ip link set <网卡> up |
6.2 几个亲测有效的小技巧
最后分享几个我实际操作中验证过的小技巧,遇到问题能少走不少弯路。
第一个技巧:如果你远程改网络,一定要用 netplan try,不要用 netplan apply。netplan try 会自动回滚,这是保命的操作。我见过有人远程改完配置直接断了 SSH,最后只能去机房重启,非常狼狈。用 netplan try 至少能给自己留一条后路。
第二个技巧:Ubuntu 20.04 里有些网卡名称是 enp0s3 这种带数字后缀的形式,有些是 wlx 开头。在配置之前,用 ip addr 看清网卡名字,不要凭感觉写 eth0,否则 Netplan 会直接报“找不到匹配的网卡”。
第三个技巧:修改任何网络配置前,先确认当前 /etc/resolv.conf 的符号链接指向。如果指向不正常,systemd-resolved 可能不会接管 DNS 配置,导致你 Netplan 里写了 DNS 也不生效。用 ls -l /etc/resolv.conf 检查,必要时重新建软链接。
第四个技巧:如果你的系统装了 Docker 之类会操作 iptables 的软件,网络不通时记得用 systemctl restart docker 重启一下 Docker 服务。Docker 在启动时会重建 iptables 规则,有时会覆盖你手写的规则,导致宿主机端口访问异常。这不算网络配置问题,但会表现得很像网络问题,排查时别忘了这个方向。
第五个技巧:多网卡环境下,ip rule 和 ip route show table 可以查看策略路由。如果你配了多张网卡但流量走向不对,用这两个命令能定位到问题是不是出在策略路由上。光看 ip route 的信息不够全面。
我在实际工作中发现,绝大多数 Ubuntu 网络问题都不是什么高深莫测的底层故障,而是配置文件写错、服务状态不对、网卡名写错这类基础问题。把 Netplan 这套配置逻辑捋清楚了,再配合系统化的排查顺序,基本都能在十分钟内解决。希望这篇 Ubuntu 20.04 网络配置全攻略能帮你少踩一些坑,尤其是第一次配置静态 IP 的朋友,建议先备份配置、再用 netplan try 验证,稳扎稳打,网络自然会通。
