1. 项目概述为什么静态IP是服务器和开发环境的基石最近在帮几个朋友配置新的Ubuntu服务器发现一个挺普遍的现象很多人第一次接触Linux服务器尤其是Ubuntu 22.04 LTS这个长期支持版本时对网络配置还是一头雾水。他们最常遇到的问题就是服务器重启后IP地址变了导致之前配置好的远程连接、服务绑定全部失效又得重新折腾一遍。这其实就是动态IPDHCP和静态IP的区别没搞明白。静态IP说白了就是给你的机器在网络里固定一个“门牌号”。对于服务器、NAS、家庭实验室的主机或者任何需要长期稳定提供服务的设备来说这是必须的。想象一下你公司的官网服务器IP天天变域名解析还怎么玩你本地的数据库服务器地址隔三差五换前后端联调岂不是要疯所以设置静态IP不是可选项而是生产环境和严肃开发环境的入门操作。Ubuntu从17.10版本开始引入了一个新的网络配置管理工具叫netplan用它替代了之前我们熟悉的/etc/network/interfaces文件。到了Ubuntu 22.04netplan已经是默认且唯一的推荐方式了。很多老教程还照着interfaces文件去改结果发现根本不生效这就是知识没更新的锅。这篇内容我就以Ubuntu 22.04为例把用netplan配置静态IP的每一步掰开揉碎了讲清楚包括背后的原理、不同场景下的配置以及我踩过的那些坑。目标就一个让你一次配置永久稳定。2. 核心原理与工具解析Netplan为何成为新标准在动手之前我们得先搞清楚手里的工具是什么以及为什么Ubuntu社区要费这么大劲换一套新东西。理解了这个后面配置的时候你才能心里有底出了问题也知道往哪个方向排查。2.1 从ifconfig到Netplan的演进如果你玩Linux有些年头了肯定对ifconfig、/etc/network/interfaces这些命令和文件不陌生。在过去这是配置网络的金科玉律。但它的缺点也很明显配置方式比较底层且高度依赖于发行版。Debian系用interfacesRedHat系用network-scripts管理起来不统一。Netplan的诞生就是为了解决这个碎片化问题。它本身不是一个直接操作网卡的程序而是一个网络配置抽象层。你可以把它理解成一个“翻译官”或者“配置生成器”。我们人类用简洁的YAML格式写下我们想要的网络状态比如IP、网关、DNS然后netplan会根据你系统底层实际使用的渲染器renderer把这些YAML配置“翻译”成对应的后台服务能识别的配置文件。目前netplan支持两种主要的渲染器networkd 使用systemd-networkd来管理网络。这是Ubuntu Server版本的默认选择轻量、高效与systemd集成度深特别适合无图形界面的服务器环境。NetworkManager 这个大家更熟悉常见于Ubuntu Desktop桌面版。它功能强大带图形界面适合需要频繁切换网络如Wi-Fi、有线的桌面环境。注意 绝大多数服务器场景用的都是networkd。如果你在桌面版上做服务器用途也建议切换到networkd以获得更稳定和一致的行为。本文的配置将以networkd渲染器为主。2.2 Netplan的工作流程与核心文件Netplan的配置文件全部存放在/etc/netplan/目录下文件名以.yaml结尾。安装完系统后你通常会看到一个初始文件可能是00-installer-config.yaml通过Ubuntu安装器安装或者01-network-manager-all.yaml等。它的工作流程非常清晰编写 你在/etc/netplan/下创建或修改YAML配置文件。验证 使用sudo netplan try命令来测试配置语法是否正确并且会给你一个回滚的机会。应用 使用sudo netplan apply命令让配置永久生效。这个命令会调用指定的渲染器如systemd-networkd生成最终的底层配置并应用。这个“抽象-渲染”的架构好处很多。首先配置语法统一、简洁YAML格式可读性远胜于旧的脚本式配置。其次它解耦了配置定义和配置实现未来如果底层网络管理工具有变netplan的配置方式可能不需要大变。最后它的try和apply命令提供了安全的应用机制避免了因配置错误导致服务器失联的尴尬。2.3 获取关键网络信息在修改配置之前你必须从当前网络中获取几个关键参数盲猜是行不通的。你需要知道网卡名称 比如ens33,enp0s3,eth0等。期望的静态IP地址 必须在你的局域网网段内且未被其他设备占用。网关地址 通常就是你的路由器内网IP比如192.168.1.1。DNS服务器地址 可以用路由器地址也可以用公共DNS如8.8.8.8和8.8.4.4。打开终端逐一获取查看网卡名称与现有IPip addr show或者用老命令ifconfig可能需要安装net-tools。在输出中找到你正在使用的有线或无线网卡记录其名称如ens33。同时可以看到它当前通过DHCP获取到的IP地址这有助于你确定网段。查看当前网关ip route show default输出中default via后面的IP就是你的网关地址。查看当前DNSsystemd-resolve --status | grep -A5 DNS Servers或者查看/etc/resolv.conf文件注意在netplan管理下这个文件可能是符号链接直接修改它无效。把这些信息记在纸上或文本编辑器里接下来我们就要用它们来填充YAML配置了。3. 静态IP配置实战从基础到高级掌握了原理和信息现在进入实操环节。我会从最基础的单一网卡配置讲起再到多网卡、绑定Bond等复杂场景。每个配置后面都会跟上我的实操心得和避坑指南。3.1 基础配置为单网卡设置静态IP这是最常见的情况。假设你的网卡名是ens33想设置的静态IP是192.168.1.100/24网关是192.168.1.1DNS是8.8.8.8和192.168.1.1。首先备份原始的配置文件一个好习惯sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.backup然后用文本编辑器如nano或vim编辑配置文件sudo nano /etc/netplan/00-installer-config.yaml将文件内容修改为如下所示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, 192.168.1.1]逐行解析与注意事项version: 2 必须声明表示使用Netplan v2的语法。renderer: networkd 指定使用systemd-networkd渲染器。如果是桌面版且想用NetworkManager则改为NetworkManager。ethernets: 定义有线以太网设备。ens33: 你的具体网卡设备名这里一定要写对写错了配置不会生效。addresses: 指定IP地址和CIDR格式的子网掩码。/24对应子网掩码255.255.255.0。你可以配置多个IP用列表形式。routes: 路由配置。to: default表示默认路由即所有非本网段的流量都走这条路由via后面跟网关地址。nameservers: DNS服务器配置。addresses是一个列表可以填多个DNS系统会按顺序查询。关键一步测试与应用配置千万不要直接apply先用try命令它会应用配置并等待你确认。如果配置正确网络会在短暂中断后恢复。如果配置有误比如网关写错在倒计时结束前你没有按回车确认它会自动回滚到之前的配置救你于水火。sudo netplan try你会看到类似提示“Press ENTER before the timeout to accept the new configuration”。等待几十秒如果网络连接没有断或者断了但你能通过新IP连上按回车确认。如果失联了别按回车等它超时自动回滚。确认无误后或者try成功了再使用apply命令使其永久生效sudo netplan apply最后验证一下ip addr show ens33 # 查看IP是否已变 ping -c 4 8.8.8.8 # 测试外网连通性 nslookup google.com # 测试DNS解析实操心得子网掩码的写法 Netplan只支持CIDR格式如/24不支持传统的点分十进制如255.255.255.0。如果你不熟悉CIDR记住常见对应关系/24255.255.255.0/16255.255.0.0/8255.0.0.0。YAML语法严格 YAML对缩进非常敏感必须使用空格不能使用Tab键。建议每次缩进用2个空格。冒号:后面要跟一个空格。列表项以-开头的缩进要对齐。桌面版的特殊性 如果你在Ubuntu Desktop上操作并且renderer是NetworkManager配置生效后你可能会在图形界面的网络设置里看到连接变成了“手动”模式。这是正常的不要又在图形界面里点“自动(DHCP)”否则会覆盖你的netplan配置。3.2 多网卡与复杂网络配置一台服务器上有多块网卡是很常见的比如一块用于管理带外一块用于业务数据。Netplan可以很清晰地管理它们。场景一双网卡不同网段假设ens33连接内网管理段192.168.1.0/24ens34连接业务网段10.0.0.0/24。network: version: 2 renderer: networkd ethernets: ens33: addresses: - 192.168.1.101/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [192.168.1.1] ens34: addresses: - 10.0.0.100/24 # 业务网卡可能不需要默认网关或者需要指向特定的网关 # routes: # - to: 10.0.0.0/24 # via: 10.0.0.1这里ens34没有设置默认路由所有去往非10.0.0.0/24网段的流量依然会走ens33的默认路由。你可以通过ip route命令查看详细的路由表。场景二网卡绑定BondingBonding能将多个物理网卡聚合成一个逻辑网卡提供冗余或负载均衡。这是提高网络可靠性的重要手段。这里以最常用的模式4802.3ad动态链路聚合为例需要交换机支持。network: version: 2 renderer: networkd bonds: bond0: interfaces: [ens33, ens34] parameters: mode: 802.3ad mii-monitor-interval: 100 # 毫秒 lacp-rate: fast addresses: - 192.168.1.200/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: [8.8.8.8]配置完成后bond0就是一个虚拟网卡拥有一个IP。即使ens33或ens34其中一根线断了网络依然通畅。避坑指南多网卡路由冲突这是配置多网卡时最容易踩的坑。当两个网卡都配置了default路由时系统会出现两个默认网关导致路由混乱网络时通时断。原则 一个系统通常只应有一个默认网关to: default的路由。排查 使用ip route show或netstat -rn查看路由表确认是否存在多个default条目。解决 在Netplan配置中确保只有一张需要访问外网的网卡设置了to: default的路由。其他网卡只配置IP和其所在网段的特定路由如果需要的话。3.3 桌面版NetworkManager渲染器配置差异如果你在Ubuntu Desktop上并且希望继续使用NetworkManager的图形界面功能比如方便地连接Wi-Fi那么渲染器应设为NetworkManager。配置语法有细微差别。编辑/etc/netplan/01-network-manager-all.yaml典型文件名network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: no addresses: - 192.168.1.150/24 gateway4: 192.168.1.1 # 注意networkd用routesNetworkManager有时可用gateway4 nameservers: addresses: [8.8.8.8]重要区别对于NetworkManager除了routes写法有时也可以使用gateway4IPv4网关和gateway6IPv6网关这个更直观的键。但请注意gateway4/gateway6在未来版本中已被标记为弃用推荐统一使用routes列表的写法以保持兼容性。配置应用后sudo netplan apply你需要在NetworkManager的图形界面里将对应连接如“有线连接 1”的IPv4方法从“自动(DHCP)”手动改为“手动”并填入IP、网关、DNS。或者更推荐的做法是直接让netplan管理一切在图形界面里设置为“自动(仅地址)”或完全忽略图形界面。因为通过图形界面修改的设置可能会在下次重启时与netplan的配置产生冲突。使用nmcli命令NetworkManager的命令行工具可以更强大地管理连接但前提是配置由NetworkManager接管。我的建议是对于用作服务器的桌面版系统不如一劳永逸将渲染器改为networkd这样行为就和服务器版完全一致减少了不确定性。可以通过修改renderer并安装systemd-networkd相关包来实现。4. 深度排错与疑难杂症解决配置静态IP后网络不通别慌按照下面的排查流程一步步来大部分问题都能定位。4.1 系统性排错流程当ping不通网关或者外网时遵循“由近及远”的原则检查本机IP配置ip addr show 网卡名确认IP地址、子网掩码是否正确配置且网卡状态是UP。检查网关连通性ping -c 4 网关IP如果不通问题出在二层链路或网关本身。检查网线、交换机端口、网关设备是否正常。可以用arp -n查看是否能学到网关的MAC地址。如果通进入下一步。检查DNS解析nslookup google.com或者dig google.com如果解析失败说明DNS配置有问题。检查/etc/resolv.conf文件确认里面的nameserver指向是否正确。记住在netplan管理下这个文件是自动生成的不要直接修改它。正确的做法是修改netplan YAML文件中的nameservers部分然后重新apply。检查路由表ip route show这是最关键的一步。确认是否存在指向你目标网段或默认路由default的正确路由。是否存在冲突的路由比如两个默认网关。检查Netplan配置与生成文件sudo netplan generate # 仅生成配置不应用这个命令会检查YAML语法。如果有错会报出来。 还可以查看netplan为systemd-networkd生成的实际配置文件ls -l /run/systemd/network/ # 临时运行配置 ls -l /etc/systemd/network/ # 永久配置如果netplan设置了查看这些.network文件的内容可以确认netplan的“翻译”是否正确。4.2 常见问题速查表下表汇总了我遇到过的典型问题及解决方案问题现象可能原因排查命令与解决方案netplan apply后网络立即断开无法恢复1. 网关IP写错。2. 子网掩码CIDR写错导致IP不在同一网段。3. 网卡名称写错。1. 使用sudo netplan try测试它提供回滚机制。2. 通过服务器控制台如iDRAC、iLO、VNC或物理显示器登录检查配置。3. 用ip link show确认正确的网卡名。IP配置正确但ping不通网关1. 物理链路问题网线、交换机。2. 防火墙ufw或iptables阻止了ICMP。3. 网关设备路由器设置了MAC过滤或IP绑定。1. 换网线、换交换机端口测试。2. 临时关闭防火墙sudo ufw disable测试生产环境慎用。3. 检查路由器后台设置确认未做限制。能ping通IP但无法解析域名DNS服务器配置错误或不可达。1.cat /etc/resolv.conf检查DNS服务器地址。2. 直接ping 8.8.8.8测试与公共DNS的连通性。3. 在netplan配置中更换为可靠的DNS如8.8.8.8和114.114.114.114。重启后配置丢失恢复DHCP1. Netplan配置文件有语法错误导致未成功应用。2. Cloud-Init云镜像或某些安装方式在每次启动时重置网络。1. 用sudo netplan --debug apply查看详细应用过程。2. 检查/etc/cloud/cloud.cfg.d/目录下的文件禁用cloud-init对网络的管理编辑/etc/cloud/cloud.cfg.d/99-disable-network-config.cfg加入network: {config: disabled}。多网卡环境部分网络不通路由表混乱存在多个默认网关或路由冲突。1.ip route show仔细查看路由表。2. 在netplan配置中确保只有一个网卡设置了to: default的路由。为其他网卡配置精确的静态路由到其所属子网。NetworkManager与netplan冲突桌面版中图形界面修改了连接覆盖了netplan配置。1. 统一管理入口要么只用netplan推荐服务器要么只用NetworkManager图形界面/nmcli。2. 在netplan中设置renderer: NetworkManager然后通过nmcli管理避免使用图形界面。4.3 高级调试技巧如果上述方法都解决不了可能需要一些更深入的调试查看systemd-networkd服务日志sudo journalctl -u systemd-networkd -f应用netplan配置时实时查看网络服务的日志里面常有错误原因。彻底清除NetworkManager影响如果用了networkd渲染器 有时NetworkManager服务会干扰networkd。可以尝试禁用它sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager sudo systemctl restart systemd-networkd检查网络命名空间高级 如果你在使用容器或虚拟化网卡可能不在默认命名空间。这超出了基础静态IP设置的范围但知道有这个可能性。配置Ubuntu 22.04的静态IP核心就在于理解并用好netplan这个工具。它带来的YAML配置方式初期可能需要适应但一旦熟悉其简洁和强大是旧方法无法比拟的。记住操作黄金法则修改前备份应用前try。把本文的配置示例当作模板根据你的网络环境替换关键参数你就能为你的Ubuntu系统打下稳定网络的基石。