ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

Ubuntu手动配置静态IP指南:Netplan详解与常见坑

2026/9/29 15:38:14 拓冰建站 浏览量
Ubuntu手动配置静态IP指南:Netplan详解与常见坑 1. 为什么需要手动配置静态IP1.1 DHCP带来的麻烦刚装好Ubuntu或者从虚拟机模板克隆了一台机器满心欢喜地插上网线然后执行ip addr一看IP是192.168.1.100过几天重启之后可能变成了192.168.1.105。远程SSH连接突然断掉或者你自己都记不清机器到底被分到了哪个地址。这就是DHCP的典型连锁反应。DHCP本身不是坏事它负责自动下发IP、网关、DNS适合普通上网场景。但问题是DHCP地址有租期客户端续约失败、网络拓扑变化、虚拟机快照回滚都可能让地址漂移。对于服务器、开发板、虚拟机集群甚至只是家里需要固定访问的NAS或树莓派IP一变就意味着所有依赖它的服务、脚本、端口转发全乱套。我这里遇到的真实例子是给一台24小时跑的Ubuntu开发机配了固定端口转发结果一次断电重启后DHCP给它重新分配了另一个地址转发全部失效。排查了半天最后才意识到是IP变了。从那以后我所有常驻设备全部改静态IP省心非常多。1.2 静态IP的典型适用场景什么时候值得折腾静态IP首先要看你的使用环境。服务器和NAS肯定要静态IP端口映射、反向代理、SSL证书续期全都要靠IP作为锚点。开发场景里用SSH连接远程开发机、做嵌入式开发板与主机之间的网络通信IP每次变都会打断你的调试。还有一些内部服务比如自建的Git服务、DNS拦截、打印服务都需要客户端能稳定找到它。虚拟机环境更需要注意。VMware Workstation或VirtualBox默认NAT模式下虚拟机的IP通常是192.168.x.x网段内的随机地址重启或者虚拟机快照回滚很容易变化。虽然可以通过端口转发规避但不如直接把虚拟机网络设为桥接并配静态IP让它和宿主机在同一局域网内访问、调试都方便。我没有说DHCP完全不能用在家庭无线网络、临时实验环境、大量终端接入的场景下DHCP仍然是首选。静态IP只适合数量有限、需要稳定互访的主机。配置前先想清楚你真有固定访问它的需求吗如果只是临时跑个测试DHCP加地址池预留就够用了没必要把每台机器都改成静态。1.3 配置之前你需要收集哪些信息静态IP不是随便填一个地址就行配置之前必须收集完整参数。需要知道四样东西IP地址、子网掩码或子网前缀长度、网关、DNS服务器。很多新手只改IP和网关结果能ping通网关却上不了网大概率就是DNS没配对。具体怎么收集在还处于DHCP状态时先用ip route看默认路由通常形如default via 192.168.1.1 dev ens33这里的192.168.1.1就是网关。然后看/etc/resolv.conf或者用resolvectl status能看到当前DNS。子网则是根据你所在网段推断一般家庭网络是192.168.1.0/24企业内网可能更复杂如果是10.x.x.x的私有网段子网掩码可能是255.255.255.0也可能是255.255.0.0务必向网络管理员确认。给一个最常用的换算方法255.255.255.0就是/24也就是最多容纳254个主机255.255.0.0是/16。在Netplan配置文件里地址直接写“IP/前缀长度”这种CIDR格式比如192.168.1.50/24。很多人第一次看到这个会愣一下其实它就是子网掩码的简化写法理解之后很简单。确保静态IP不会被网关分配给别人建议在路由器或DHCP服务器上设置IP-MAC绑定或者在DHCP地址池范围之外选一个地址。否则路由器的DHCP不知道你占用了这个地址过几天可能就把同一个地址分给别的设备然后两个设备开始互相冲突时通时断极难排查。2. Ubuntu网络配置方式的前世今生2.1 /etc/network/interfaces为何不够用了在Ubuntu 16.04及更早版本里配置静态IP的标准做法是编辑/etc/network/interfaces。大概写成这样auto eth0 iface eth0 inet static address 192.168.1.50 netmask 255.255.255.0 gateway 192.168.1.1 dns-nameservers 223.5.5.5这套配置简单直观但有个问题它是基于旧的ifupdown工具链构建的链路状态变化、热插拔网卡、多网卡编排都支持得不太好。从Ubuntu 18.04开始系统默认引入了Netplan来替代它如果还去改/etc/network/interfaces会发现改了之后要重启网络服务也很别扭因为18.04以后默认用的是systemd-networkd和networkd-dispatcher。当然/etc/network/interfaces没有完全消失如果你强行安装了ifupdown它仍然能用。但对于18.04及以上版本官方推荐做法是使用Netplan。我自己的习惯是新系统一律走Netplan老系统如果不是为了兼容历史脚本也不会去碰interfaces文件。2.2 Netplan的YAML结构入门Netplan通过一个YAML文件来描述网络接口的期望状态然后把它转换成后端配置systemd-networkd或NetworkManager。默认配置文件放在/etc/netplan/目录可能是/etc/netplan/01-netcfg.yaml、/etc/netplan/50-cloud-init.yaml或/etc/netplan/00-installer-config.yaml不同安装方式文件名不太一样但目录都一样。YAML文件的缩进是你成败的关键多一个空格或少一个空格都会导致解析失败。Netplan要求的缩进通常是两个空格不要用Tab。我见过有人用Tab缩进配置结果每次netplan apply都报错删掉重写才恢复正常。一个最小静态IP配置长这样network: version: 2 ethernets: ens33: dhcp4: no addresses: - 192.168.1.50/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [223.5.5.5, 114.114.114.114]这个配置告诉系统ens33网卡关闭DHCPv4手动设置地址为192.168.1.50/24默认路由走192.168.1.1DNS使用两个公共DNS。这个结构非常实用我们后面会逐行拆解。2.3 桌面版用户还需要知道NetworkManager如果你安装的是Ubuntu Desktop20.04/22.04桌面版在图形界面里配置静态IP其实更符合直觉。右键点击右上角网络图标进入“有线设置”选中当前连接然后点IPv4选项卡把“自动(DHCP)”改成“手动”填上地址、掩码、网关和DNS即可。但这里有个隐藏的坑Netplan和NetworkManager可能同时存在。桌面版默认由NetworkManager管理网络如果你手动改/etc/netplan应用之后可能不会生效因为Netplan生成的配置会交给NetworkManager但NetworkManager是否接管你的网卡取决于版本和具体配置。最稳妥的做法是在桌面环境用GUI配置在无桌面服务器环境用Netplan配置两者不要混用。如果你在某个服务器环境里看到/etc/netplan没有生效先用netplan get看当前实际生效的配置再用networkctl status看网卡状态这样才能定位问题。3. 手把手配置Netplan静态IP核心实操3.1 先摸清网卡现状动手之前先看几样东西。第一个是网卡名称用ip addr或ip link查看注意名称可能是ens33、enp0s3、eth0也可能是wlan0无线网卡。不同虚拟机和物理机的命名规则不一样千万别照抄我这里的ens33要以你自己机器上显示为准。第二个是当前IP地址你要在DHCP没收回之前拿到当前网段的参考地址。第三个是网关信息用ip route show default看默认网关。第四个是DNScat /etc/resolv.conf或resolvectl status。我一般会顺手把这些信息记在临时文件里ip addr ip route show default cat /etc/resolv.conf然后确认要改的网卡不是正被SSH会话使用的唯一链路。如果你是通过SSH远程操作的静态IP配置一旦出错连接可能立刻断开然后你就进不了系统了。保险起见先确保你有本地控制台访问权限或者提前把新IP也配置成可通过物理机访问再逐步应用配置。3.2 编辑Netplan配置文件的正确姿势找到配置文件后别急着大改先备份再动sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.bak备份永远是第一步尤其是你之前尝试过其他配置方法、或者系统里已经有复杂的网络文件时。出错时恢复文件比从零排查轻松太多。然后用编辑器打开配置文件sudo vim /etc/netplan/01-netcfg.yaml推荐用vim或nano如果你是新手nano更友好一些。原始的Ubuntu 18.04服务器版配置文件默认内容可能只有几行network: version: 2 ethernets: ens33: dhcp4: true我们要把它改成静态配置。如果目标机器只需一个静态IP那配置非常简单。但我建议一次配置时把DNS和路由都写完整避免后续漏配导致断网问题的排查。修改后的完整配置如下network: version: 2 ethernets: ens33: dhcp4: no dhcp6: no addresses: - 192.168.1.50/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 114.114.114.114这里有一个细节dhcp6: no是可选但建议的避免IPv6 DHCP干扰。routes里写default表示默认路由via是网关。nameservers是域名服务器列表如果你需要内网解析可以把内网DNS放在最前面比如10.10.10.1然后再放公网DNS作为备用。每个人可能看到其他教程里写成单行addresses: [192.168.1.50/24]YAML里这是等价的。但如果你后面要添加第二个IP多行列表更便于维护addresses: - 192.168.1.50/24 - 192.168.1.51/24随便提醒一句YAML文件里的network:后面必须是一个空格再换行ethernets:同样如此接口名后面是冒号加换行。很多人在这一步漏了空格导致解析失败。3.3 应用配置并验证是否成功保存文件后执行sudo netplan apply这一步会把配置下发到后端。正常情况下没有任何输出直接回到命令行提示符。如果配置写错了你能立刻看到报错信息。这时候别慌按错误提示逐行检查或者直接恢复备份sudo cp /etc/netplan/01-netcfg.yaml.bak /etc/netplan/01-netcfg.yaml应用成功后用以下命令验证ip addr show ens33 ip route show default ping -c 4 192.168.1.1 ping -c 4 223.5.5.5先ping网关再ping外部IP再ping域名比如ping baidu.com。如果网关通、外部IP不通基本就是网关或NAT问题如果外部IP通、域名不通那就是DNS问题。这个排查顺序屡试不爽。验证通过后重启一次再跑ip addr确认地址还在。静态IP配置正常情况下是持久化的不会因为重启漂移。到这里一次完整的Netplan静态IP配置就算成功了。4. 常见问题排查与避坑指南4.1 netplan apply报错“YAML解析错误”最常见的错误是yaml: line 3: did not find expected key或类似内容。原因无外乎缩进不对、冒号后没空格、列表项的短横线格式不对等。我的经验是每次写配置文件时保持只有空格缩进并且统一为两个空格。在vim里可以用:set tabstop2 shiftwidth2 expandtab确保Tab键被替换为空格。写完之后可以先用以下命令验证语法sudo netplan trynetplan try是个非常好用的命令它会在超时前应用配置如果超时或者你按Enter确认配置才会生效如果配置有问题网络会在120秒后自动回滚。这比直接netplan apply安全得多特别适合远程SSH场景。我远程改配置时几乎必用netplan try应用配置后还能保住SSH会话。如果你已经把配置弄坏且无法恢复必须进服务器本地控制台在系统启动时进入GRUB safe mode或者recovery mode然后手动把配置文件改回来。这个操作非常痛苦所以再次提醒每次改动前一定要备份远程操作更要多做一步netplan try。4.2 配置后能ping通网关却上不了网这种情况99%是DNS或NAT问题。先用ping 223.5.5.5测试外部IP如果不通说明出网路由或网关有问题。看看网线、交换机端口、防火墙或者排查宿主机开没开网络转发。如果是VMware NAT模式网关通常不是192.168.1.1而是VMware生成的虚拟网关如192.168.xxx.1或192.168.xxx.2按ip route查看即可。如果外部IP通、域名不通那就检查/etc/resolv.conf里的DNS确认nameserver地址是不是有效DNS。有时候Netplan配置写对了但resolv.conf被某个工具改写过比如cloud-init或NetworkManager导致实际生效的DNS不是你想用的。可以用resolvectl status看当前生效的DNS再用systemd-resolve --flush-caches清一下DNS缓存。还有一种容易被忽略的原因静态IP和网关不在同一个子网。比如你设置IP为192.168.1.50/24网关却是192.168.2.1那么系统会认为网关不可达。配置时务必确保地址和网关处于同一网段。4.3 虚拟机桥接模式下的静态IP配置如果你用VMware Workstation或VirtualBox跑Ubuntu想让虚拟机获得和宿主机同网段的地址网络模式需要选“桥接模式”而不是默认的NAT模式。桥接模式下虚拟机相当于局域网里的一台独立主机你的静态IP需和宿主机在同一IP段并确保没有其他人占用。配置完成后马上测试从宿主机ping虚拟机再反过来ping一下宿主机。如果宿主机ping不到虚拟机可能是虚拟机的防火墙运行sudo ufw status看看也可以临时关闭防火墙测试。在VMware中如果重启虚拟机后IP还是不变通常是因为你的Netplan配置写对了但虚拟机里同时启用了NetworkManager导致冲突。桥接和NAT的差别我列个表网络模式虚拟机地址范围能否被外部设备直接访问常见用途NAT宿主机虚拟出的一块私有网段不能直接访问需要端口转发仅需虚拟机上网、不需要外部访问桥接与宿主机同一局域网能直接访问开发调试、服务器、摄像头服务Host-Only只能在宿主机和虚拟机组内部访问不能被外部网络访问隔离测试环境如果在VMware桥接模式下总是不通先检查VMware的“虚拟网络编辑器”确认你选择了正确的物理网卡比如有线网卡或无线网卡。无线桥接模式下有时会有一些延迟但一般可用。Windows宿主的防火墙也可能拦截虚拟机流量可以通过关闭防火墙测试也可以添加入站规则放行。4.4 网卡名称漂移与静态IP的冲突有些系统里网卡名称是enp0s3有些是ens33有些是eth0。如果你的机器有多个网卡或者用U盘启动/克隆系统网卡名称可能会变。一旦网卡名称变了你原来在Netplan里写的ens33指向的配置就不生效了系统会回到DHCP或者干脆没有地址。解决方式是尽量使用已存在的网卡名称而不是靠猜。如果你发现自己写好的配置不生效且网卡名称匹配不上先删掉旧的eth0残留配置再确认当前名称。Ubuntu 18.04及之后默认使用基于固件/拓扑的命名规则也就是en*开头。如果你希望统一为旧的eth0可以在GRUB里加net.ifnames0 biosdevname0参数但这会影响多网卡识别不建议作为首选解决方式。更好的办法是写配置前先用ip link确定网卡名称再做配置而不是照抄教程。如果你需要在多台机器上统一配置也可以考虑使用systemd.link做更细粒度的命名管理但那又增加了一层复杂度对大多数人没必要。4.5 桌面版系统里“改了Netplan却不生效”桌面版Ubuntu的默认网络管理是NetworkManager如果你在/etc/netplan里配好静态IP执行netplan apply后很可能发现IP还是DHCP自动分配的。原因就是Netplan生成的配置交给了NetworkManager但NetworkManager可能认为它自己管着这块网卡于是把你的配置覆盖了。解决思路有几条第一种在桌面版里直接使用Ubuntu的图形界面配置静态IP省心且稳定。第二种如果你坚持用Netplan需要把网卡配置的renderer指定为NetworkManager例如network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: no addresses: - 192.168.1.50/24这样Netplan会把配置交给NetworkManager执行GUI里也能看到实际生效的参数。第三种在需要稳定网络连接的场景里就安装server版镜像尽量避免桌面环境干扰。大多数人在桌面环境的误区是一边在GUI里改了手动IP一边又去改Netplan两边信息不一致。最后结果是重启后系统里Netplan先应用然后NetworkManager又叠加了GUI配置状态非常混乱。我的建议是选一条路径走到底不要交叉。5. 进阶临时静态IP与版本差异化处理5.1 用ip命令做临时静态IP如果只是想临时改一下IP不想动配置文件可以用ip命令直接设置。做法如下sudo ip addr add 192.168.1.60/24 dev ens33 sudo ip route add default via 192.168.1.1这套命令立刻生效但重启后会丢失适合测试、调试、临时应急。注意ip addr add是“追加”一个地址如果原来有DHCP分配的其他地址两个地址会同时存在路由表也可能会出现多条默认路由。如果你希望清掉原来的地址可以sudo ip addr del 192.168.1.100/24 dev ens33但删地址有风险可能会把当前SSH会话的地址删掉导致断连。建议只在本地控制台操作或者清楚自己IP情况时再删。补充一个DNS临时修改技巧直接写/etc/resolv.conf是不行的因为Ubuntu 18.04后的resolv.conf是指向systemd-resolved的软链接手工改可能会被覆盖。临时改DNS可以用resolvectlsudo resolvectl dns ens33 223.5.5.5 114.114.114.114这条只影响当前会话重启后恢复。对于临时调试相当好用。5.2 16.04迁移到18.04的心态准备如果你是从Ubuntu 16.04迁移过来的老用户必须接受一个事实/etc/network/interfaces的配置方式在18.04及以后已经是非主流了。虽然可以通过安装ifupdown回退但那不符合系统默认工作机制。以后你看到任何旧文档写“修改interfaces后重启网络”大概率在18.04上无效。具体迁移时只需要把现有的静态IP参数翻译成Netplan格式。比如16.04配置里有address、netmask、gateway、dns-nameservers四个字段对应Netplan里是addresses斜杠前缀、routes、nameservers。换算子网掩码是最需要小心的有些文档给的netmask是255.255.255.128这种你需要换算成CIDR前缀长度比如255.255.255.128就是/25少了一个地址位就可能导致整个配置错乱。我自己迁过一个老服务从16.04升到20.04除了把接口配置从interfaces改成Netplan外连DNS都从dns-nameservers改成了nameservers.addresses。改完后用netplan apply一步到位没有额外踩坑。5.3 多网卡多静态IP的配置模板有些场景需要给一台机器配置多个IP比如一个内网地址用于集群通信一个外网地址用于公网服务。在Netplan里这样写network: version: 2 ethernets: ens33: dhcp4: no addresses: - 10.0.2.50/24 - 192.168.1.50/24 routes: - to: default via: 10.0.2.1 nameservers: addresses: [223.5.5.5, 114.114.114.114]这时需要注意路由策略默认网关只能有一个谁在routes里写to: default谁就是主路由。如果两个网卡都在使用你可能要写更细的路由例如routes: - to: 172.16.0.0/16 via: 192.168.1.1 - to: default via: 10.0.2.1这表明只有172.16.0.0/16网段走第一个网关其他流量都走默认网关。如果你对路由表不熟建议先单独配好一张网卡再用ip route观察默认路由变化。多网卡配置最容易出的问题是所有网卡都设了默认路由导致数据包乱走ping外网时通时不通。解决办法就是只保留一条默认路由其余走策略路由或静态路由。这部分属于服务器运维进阶普通家用单网卡暂时用不到但掌握之后对理解Linux网络会有很大帮助。关于静态IP配置的几点亲身体会前面把Netplan和静态IP的大概脉络聊完了我这里再补充几句个人的操作习惯。第一远程配置静态IP时永远先跑sudo netplan try再跑sudo netplan apply如果netplan try中途卡住等它自动回滚就好这功能救过我很多次。第二每次改配置必须备份原文件哪怕是同一个文件改来改去备份版本号也建议保留这样回溯问题很方便。第三配置完成后一定要做完整验证不要只看ip addr就收工至少ping一下网关、外网IP、域名确认网络路径真的没问题。最后一个小技巧配置静态IP后记得在路由器的DHCP设置里给这个IP做MAC绑定或把地址排除出地址池否则我还是会遇到之前所说的地址冲突问题依然可能发生。网络配置类问题最磨人的就是这种间歇性故障能预防就提前预防。