1. 为什么固定 IP 这件事值得认真对待
很多人第一次接触“给 Ubuntu 配固定 IP”,都是被逼出来的:远程连着的开发机重启后地址变了,SSH 连不上;家里跑着的小服务,路由器一重启,局域网里其他设备就找不到它;实验室里几台机器互相调用接口,地址一漂移,配置文件全得跟着改。这些场景的共同点是——地址不稳定,上层的一切都跟着不稳定。
固定 IP 地址,说白了就是让一台机器在网络里拥有一个“不会变的门牌号”。它解决的核心问题是可预期性:你知道它在哪里,别的设备也知道它在哪里,配置、脚本、文档、监控全都可以围绕这个确定的地址来写。适合看这篇内容的人大致分三类:一是刚接触 Linux、需要在虚拟机或实体机上做网络实验的新手;二是手里有几台服务器或开发板、需要稳定内网地址的开发者;三是负责小规模网络环境、需要把地址规划讲清楚的人。不管你属于哪一类,下面这套思路和操作都能直接拿去用。
需要先明确一个前提:Ubuntu 从 17.10 开始,桌面版和服务器版的网络管理都转向了Netplan,早期的/etc/network/interfaces那套写法在新版本上已经不再生效。网上大量老教程还在教改 interfaces 文件,照着做往往毫无反应,这是新手踩得最多的第一个坑。所以本文以 Netplan 为主线,同时把“图形界面配置”和“传统方式”作为对照讲清楚,让你在不同版本、不同环境下都能对上号。
另外要区分两个概念:静态 IP和固定 IP。严格说,静态 IP 是你在机器上手工写死地址;固定 IP 还可以通过路由器上的地址保留(DHCP 保留)来实现,机器本身仍然走动态获取。两种做法各有适用场景,后面会专门对比。理解这个区别,能帮你少走很多弯路。
2. 动手之前:把网络参数先摸清楚
2.1 先搞清楚你现在的网络长什么样
配置固定 IP 最忌讳上来就改文件。你得先知道当前网络是怎么工作的:网卡叫什么、现在拿的是什么地址、网关是谁、DNS 用的什么。这些信息是后面填配置的原料,填错了轻则上不了网,重则连本机都失联。
在 Ubuntu 上查看网络信息,最直接的是这几条命令:
ip addr show ip route show resolvectl statusip addr show会列出所有网卡和它们当前的地址。你要重点关注那个有地址、状态是UP的网卡,名字可能是ens33、enp0s3、eth0之类。ip route show里的default via后面跟的就是网关地址。resolvectl status能看到当前生效的 DNS 服务器。
提示:如果你是通过 SSH 远程操作这台机器,改网络配置前务必先确认你有本地控制台或其他备用登录方式。配置写错导致网络中断时,远程连接会直接断掉,没有备用通道就只能去物理机前处理了。
把这些信息记下来,最好抄在纸上或另存一个文本文件。后面写 Netplan 配置时,网卡名、网关、DNS 都要原样填进去。
2.2 地址规划:别随手挑一个就用
固定 IP 不是随便写个数字就行,它必须落在你所在网段的合理范围内,并且不能和别的设备冲突。这里有个简单的判断方法:看你当前动态获取到的地址,比如是192.168.1.105,子网掩码255.255.255.0,那这个网段就是192.168.1.0/24,可用地址范围大致是192.168.1.1到192.168.1.254。
选地址时有几条经验:
- 避开 DHCP 地址池。大多数路由器的动态分配范围是
100到200这一段,你把固定地址选在2到99或者201到254之间,冲突概率会低很多。 - 避开网关和已占用地址。网关通常是
.1或.254,别去占。选好之后可以先ping一下目标地址,有回应说明已被占用,换一个。 - 同一网段内保持规划一致。如果你有多台机器,建议按用途分段,比如服务器用
10到30,开发机用31到60,以后排查问题一目了然。
子网掩码和网关必须和所在网络一致,这个不用自己算,照抄当前动态获取的值即可。DNS 可以填网关地址(很多路由器自带转发),也可以填公共 DNS,比如223.5.5.5和119.29.29.29这类国内常用的解析服务,延迟低、稳定性好。
2.3 确认 Netplan 的存在与配置文件位置
动手前先确认系统用的是 Netplan:
ls /etc/netplan/正常情况下会看到类似01-network-manager-all.yaml或50-cloud-init.yaml的文件。这个目录下的 YAML 文件就是网络配置的入口。不同安装方式生成的文件名不一样,桌面版常见01-network-manager-all.yaml,服务器版或云镜像常见50-cloud-init.yaml。
注意:不要自己随便新建一个名字奇怪的文件,也不要同时保留多个互相冲突的配置文件。Netplan 会按文件名字典序依次加载,后加载的会覆盖前面的同名配置,多个文件写同一块网卡很容易出现“改了没生效”的怪现象。最稳妥的做法是在现有文件上改,或者新建一个编号靠后的文件并确保旧文件里没有冲突配置。
3. Netplan 配置固定 IP 的完整实操
3.1 配置文件的结构长什么样
Netplan 的配置是 YAML 格式,缩进极其敏感,只能用空格,不能用 Tab。这是新手翻车的高发区,一个 Tab 就能让整个文件解析失败。整体结构大致是三层:network下面分version、renderer、ethernets,ethernets下面挂具体网卡名,网卡下面再写dhcp4、addresses、routes、nameservers等。
先看一个最典型的静态地址配置模板:
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: - 192.168.1.50/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [223.5.5.5, 119.29.29.29]逐行解释一下为什么这么写。version: 2是 Netplan 的配置版本,固定写 2。renderer指定后端,服务器版一般用networkd,桌面版如果网络由图形界面管理则用NetworkManager,这个后面单独说。dhcp4: no表示关闭 IPv4 的动态获取,这是启用静态地址的前提。addresses里写地址时要带上前缀长度,/24就等价于子网掩码255.255.255.0,这个斜杠写法必须带上,只写 IP 不写前缀会报错。
routes这一段是重点,也是新旧写法差异最大的地方。老版本 Netplan 用gateway4: 192.168.1.1来指定网关,但新版本已经弃用这个字段,改用routes列表,to: default表示默认路由,via后面跟网关地址。如果你照着老教程写gateway4,在新系统上会收到弃用警告甚至直接不生效。
nameservers里的addresses用方括号加逗号的形式写多个 DNS,这是 YAML 的行内数组写法,等价于换行加短横线的列表形式。两种写法都行,看你习惯。
3.2 一步步改配置并应用
假设你的网卡叫ens33,要设的地址是192.168.1.50/24,网关192.168.1.1,DNS 用两个公共地址。完整操作流程如下。
第一步,备份原配置。这一步别省,改坏了能一键还原:
sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak第二步,编辑配置文件。用你顺手的编辑器,比如nano或vim:
sudo nano /etc/netplan/01-network-manager-all.yaml把内容改成前面模板的样子,注意网卡名换成你自己的,地址、网关、DNS 换成你规划好的值。改完保存退出。
第三步,先做语法检查再应用。Netplan 提供了生成预览的命令,能在真正生效前发现格式问题:
sudo netplan generate这条命令只做解析和生成后端配置,不会立刻改动网络。如果它报错,说明 YAML 格式或字段有问题,根据提示改到不报错为止。常见报错是缩进不对、冒号后面没空格、用了 Tab。
第四步,应用配置:
sudo netplan apply执行后网络会短暂中断再恢复。如果是本地操作,稍等几秒用ip addr show确认地址已经变成你设置的固定值;如果是远程操作,连接可能会断一下,重连后验证。
提示:
netplan apply在某些环境下不会立刻刷新所有状态,如果发现地址没变,可以试着重启网络服务,或者直接重启机器确认。另外,应用后一定要立刻验证连通性,别等到下次重启才发现问题。
3.3 验证:三个层面确认配置真的生效
配置应用完,别急着关终端,按三个层面验证一遍才算稳。
第一层,看地址本身。ip addr show ens33应该显示你设置的192.168.1.50/24,并且状态是UP。如果还是旧地址或者没有地址,说明配置没生效,回去检查文件。
第二层,看路由。ip route show里应该有一条default via 192.168.1.1的记录。没有默认路由的话,机器能通内网但上不了外网,这是很典型的“半通”故障。
第三层,看实际连通性。先ping 192.168.1.1测网关,再ping 223.5.5.5测外网 IP 连通,最后ping www.example.com测 DNS 解析。三步都通,说明地址、路由、DNS 全部正常。哪一步断了,问题就定位在哪一层,排查起来非常快。
4. 桌面版与特殊环境的差异化处理
4.1 桌面版:图形界面和 Netplan 的关系
Ubuntu 桌面版的网络默认由 NetworkManager 管理,图形界面右上角的网络图标点开就能设置。很多人图省事直接在图形界面里填静态地址,这当然可以,但要知道它和 Netplan 是两套东西。桌面版的 Netplan 配置文件里renderer通常写的是NetworkManager,意思是“把配置交给 NetworkManager 去执行”。
如果你在图形界面里改了地址,实际上改的是 NetworkManager 的连接配置,Netplan 文件可能并没有同步更新。这就导致一个常见困惑:图形界面里看着是固定地址,但换个方式查看又对不上。我的建议是二选一,别混着来。要么全程用图形界面,简单直观;要么全程用 Netplan 文件,可控性强、便于批量复制。混用容易出现“改了这边那边覆盖”的情况。
图形界面的操作路径大致是:点网络图标,进入有线设置,找到当前连接,把 IPv4 方式从“自动”改成“手动”,填入地址、掩码、网关、DNS,保存后重新连接即可。这套流程对新手最友好,缺点是配置不集中、不好备份和迁移。
4.2 服务器版与云环境:小心 cloud-init 覆盖你的配置
服务器版和云镜像里,经常能看到50-cloud-init.yaml这个文件。它由 cloud-init 在首次启动时生成,作用是初始化网络。问题在于,cloud-init 在某些配置下会在每次启动时重新生成这个文件,你手工改的内容可能被覆盖回去。
判断方法很简单:改完配置、重启一次,再看文件内容有没有变回原样。如果被覆盖了,有两个处理方向。一是修改 cloud-init 的网络配置源,让它不再接管网络;二是干脆新建一个编号更靠后的 Netplan 文件(比如99-custom.yaml),把静态配置写进去,同时确保 cloud-init 生成的文件里不再包含冲突的网卡配置。后一种做法改动小、风险低,我更常用。
注意:云环境里改网络要格外谨慎,很多云主机的地址是由平台侧分配的,擅自改成静态地址可能导致机器失联。动手前先确认平台是否允许自定义内网地址,不确定就别改,改用平台提供的地址保留功能更稳妥。
4.3 静态 IP 与 DHCP 保留怎么选
前面提过,固定地址有两条路:机器上写死(静态 IP),或者路由器上做地址保留(DHCP 保留)。两者对比看下面这张表:
| 对比项 | 静态 IP(机器侧配置) | DHCP 保留(路由器侧配置) |
|---|---|---|
| 配置位置 | 每台机器上单独改 | 路由器上集中管理 |
| 地址稳定性 | 高,机器自己说了算 | 高,由路由器保证 |
| 迁移成本 | 换网络要逐台改 | 换网络基本不用动 |
| 冲突风险 | 手工规划不当会冲突 | 由路由器统一分配,冲突少 |
| 适用场景 | 服务器、固定设备、无管理权限的网络 | 家庭、办公网、设备较多且路由器可控 |
我的实际经验是:能改路由器就优先用 DHCP 保留,尤其是设备多、经常增减的环境,集中管理省心得多。只有在拿不到路由器管理权限、或者需要机器完全不依赖 DHCP 服务的场景下,才在机器上写静态地址。两种方式不要同时用,否则容易出现地址冲突或行为不一致。
5. 常见故障排查与避坑清单
5.1 改完上不了网,按这个顺序查
网络配置出问题,最怕东一榔头西一棒子地乱试。按层次从下往上查,效率最高。先看链路层网卡是否 UP,再看地址是否配上,再看路由是否存在,最后看 DNS 是否可用。这个顺序对应 OSI 的下往上,每一层确认没问题再往上走,能快速锁定故障层。
下面这张速查表覆盖了我遇到过的高频问题:
| 现象 | 可能原因 | 排查与解决 |
|---|---|---|
netplan apply报 YAML 错误 | 缩进用了 Tab、冒号后缺空格 | 全部改空格,冒号后加一个空格,用netplan generate预检 |
| 地址没变,还是旧的 | 配置文件没被加载、被其他文件覆盖 | 检查/etc/netplan/下是否有冲突文件,确认改的是生效的那个 |
| 能 ping 通网关,上不了外网 | 缺默认路由 | ip route show确认default via是否存在,检查routes写法 |
| 能 ping 通 IP,域名解析失败 | DNS 没配或配错 | 检查nameservers,用resolvectl status看生效的 DNS |
| 重启后配置丢失 | cloud-init 覆盖 | 新建编号靠后的配置文件,或调整 cloud-init 行为 |
| 地址冲突,时通时断 | 选的地址在 DHCP 池内或已被占用 | 换一个池外地址,配置前先 ping 确认未被占用 |
| 远程连接改完直接断开 | 网关或地址写错 | 提前准备本地控制台,改前备份配置 |
5.2 几个只有踩过才知道的细节
第一个坑是前缀长度写错。有人把/24写成/32,结果机器只能和自己通信,网关都 ping 不通。/24对应255.255.255.0,这是最常见的局域网掩码,写之前对一下。
第二个坑是网关地址和本机地址不在同一网段。比如本机192.168.1.50/24,网关却写成192.168.0.1,路由直接失效。网关必须落在本机地址所在的网段内。
第三个坑是多个配置文件打架。有人改完01-xxx.yaml没生效,又新建了一个02-xxx.yaml,结果两个文件都写了同一块网卡,行为变得难以预测。正确做法是先清理冲突,保证一块网卡只在一个文件里被定义。
第四个坑是忘了关 DHCP。静态地址配了,但dhcp4还是yes,机器可能同时拿到动态地址,出现一个网卡两个地址的怪现象,路由也会乱。静态配置时务必把dhcp4设为no。
第五个坑是改完不验证就重启。有些人改完直接重启,结果起不来了才发现配置有问题。养成习惯:netplan apply之后立刻验证三层连通性,确认没问题再重启做最终确认。
5.3 一个实用的回滚习惯
每次改网络配置前,我都会做两件事:备份原文件,以及在另一个终端里保持一个已知可用的会话(如果是远程)。这样一旦新配置把网络搞挂,我能立刻用备份还原:
sudo cp /etc/netplan/01-network-manager-all.yaml.bak /etc/netplan/01-network-manager-all.yaml sudo netplan apply这个习惯看起来笨,但关键时刻能救命。网络配置属于“改错就失联”的高风险操作,多花十秒备份,能省下半小时甚至更久的折腾。
6. 把配置沉淀成可复用的模板
配置固定 IP 这件事,单次做完就完了,但如果手里有多台机器,每次都从头写一遍既费时又容易出错。我的做法是维护一份带注释的模板,把网卡名、地址、网关、DNS 做成明显的占位符,用的时候替换即可。模板里把每个字段为什么这么写都注释清楚,过几个月回头看也不会忘。
network: version: 2 renderer: networkd # 服务器版用 networkd,桌面版用 NetworkManager ethernets: <网卡名>: # 用 ip addr show 查到的实际网卡名 dhcp4: no # 静态地址必须关闭 DHCP addresses: - <地址>/24 # 前缀长度按实际网段填,/24 最常见 routes: - to: default via: <网关地址> # 必须是本机网段内的地址 nameservers: addresses: [<DNS1>, <DNS2>]用模板的时候,替换占位符后先跑netplan generate预检,再netplan apply应用,最后按地址、路由、DNS 三层验证。这套流程走顺了,一台机器从改配置到验证完成,两三分钟就能搞定。
我个人在实际操作中的体会是,固定 IP 配置本身并不复杂,真正花时间的往往是“改之前没摸清现状”和“改之后没系统验证”。把第 2 章的现状摸底和第 3 章的验证流程当成固定动作,比记住任何一条命令都管用。另外,遇到网上教程和实际系统对不上时,优先相信系统自带的man netplan和官方文档,那些老博客里的gateway4写法,在新系统上真的会坑人。