
开场这几天又帮朋友折腾了一台 Ubuntu 22.04.4 LTS 服务器起因就是默认 DHCP 拿到的 IP 总变导致他远程连不上SSH 一断开就彻底失联。改静态 IP、配网关、调 DNS一套操作下来发现很多人卡在第一步不知道 Ubuntu 22.04 到底该改哪个配置文件。网上查到的教程多数是老版本的/etc/network/interfaces写法在 22.04 上根本不起作用白白踩坑。这篇就把我在 Ubuntu 22.04.4 LTS 上改 IP 地址和网关的完整过程拆开讲清楚从原理到实操从单网卡到多网卡策略路由再加上日常排查实录让你照着做就能一次搞定。1. 动手前先搞清楚Ubuntu 22.04 的网络配置体系1.1 为什么你还在改 /etc/network/interfaces 是白费力气Ubuntu 从 18.04 开始引入了netplan作为默认网络配置工具到 22.04 已经非常成熟。很多老教程里教的“编辑/etc/network/interfaces然后/etc/init.d/networking restart”这一套在 22.04 上默认根本不起作用因为系统默认启用了systemd-networkd通过 netplan 来管理网络而不是传统的 ifupdown。注意如果你装的 Ubuntu 22.04 是带桌面环境的默认走的是NetworkManager配置文件路径和纯服务器版略有差异。这个后面细说。netplan的核心设计理念是把网络配置统一写在一个 YAML 文件里然后通过渲染器renderer把配置“翻译”给底层网络服务执行。默认有两个渲染器networkd对应systemd-networkd适合服务器环境轻量、稳定、无图形界面依赖。NetworkManager对应桌面环境常用的网络管理服务适合笔记本、工作站支持无线网络和 GUI 操作。选择哪套渲染器取决于你安装的是哪个 Ubuntu 变体。服务器版默认用networkd桌面版默认用NetworkManager。如果你不想陷入这两套体系的细节纠葛最简单的办法就是检查当前系统实际生效的渲染器再决定改哪个文件。1.2 netplan 配置文件长什么样Ubuntu 22.04 的 netplan 配置统一放在/etc/netplan/目录下不同安装方式的文件名可能不同服务器版通常是00-installer-config.yaml或50-cloud-init.yaml桌面版通常是01-network-manager-all.yaml老一些的版本可能是99-netplan-config.yaml之类的自定义文件文件内容一般长这样network: version: 2 ethernets: ens32: dhcp4: true这个配置的意思很直白启用版本 2 的 netplan 配置让ens32这块网卡用 DHCP 自动获取 IPv4 地址。查看当前生效的配置可以用sudo netplan get如果显示的内容和你打开的那个 YAML 文件不一致优先以netplan get输出的内容为准那才是系统实际读取后的最终结果。云服务器上尤其要注意这一点因为 cloud-init 可能会在你毫不知情的情况下覆盖你的手写配置。1.3 网卡命名规则与查看方法Ubuntu 22.04 用的是可预测网卡命名规则网卡名不像老 CentOS 那样叫eth0而是一些有规律的标识比如ens32、ens33、ens160代表 PCIe 板载网卡enp0s3、enp0s8代表物理插槽位置常见于 VirtualBox 虚拟机eno1代表板载网卡Onboardwlx...无线网卡lo回环接口永远不用改查看系统识别到的网卡清单用ip addr show或者更直观一点只列网卡名ls /sys/class/net/我见过不少人在改配置时写错网卡名比如实际是ens33配置文件里写的却是ens32结果netplan apply的时候报错甚至直接把网络搞断。所以动手之前务必先确认网卡名和当前 IP这一步马虎不得。2. 静态 IP 配置完整实操从查网卡到 Ping 通网关2.1 第一步确认当前网络状态和网卡名我们用一个典型的服务器场景来说明一台安装了 Ubuntu 22.04.4 LTS 的物理机或者虚拟机管理员希望通过 SSH 远程管理但 DHCP 分配的 IP 每次重启都会变化非常影响使用体验。现在要把它改为静态 IP。先执行ip addr show假设输出结果中看到ens32这块网卡当前的 IP 是192.168.1.120/24网关是192.168.1.1DNS 是路由器下发的地址。同时看看路由表ip route show正常会看到类似下面的输出default via 192.168.1.1 dev ens32 proto dhcp src 192.168.1.120 metric 100 192.168.1.0/24 dev ens32 proto kernel scope link src 192.168.1.120第一行就是默认路由default via 192.168.1.1表示发往其他网段的数据包都交给192.168.1.1这个网关转发。这行信息非常重要因为改配置后如果路由表里没有这条默认路由外网就通不了。2.2 第二步编写 netplan 配置在动手改之前养成一个好习惯备份原配置。sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak接着编辑配置文件sudo nano /etc/netplan/00-installer-config.yaml典型的静态 IP 配置写法如下network: version: 2 ethernets: ens32: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 223.5.5.5 - 192.168.1.1逐行解读这些配置项dhcp4: false明确告诉 netplan 不要用 DHCP改用下面手写的地址。dhcp6默认是关闭的如果需要 IPv6 的 DHCP 再单独开启。addresses要设置的静态 IP 和子网掩码。这里必须要带 CIDR 前缀长度/24表示255.255.255.0不能只写 IP 不写掩码否则应用配置时会报错。routes定义静态路由。to: default表示默认路由via是下一跳网关地址。这种写法和老系统的gateway: 192.168.1.1是等效的但新版 netplan 推荐用routes因为它更灵活可以同时定义多条静态路由。nameserversDNS 服务器列表。223.5.5.5 是阿里公共 DNS192.168.1.1 是路由器地址这样写的好处是既能解析外网域名又能在内网访问路由器管理界面时快速解析局域网主机名。2.3 第三步检查语法并应用配置写完配置后不要急着直接应用先检查语法sudo netplan try这个命令非常实用。它会先验证配置文件的语法和网络连通性然后给你一个 120 秒的倒计时确认窗口。如果你发现配置有问题、或者远程 SSH 连接断开了可以在倒计时结束前按回车或 CtrlC 取消系统会自动回滚到上一个可用配置。确认无误后强制执行sudo netplan apply然后检查是否生效ip addr show ens32 ip route show看到 IP 变成192.168.1.100/24、默认路由指向192.168.1.1再 ping 一下网关和公网地址ping -c 4 192.168.1.1 ping -c 4 223.5.5.5网关通了说明二层链路没问题公网 IP 通了说明路由和 NAT 没问题。最后再解析一下域名ping -c 4 baidu.com如果域名能解析到 IP 并成功 ping 通说明 DNS 配置也正常整个静态 IP 切换就完成了。提示netplan try和netplan apply的区别在于try 带自动回滚保护机制apply 直接生效。生产环境的机器建议永远先用 try确认没问题再手动 apply或者让 apply 在 try 的确认窗口内自动执行。2.4 网关设置背后的逻辑为什么网关和 IP 必须在同一网段很多新手在配置网关时容易犯一个错IP 设置成192.168.1.100/24网关却写的是10.0.0.1结果应用配置后不上网。原因很简单系统路由规则要求“直连路由优先于默认路由”也就是发往网关的包必须先能通过二层网络直接到达。如果网关 IP 不在本机子网内192.168.1.0/24范围内的 IP 才能算同一子网系统就无法直接 ARP 到网关的 MAC 地址数据包自然发不出去。更严谨的做法是网关的 IP 必须要落在网卡的addresses配置指定的子网范围内。如果服务器有多块网卡分别连接不同的网络比如一块连内网10.0.0.0/8、一块连外网192.168.1.0/24那么默认路由的网关要写在外网网卡的子网内内网的路由条目通过/etc/netplan里的routes单独加不能用default覆盖。3. 网关配置与路由实战单网关、多网卡怎么玩3.1 理解默认网关与路由表的优先级在 Linux 系统中路由表是数据包转发的依据。ip route输出中每个路由条目都有一个可选的metric参数数值越小优先级越高。当系统有多条默认路由时metric值最小的那条生效。netplan 里可以用两种方式指定默认网关方式一旧语法仍可用但已不推荐ethernets: ens32: gateway4: 192.168.1.1方式二新语法推荐ethernets: ens32: routes: - to: default via: 192.168.1.1 metric: 100gateway4在 Ubuntu 22.04 的 netplan 版本里虽然还能识别但官方文档已经标注 deprecated并且在配置多个网卡时会引发歧义——系统不知道这条默认路由应该绑定到哪块网卡上。所以我强烈建议一律用routes方式写。当你只有一块网卡、一个网关时两种写法效果一样。但如果你有多块网卡特别是要对接不同网络环境时routes才能提供精确控制。3.2 多网卡场景下如何设置不同网关举个例子一台服务器有两块网卡ens32连接公司办公网10.10.0.0/16IP 为10.10.1.100网关为10.10.0.1ens33连接机房专线192.168.100.0/24IP 为192.168.100.5网关为192.168.100.1需求默认流量走专线出口但访问办公网内部服务器时走办公网网关。netplan 配置可以这样写network: version: 2 ethernets: ens32: dhcp4: false addresses: - 10.10.1.100/16 routes: - to: 10.10.0.0/16 via: 10.10.0.1 metric: 50 ens33: dhcp4: false addresses: - 192.168.100.5/24 routes: - to: default via: 192.168.100.1 metric: 100这样配置之后访问10.10.x.x网段时走ens32的10.10.0.1网关其他流量全部走ens33的默认网关192.168.100.1。这里有一个容易踩的坑如果ens32上也加了一条to: default的默认路由而且metric更小那么所有流量都会优先走ens32导致专线出口ens33形同虚设。所以多网卡时务必规划好路由权重。3.3 临时添加与删除路由不用重启网络就生效有时候只是临时需要一个独立的静态路由不想改配置文件。可以用ip命令直接操作# 添加一条临时静态路由 sudo ip route add 172.16.10.0/24 via 192.168.1.1 dev ens32 # 删除一条临时路由 sudo ip route del 172.16.10.0/24 # 查看完整路由表 ip route show临时路由在系统重启或者 network 服务重启后会消失适合做测试用。如果在测试过程中发现某条路由确实长期需要再写进 netplan 配置文件里固化下来。对于更复杂的策略路由场景比如需要基于源 IP 做分流、走不同的网关netplan 也支持routing-policy参数写起来会复杂不少。实际工作中我建议直接上linux-route2的ip rule虽然写法繁琐但精确度是 netplan 的routing-policy难以比拟的。4. DHCP 动态 IP让它自己拿地址的配置方法4.1 什么时候该用 DHCP静态 IP 适合服务器、打印机、监控摄像头这类需要稳定访问的设备。但也有一些场景 DHCP 更好笔记本、桌面机经常在不同网络间切换家里、公司、咖啡馆DHCP 免去手动改配置的麻烦临时测试虚拟机创建后能立刻上网不关心 IP 是否固定物理环境和子网信息还不确定时先用 DHCP 确认网络通不通再决定是否改成静态Ubuntu 22.04 默认装完服务器版就像上面写的那样dhcp4: true开箱即用。如果你用桌面版装完默认由 NetworkManager 管理图形界面里网络设置处默认就是“自动DHCP”。4.2 netplan 中配置 DHCP 的细节纯 DHCP 配置很简单network: version: 2 ethernets: ens32: dhcp4: true如果你希望 DHCP 拿到地址后额外再叠加一些静态配置比如自定义 DNS、加一条静态路由也可以组合使用network: version: 2 ethernets: ens32: dhcp4: true dhcp4-overrides: use-dns: false nameservers: addresses: - 10.0.0.53 routes: - to: 172.20.0.0/16 via: 10.0.0.1这里的dhcp4-overrides.use-dns: false表示不接受 DHCP 下发的 DNS 服务器改用下面nameservers里手动指定的 DNS。这个细节在工作场景中很有用公司的 DHCP 服务器下发的 DNS 经常解析不了公网域名而你又没法去改 DHCP 服务器配置就可以压一层覆盖。4.3 让 DHCP 分配的 IP 尽量稳定MAC 地址绑定如果你确实想用 DHCP但又不希望 IP 频繁变动最推荐的办法是在路由器或 DHCP 服务器上做 MAC 地址绑定也叫 DHCP 静态分配。操作思路是在 Ubuntu 上查网卡 MAC 地址ip link show ens32输出中link/ether 00:15:5d:xx:xx:xx就是 MAC 地址。在路由器管理后台找到“DHCP 静态绑定”或“地址保留”选项输入该 MAC 和你想保留的 IP保存生效。这个方案的好处是Linux 客户端配置非常简单依然是dhcp4: true但 IP 每次都能拿到同一个。如果你手上有几十台设备要管理又不想挨个登录配置静态 IP这就省事得多。5. 常见问题与排查实录DNS 不通、配置冲突、连不上服务器5.1 改了配置后 SSH 直接失联怎么办这是最让人头大的场景人还在远程改完netplan try超时后配置生效结果 SSH 立刻断掉再也连不上了。大概率有两种原因配置的 IP 被别的设备占了网卡上虽然有这个 IP但 ARP 冲突导致网络不稳定网关或子网掩码写错系统底层仍然用物理链路在跑但路由已经指到不存在的地方了这种情况如果人不在机器旁边唯一可行的自救方案是让机房或现场同事接显示器和键盘本地登录然后执行sudo netplan apply先看报错信息。如果报错提示语法有问题直接编辑配置文件改回来如果应用成功但网络还是不通先用ip addr show ip route show确认真实生效的地址和路由。实在不行就恢复备份sudo cp /etc/netplan/00-installer-config.yaml.bak /etc/netplan/00-installer-config.yaml sudo netplan apply我个人的建议是在任何远程服务器上改网络配置前一定先在本地把配置备份好并且一定要用netplan try不要直接apply。try的 120 秒倒计时窗口就是最后悔药宁可等它慢慢倒计时也不要拿手速去赌。5.2 IP 能 ping 通但域名解析不了典型的症状ping 192.168.1.1 # 通 ping baidu.com # ping: baidu.com: Temporary failure in name resolution这是 DNS 配置出问题了。排查思路如下cat /etc/resolv.confUbuntu 22.04 默认用systemd-resolved管理 DNS所以/etc/resolv.conf实际上是一个软链接指向/run/systemd/resolve/stub-resolv.conf。netplan 里配置的nameservers最终会写入systemd-resolved的配置。如果/etc/resolv.conf里找不到你配置的 DNS大概率是 netplan 配置里没有正确写nameservers或者dhcp4-overrides的use-dns被设成了false但后面没跟手动 DNS。也可以直接检查 systemd-resolved 的状态resolvectl status这里能看到系统实际下发的 DNS 服务器和当前每个网卡使用的 DNS。常见的坑是内网有私有 DNS 服务器只负责解析内部域名但你不小心把公网 DNS比如 8.8.8.8设成了唯一 DNS结果内网域名全解析不了。正确做法是多个 DNS 都写上或者用search域名把内网域和公网域分开解析。5.3 netplan 配置文件语法正确但应用时报错遇到这种情况先看完整报错信息。常见报错有几个报错 1Error: Conflicting default route declarations这个基本是你在两个网卡上都写了to: default但没指定metric。两个默认路由没有优先级区分netplan 不知道走哪个干脆报错。解决办法是给每条默认路由配上不同的metric值。报错 2Cannot call Open vSwitch: ...这个和 Open vSwitch 有关通常出现在你删了或改了 netplan 里 oVS 相关的配置但底层systemd-networkd还在尝试拉起 oVS 服务。先确认系统里是否真的需要 oVSsystemctl status openvswitch-switch如果确认不用就禁用sudo systemctl disable --now openvswitch-switch然后在 netplan 里去掉所有openvswitch相关的网卡段。报错 3netplan: command not found极少数精简版系统或者容器里可能没装 netplan直接安装即可sudo apt update sudo apt install netplan.io5.4 同时装了 NetworkManager 和 networkd配置互相打架这是 Ubuntu 桌面版用户最容易遇到的问题桌面版默认 NetworkManager 管网络但/etc/netplan/下可能同时存在01-network-manager-all.yaml和另一个手写的配置文件。两个文件都生效时后读的文件可能会覆盖前一个的设置。处理办法把不想用的配置移走或删除保留一套体系。如果你确定要用 netplan networkd 管理就把 NetworkManager 的配置移除并禁用 NetworkManager 服务sudo systemctl stop NetworkManager sudo systemctl disable NetworkManager反过来如果你喜欢用 NetworkManager 的图形界面管理网络netplan 里只要保留最基础的那一行network: version: 2 renderer: NetworkManager然后把其他手写的ethernets配置全部删掉让 NetworkManager 自己接管。5.5 云服务器和虚拟机上改 IP 的特殊注意事项云服务器比如阿里云、腾讯云、AWS 等的情况比较特殊正常情况下不建议在系统内部改 IP。云平台的 IP 是绑定在虚拟网卡上的改错了直接断连且无法本地登录。如果你的云服务器需要更换 IP正确的做法是在云控制台操作而不是在操作系统里改。虚拟机的灵活度稍大一些。比如 VMware 或 VirtualBox 里跑 Ubuntu只要虚拟网卡的网络模式配置正确在系统内部改成静态 IP 完全没问题。常见的网络模式对应关系虚拟机网络模式Ubuntu 侧网卡 IP 范围网关地址备注NAT 模式192.168.xx.0/24192.168.xx.2 或 .1通过宿主机共享上网桥接模式与宿主机同网段宿主机网关直接参与局域网通信仅主机模式与 VMnet 网段一致VMnet 网关仅虚拟机之间通信改之前用ip route show看一下当前默认网关是什么VMware 的 NAT 模式网关一般是192.168.x.2VirtualBox 一般是10.0.2.2这些细节不看一眼很容易写错。写在最后的实操心得改 IP 和网关这件事说难不难说简单也不简单。踩过几次坑之后我总结出几条习惯算是给自己定的规矩第一远程操作服务器改网络前永远先备份 netplan 配置并且必须用netplan try而不是netplan apply。120 秒的倒计时是系统给你的后悔时间不要为了省几秒钟赌远程连接不断。第二网卡名以ip link show的为准不要凭记忆抄配置文件里的旧网卡名尤其是克隆虚拟机后网卡名和 MAC 都可能发生变化。第三网关地址一定要落在网卡子网范围内这个底层逻辑决定了几层网络能否走通路由表设计的多网卡网络要画拓扑、写清楚 metric 优先级别让系统帮你选路。第四配置完除了看 IP 通不通一定要测域名解析。很多故障的根源不是 IP 没配好而是 DNS 被覆盖或遗漏了。如果你按这个流程操作Ubuntu 22.04.4 LTS 上改 IP 和网关基本可以一把过少走很多弯路。