1. 项目概述与核心价值
最近在给几台跑服务的Ubuntu Server 20.04 LTS机器做网络规划,从动态获取IP(DHCP)切换到静态IP是必须走的一步。无论是为了做端口映射、搭建内网服务,还是确保服务器地址稳定不被路由器随意更改,静态IP都是服务器环境里的“基础设施”。Ubuntu从17.10版本开始,引入了netplan作为默认的网络配置工具,取代了之前我们熟悉的/etc/network/interfaces文件。这个变化一开始让不少老手有点不适应,但用熟了会发现,netplan基于YAML的声明式配置其实更清晰、更现代。这篇文章,我就结合自己多次配置的经验,把Ubuntu Server 20.04下使用netplan配置静态IP的完整流程、背后的原理、常见的坑以及排查技巧,给你一次讲透。无论你是刚接触Linux服务器的新手,还是想系统了解netplan的老兵,这篇都能让你直接上手,配完就能用。
2. netplan核心原理与设计思路拆解
2.1 为什么是netplan?与传统interfaces文件的对比
在netplan出现之前,Debian/Ubuntu系列主要使用/etc/network/interfaces文件配合ifup和ifdown脚本来管理网络。这种方式直接、灵活,但缺点也很明显:配置语法相对老旧,且与系统其他部分(如NetworkManager)的集成有时会产生冲突,尤其是在桌面版与服务器版混合使用的场景下。
netplan的引入,是Canonical为了统一和简化Linux网络配置迈出的一步。它的核心设计思想是“声明式”配置。你不需要写一堆命令式的脚本去“如何”配置网络,而是用一个YAML文件去“声明”你希望网络最终“是什么”状态。netplan本身只是一个配置读取器和翻译器,它不直接操作网卡。它的工作流程是:读取位于/etc/netplan/目录下的YAML配置文件,然后根据配置文件内容,生成对应后端(renderer)所需的配置脚本。在Ubuntu Server 20.04上,默认的后端是systemd-networkd,这是一个更底层、更专注于网络配置的系统服务。
举个例子,在interfaces文件里,你可能会写ifconfig eth0 192.168.1.100 netmask 255.255.255.0这样的命令。而在netplan的YAML里,你写的是addresses: [192.168.1.100/24]。前者是命令,后者是状态描述。这种声明式的方式,让配置更易于阅读、维护,也更容易被自动化工具(如Ansible、Puppet)所管理。
2.2 netplan配置文件结构与关键字段解析
/etc/netplan/目录下的YAML文件通常以.yaml结尾,例如00-installer-config.yaml或01-netcfg.yaml。文件名开头的数字决定了配置的应用顺序。一个最基本的静态IP配置骨架如下:
network: version: 2 renderer: networkd ethernets: ens33: addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 8.8.8.8 - 114.114.114.114我们来拆解每一个关键部分:
network: 根节点,固定写法。version: 2: 必须声明,表示使用netplan的第二个版本语法。renderer: 指定后端。对于Ubuntu Server,务必使用networkd。如果你在桌面版上看到NetworkManager,那是为了支持图形化网络管理,在纯服务器环境用networkd更轻量、稳定。ethernets: 定义有线以太网接口。下面的ens33是你的网络接口名称,这是第一个容易踩坑的地方。你必须使用你系统实际的接口名,可以通过ip link show或ls /sys/class/net命令查看。常见的命名规则有ens33(VMware)、enp0s3(VirtualBox)、eth0(老式内核)等。addresses: 定义IP地址和子网掩码。注意格式是CIDR表示法,192.168.1.100/24等同于192.168.1.100+ 子网掩码255.255.255.0。这是一个列表,意味着你可以为一个接口配置多个IP。routes: 定义路由。to: default表示默认路由(即网关),via后面跟的就是网关地址。这是让服务器能访问外网的关键。nameservers: 定义DNS服务器地址。没有正确的DNS,服务器可能能ping通IP,但无法解析域名(比如apt update会失败)。
注意:YAML语法对缩进非常敏感!必须使用空格(通常2个或4个),绝对不能使用Tab键。一个缩进错误就会导致
netplan apply失败。
3. 静态IP配置全流程实操详解
3.1 前期准备与信息收集
在动手修改配置文件之前,准备工作至关重要,能避免很多无效操作。
确认当前网络接口与连接状态:
ip addr show或者用更传统的:
ifconfig -a这个命令会列出所有网络接口。找到那个有
inet(IPv4地址)或者状态是UP的接口,记下它的名字(比如ens33)。同时,记下它当前通过DHCP获取到的IP、子网掩码和广播地址,这些信息有助于你规划静态IP。获取网关和DNS信息:
ip route show default输出类似
default via 192.168.1.1 dev ens33,这里的192.168.1.1就是你的网关地址。 查看当前DNS:cat /etc/resolv.conf里面
nameserver后面的IP就是DNS地址。通常网关路由器自身也充当DNS服务器(如192.168.1.1),你也可以使用公共DNS如8.8.8.8(Google)或114.114.114.114(国内)。规划你的静态IP地址:
- 确保IP在子网内:如果你的子网是
192.168.1.0/24,那么可用IP范围是192.168.1.1到192.168.1.254(通常.1是网关,.255是广播地址)。 - 避免IP冲突:你选择的静态IP(例如
192.168.1.100)不能已经被网络内的其他设备(通过DHCP或手动)占用。一个简单的方法是在配置前,从另一台电脑ping一下你打算用的IP,如果不通,通常可用。更稳妥的办法是在路由器后台的DHCP地址池设置中,将你要用的静态IP排除在分配范围之外。
- 确保IP在子网内:如果你的子网是
3.2 编辑netplan配置文件
Ubuntu Server 20.04安装后,通常在/etc/netplan/下会有一个初始配置文件,可能是00-installer-config.yaml或50-cloud-init.yaml。我们直接编辑它。
备份原始配置(好习惯):
sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.backup使用文本编辑器编辑:推荐使用
vim或nano。sudo nano /etc/netplan/00-installer-config.yaml写入静态IP配置:将之前准备好的信息填入。以下是一个完整的示例,假设网卡是
ens33,计划使用静态IP192.168.1.100,网关192.168.1.1,DNS为8.8.8.8和192.168.1.1。network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no # 关键:关闭DHCPv4 addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 8.8.8.8 - 192.168.1.1 # 可选:设置MTU,对于某些网络环境可能需要调整 # mtu: 1500关键改动:一定要将原有的
dhcp4: yes改为dhcp4: no,明确禁用DHCP,否则静态IP配置可能不生效。
3.3 应用配置与验证
配置写完后,保存并退出编辑器。
语法检查:在应用前,先让
netplan检查一下配置文件语法是否正确。sudo netplan try这个命令会应用配置并等待120秒。如果网络连接没有断开(你还能操作),按回车确认更改。如果配置有误导致断网,120秒后它会自动回滚到之前的配置。对于远程连接的服务器,这是最安全的测试方法,可以防止你把自己“关在门外”。
正式应用配置:如果
netplan try测试通过,或者你直接在服务器前操作,可以直接应用。sudo netplan apply这个命令会立即应用配置,如果配置错误可能导致当前SSH连接中断。
验证配置是否生效:
- 检查IP地址:
查看输出中是否出现了你配置的静态IPip addr show ens33192.168.1.100/24。 - 检查路由:
确认默认路由(ip route showdefault via 192.168.1.1 dev ens33)是否正确。 - 检查DNS:
注意,cat /etc/resolv.confnetplan配置的DNS会写入/etc/resolv.conf,但该文件开头通常有一行注释# This is /run/systemd/resolve/stub-resolv.conf,说明它是由systemd-resolved管理的符号链接。只要里面的nameserver是你配置的地址即可。 - 测试网络连通性:
如果第一个通,第二个不通,问题很可能出在DNS配置上。ping -c 4 8.8.8.8 # 测试是否能通外网IP ping -c 4 google.com # 测试DNS解析和网络连通性
- 检查IP地址:
4. 多网卡与复杂网络场景配置
服务器上经常有多个网卡,用于不同的网络平面,比如一个接公网/业务网,一个接内网/管理网。
4.1 双网卡独立配置
假设服务器有两张网卡:ens33连接内网(192.168.1.0/24),ens34连接业务网(10.0.0.0/24)。我们希望ens33用DHCP(从内网路由器获取IP),ens34配置静态IP。
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: yes # 内网卡使用DHCP # 可以添加DHCP覆盖的选项,例如指定主机名 # dhcp4-overrides: # use-hostname: false ens34: dhcp4: no addresses: - 10.0.0.100/24 # 注意:通常只为出口网卡配置默认网关,否则会有路由冲突 # routes: # - to: default # via: 10.0.0.1 # 谨慎!这会使默认流量走ens34 nameservers: addresses: - 8.8.8.8重要原则:一台机器一般只应有一个默认网关。如果两个网卡都配置了
to: default的路由,会导致路由表混乱,网络行为不可预测。通常将连接外网或主网络的接口设为默认网关。
4.2 配置静态路由
对于多网卡场景,更常见的是为特定网段配置静态路由。例如,通过ens33(192.168.1.100)网关可以访问办公网,现在需要访问另一个子网172.16.0.0/16,其网关是192.168.1.254。
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 # 默认网关,用于上网 - to: 172.16.0.0/16 # 到目标子网的路由 via: 192.168.1.254 # 下一跳地址 metric: 100 # 可选:路由优先级,数值越小优先级越高 nameservers: addresses: [8.8.8.8]这样,所有访问172.16.0.0/16网段的流量,都会被导向192.168.1.254,而不是默认网关。
5. 故障排查与常见问题实录
配置静态IP时,难免会遇到问题。下面是我总结的几个最常见的情况和排查思路。
5.1 应用配置后网络断开/SSH连接丢失
这是最令人紧张的情况,尤其是远程操作时。
- 原因1:IP地址冲突。你设置的静态IP已经被局域网内其他设备占用。
- 排查:在应用配置前,最好先
ping一下目标IP。如果是在netplan try的120秒内发现断网,不要确认,等其自动回滚。 - 解决:更换一个未被占用的IP地址。可以在路由器管理界面查看已分配IP列表。
- 排查:在应用配置前,最好先
- 原因2:网关配置错误。
via后面的网关地址写错了,或者根本不存在。- 排查:确认网关地址是否正确。通常网关是你路由器内网口的IP(如
192.168.1.1)。 - 解决:更正网关地址。
- 排查:确认网关地址是否正确。通常网关是你路由器内网口的IP(如
- 原因3:子网掩码(CIDR前缀)错误。
/24对应255.255.255.0,如果你写成/16或/32,会导致路由计算错误。- 排查:根据你的网络规划核对CIDR前缀。家用网络最常见的是
/24。 - 解决:更正子网掩码。
- 排查:根据你的网络规划核对CIDR前缀。家用网络最常见的是
- 紧急恢复:如果SSH已断开,且你无法物理接触服务器:
- 如果服务器有带外管理功能(如iDRAC、iLO),通过它登录控制台。
- 如果没有,只能等待服务器因
netplan try超时而回滚,或者重启后使用旧的配置(如果apply后重启,旧配置就没了)。因此,远程操作务必先netplan try!
5.2 可以ping通IP但无法解析域名(apt update失败)
- 原因:DNS配置错误或未生效。
- 排查:
如果cat /etc/resolv.conf nslookup google.comnslookup提示connection timed out或server can‘t find google.com,就是DNS问题。 - 解决:
- 检查
netplanYAML文件中的nameservers部分是否配置正确。 - 确认DNS服务器IP是否可达(
ping 8.8.8.8)。 - 重启
systemd-resolved服务:sudo systemctl restart systemd-resolved。 - 有时需要明确指定DNS搜索域,可以在
netplan配置中添加:nameservers: addresses: [8.8.8.8, 1.1.1.1] search: [mydomain.local] # 你的本地域名
- 检查
- 排查:
5.3 netplan apply 报错:Invalid YAML
- 原因:YAML语法错误。最常见的是缩进用了Tab键,或者冒号后面没加空格。
- 排查:使用
sudo netplan --debug apply可以输出更详细的错误信息,通常会指出错误行。 - 解决:
- 使用
sudo cat -A /etc/netplan/00-installer-config.yaml查看文件,^I表示Tab键,$表示行尾。确保缩进都是空格。 - 使用在线的YAML语法检查器,或者
python3 -c ‘import yaml; yaml.safe_load(open(“/etc/netplan/00-installer-config.yaml”))’来验证语法。
- 使用
- 排查:使用
5.4 网卡名称不匹配(找不到ens33或eth0)
- 原因:现代Linux使用可预测的网络接口命名规则,名称可能因硬件、虚拟化平台而异。
- 解决:
- 使用
ip link show或ls /sys/class/net查看准确的接口名。 - 如果确实想修改网卡名回传统的
eth0,可以编辑/etc/default/grub,在GRUB_CMDLINE_LINUX行添加net.ifnames=0 biosdevname=0,然后运行sudo update-grub并重启。但通常不建议,适应新的命名规则更好。
- 使用
5.5 配置生效但重启后恢复原状
- 原因:可能有其他服务或工具在覆盖网络配置,比如
cloud-init(常见于云服务器或使用自动安装的镜像)。 - 排查:检查
/etc/netplan/目录下是否有其他优先级更高的文件(数字编号更小的),或者查看/etc/cloud/cloud.cfg.d/下的配置。 - 解决:
- 对于云服务器,可能需要在其控制台面板配置静态IP,或者修改cloud-init的配置禁用网络配置。
- 对于本地安装,确保你修改的是正确的、最终会被读取的netplan文件。可以暂时将其他
.yaml文件备份后移走,只保留你修改的那一个。
6. 高级技巧与维护建议
6.1 使用netplan命令进行调试
netplan提供了一些有用的调试命令:
sudo netplan generate:仅生成后端配置,不应用。可以检查生成的文件是否正确,它们通常位于/run/systemd/network/或/etc/networkd-dispatcher/。sudo netplan --debug apply:在应用时显示详细的调试信息,对排查复杂问题非常有帮助。networkctl status <接口名>:查看systemd-networkd对特定接口的管理状态和详细日志。
6.2 配置绑定(Bonding)与桥接(Bridging)
对于需要网络冗余或特殊网络拓扑的场景,netplan也支持高级配置。
网络绑定(Bonding)示例:将两个物理网卡ens33和ens34绑定为一个逻辑接口bond0,实现负载均衡或故障转移。
network: version: 2 renderer: networkd bonds: bond0: interfaces: [ens33, ens34] parameters: mode: active-backup # 模式:主备 primary: ens33 addresses: [192.168.1.100/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8]桥接(Bridging)示例:创建一个桥接接口br0,将物理网卡ens33加入桥接,用于宿主机与虚拟机之间的网络。
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no # 物理网卡本身不配置IP bridges: br0: interfaces: [ens33] # 将物理网卡加入桥接 addresses: [192.168.1.100/24] routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8] parameters: stp: false # 对于简单网络可以关闭生成树协议6.3 配置的版本控制与自动化
服务器配置应该被纳入管理。对于netplan配置,我建议:
- 备份:每次重大修改前,使用
cp命令备份配置文件。 - 版本控制:将
/etc/netplan/目录下的配置文件纳入Git仓库管理。可以在本地机器上建一个仓库,将服务器上的配置文件通过scp拉取回来进行版本记录。 - 自动化部署:结合Ansible、SaltStack等配置管理工具,可以编写Playbook或State文件来统一管理和推送
netplan配置到多台服务器,确保环境一致性。
配置静态IP是服务器管理的基本功,而netplan作为Ubuntu现代网络管理的入口,其清晰的YAML语法和声明式理念值得掌握。从最初的抵触到现在的熟练使用,我感觉最大的好处是配置变得一目了然,排错也有了清晰的路径。记住几个关键点:永远先netplan try再做apply;YAML缩进用空格;远程操作时,在try的等待期内快速测试ping和curl。把这些流程固化下来,以后无论遇到单网卡还是多网卡,简单路由还是复杂绑定,你都能从容应对。