ESXi 环境下 CentOS 固定 IP 配置全攻略:从 ifcfg 到 nmcli 避坑指南
1. 为什么虚拟化环境下的固定IP配置值得单独拿出来讲在物理服务器上配个静态IP很多人闭着眼睛都能敲完vi /etc/sysconfig/network-scripts/ifcfg-eth0那几行。但一旦环境搬到 VMware ESXi 上事情就变得微妙起来——虚拟机网卡类型变了、MAC地址分配方式变了、虚拟交换机vSwitch的端口组策略可能悄悄影响 DHCP 行为再加上 CentOS 7 和 CentOS 8/Stream 的网络管理栈完全不是一套东西很多人在这一步反复翻车。我自己就见过不止一次明明配置文件写得没问题重启网络服务后 IP 就是不变或者变了但网关不通折腾半天最后发现是 NetworkManager 和 network 服务在打架。这篇内容就是围绕“在 ESXi 里给 CentOS 配固定 IP”这一件事把从虚拟机侧到系统侧、从配置文件到验证排查的完整链路拆开讲清楚。它适合三类人刚接触虚拟化环境、习惯在物理机上操作但搬到 ESXi 后踩坑的运维新手需要给测试环境或内网服务配置稳定地址、不想每次重启都去查 IP 的开发同学以及想搞清楚 CentOS 7 与 CentOS 8 网络配置差异、避免用错工具的老手。核心关键词就三个ESXi 虚拟网络、CentOS 静态地址、网卡配置文件。读完你至少能做到不管拿到的是 CentOS 7 还是 CentOS 8/Stream不管 ESXi 那边端口组怎么设都能一次性把固定 IP 配对、配稳并且知道出问题时从哪一层开始查。我个人的习惯是配固定 IP 这件事从来不是“改个文件重启”这么简单它本质上是虚拟化层、系统网络管理层、配置文件层三层的对齐。任何一层没对上症状都表现为“IP 不对”但根因可能天差地别。下面我就按这个三层思路往下拆。2. 整体设计思路先理清三层关系再动手2.1 虚拟化层决定了你“能配什么”在 ESXi 里每台虚拟机的网卡并不是直接插在一根物理网线上而是接在一个虚拟交换机vSwitch上虚拟交换机再通过端口组Port Group把流量导向物理上行链路或者内部网络。这个结构决定了几个关键事实第一虚拟机的 MAC 地址默认由 ESXi 分配也可以手动指定而 MAC 地址是 DHCP 识别和静态绑定都绕不开的东西第二端口组上如果启用了某些安全策略比如伪传输、MAC 地址更改、混杂模式会直接影响虚拟机能不能正常收发特定帧第三如果端口组背后挂的是 ESXi 自带的 DHCP 服务或者上游路由器的 DHCP那虚拟机默认会拿到动态地址你要配静态就得先让系统“别去要动态地址”。很多人配静态 IP 失败根因其实在虚拟化层比如端口组的安全策略把 MAC 地址更改给禁了你手动改了 MAC 结果流量直接被丢又比如虚拟机连的端口组压根没通到你要去的网段IP 配得再对也 ping 不通网关。所以我的做法是动手改配置文件之前先在 ESXi 的 vSphere 客户端或 Host Client里确认三件事虚拟机连的是哪个端口组、这个端口组的 VLAN 和上行链路是什么、虚拟网卡的 MAC 地址是自动还是手动。这三条确认完系统侧的配置才有意义。2.2 系统网络管理层CentOS 7 和 8 是两套逻辑CentOS 7 默认同时存在network服务和NetworkManager两者都能管网络但配置文件格式和生效方式不完全一样。CentOS 8 及之后的 Stream 版本则彻底转向NetworkManagernetwork服务被移除配置工具从ifcfg文件逐渐过渡到nmcli和 keyfile 格式。这个差异是配固定 IP 时最大的坑源你在 CentOS 7 上习惯的systemctl restart network到了 CentOS 8 上直接报“Unit network.service not found”然后人就开始慌。我的选型建议很明确CentOS 7 用ifcfg文件 network服务或nmcli也行但保持一种方式到底CentOS 8/Stream 用nmcli或 keyfile别再去碰ifcfg那套老路径。为什么因为 CentOS 8 里ifcfg文件虽然还能被 NetworkManager 读取但部分参数尤其是路由和 DNS 相关的行为已经变了混用容易出玄学问题。统一用nmcli的好处是命令即配置、改完立即生效、还能直接查连接状态排查时信息更集中。2.3 配置文件层静态 IP 到底要写哪几项不管哪个版本一个能用的静态 IP 配置至少包含这几项设备名、连接名、IPv4 方法设为 manual或 static、IP 地址与子网掩码或前缀长度、网关、DNS。少一项就可能出现“IP 有了但上不了网”或者“重启后配置丢失”。这里有个容易被忽略的点子网掩码在ifcfg里写的是PREFIX24这种前缀长度而不是255.255.255.0写错了不报错但网段判断会错表现为同网段能通、跨网段全挂。另一个点是ONBOOTyes不写这一项重启后网卡根本不激活你配的静态地址等于白配。我见过最典型的翻车场景是配置文件里BOOTPROTOstatic写了、IP 写了、网关写了唯独ONBOOT还是no然后重启后ip addr一看网卡是 DOWN 的人就开始怀疑 ESXi。所以下面实操部分我会把每一项的作用和常见错误值都标出来照着填基本不会错。3. 核心细节解析ESXi 侧与 CentOS 侧的关键参数3.1 ESXi 侧需要确认的四个点动手之前先在 ESXi Host Client 里把虚拟机的网络信息摸清楚。第一看虚拟机设置里的网络适配器连的是哪个端口组记下名字第二看这个端口组的VLAN ID确认它和你打算配的 IP 网段是否匹配比如 VLAN 100 对应 192.168.100.0/24你配个 10.0.0.5 那肯定不通第三看虚拟网卡的MAC 地址是“自动”还是“手动”如果是自动建议先记下来配静态 IP 时不需要改 MAC但排查时用得上第四确认端口组的安全策略里“MAC 地址更改”和“伪传输”没有被设成拒绝——这两个如果被拒某些情况下静态 IP 的 ARP 响应会被丢弃表现为 IP 配好了但同网段其他机器 ping 不通它。提示ESXi 里虚拟机的 MAC 地址前三位通常是 VMware 的 OUI比如 00:0C:29 或 00:50:56如果你在系统里看到 MAC 和 ESXi 显示的不一致说明有人在系统里手动改过这时候要回头检查端口组策略别急着改 IP。3.2 CentOS 7 的 ifcfg 文件逐项拆解CentOS 7 的网卡配置文件在/etc/sysconfig/network-scripts/下文件名通常是ifcfg-ens192这种设备名取决于 ESXi 虚拟网卡类型VMXNET3 一般显示为 ens 开头。一个标准的静态配置长这样TYPEEthernet BOOTPROTOstatic DEFROUTEyes NAMEens192 DEVICEens192 ONBOOTyes IPADDR192.168.100.50 PREFIX24 GATEWAY192.168.100.1 DNS1192.168.100.1 DNS2223.5.5.5逐项说下为什么这么写。BOOTPROTOstatic是告诉系统别走 DHCPDEFROUTEyes表示这条连接作为默认路由如果你有多网卡只有一条该设 yesNAME和DEVICE保持一致避免 NetworkManager 认错连接PREFIX24就是子网掩码 255.255.255.0 的前缀写法GATEWAY必须和 IP 同网段否则路由加不上DNS1/DNS2建议一个指向网关或内网 DNS一个指向公共 DNS 做兜底。这里有个细节如果你在 ESXi 端口组上配了 DHCP但你想用静态BOOTPROTO一定要改成 static否则系统可能仍然去要地址出现 IP 冲突。3.3 CentOS 8/Stream 的 nmcli 配置逻辑CentOS 8 之后我推荐直接用nmcli一条条敲改完立即生效不用记文件路径。先看连接名nmcli connection show假设输出里有个叫ens192的连接接着改nmcli connection modify ens192 ipv4.method manual nmcli connection modify ens192 ipv4.addresses 192.168.100.50/24 nmcli connection modify ens192 ipv4.gateway 192.168.100.1 nmcli connection modify ens192 ipv4.dns 192.168.100.1 223.5.5.5 nmcli connection up ens192这套命令的好处是每一步都有明确语义ipv4.method manual对应静态ipv4.addresses带前缀长度ipv4.dns用空格分隔多个。改完up一下立即生效不需要重启整个网络服务。如果你更习惯文件方式CentOS 8 的 keyfile 在/etc/NetworkManager/system-connections/下格式是 ini 风格但我不建议手写容易漏[ipv4]段里的methodmanual用nmcli生成更稳。3.4 网关、DNS 与路由的联动关系静态 IP 配完最常见的两个症状一是能 ping 通同网段但出不了网二是域名解析失败。前者九成是网关没写或写错网段后者九成是 DNS 没配或配了但被resolv.conf覆盖。CentOS 7 里如果你在ifcfg写了DNS1network服务启动时会把它写进/etc/resolv.conf但如果你同时装了 NetworkManager 且它也在管 DNS可能出现两边打架。我的做法是CentOS 7 用network服务就坚持用ifcfg里的 DNS 项别再去手动改resolv.confCentOS 8 用nmcli配 DNS 后resolv.conf由 NetworkManager 托管手动改会被覆盖所以也别手改。路由这块单网卡单网关的情况GATEWAY一项就够了。如果你在 ESXi 里给虚拟机挂了多块网卡比如一块业务、一块管理那就要用DEFROUTE和策略路由来区分这时候建议先用ip route看清楚默认路由指向哪再决定哪条连接设DEFROUTEyes。多网卡场景下配错默认路由表现是“IP 都对但流量走错口”排查起来比单网卡麻烦得多。4. 实操过程从零到能 ping 通外网的完整步骤4.1 第一步在 ESXi 里确认虚拟机网络归属登录 ESXi Host Client找到目标虚拟机打开“编辑设置”看网络适配器那一栏。记下三样东西端口组名称、适配器类型E1000e 还是 VMXNET3、MAC 地址。适配器类型影响系统里看到的设备名VMXNET3 在 CentOS 里通常是ens开头E1000e 可能是ens33或eth0这个决定了你后面改哪个配置文件。确认完关掉设置窗口不需要改任何东西——配静态 IP 本身不需要动 ESXi 侧配置除非你发现端口组 VLAN 和 IP 网段对不上那才需要回头找管网络的人确认。注意如果你打算配的 IP 和端口组所在网段不一致先别改系统配置先确认是不是连错了端口组。ESXi 里改端口组比系统里改 IP 影响面大别本末倒置。4.2 第二步进系统看当前网络状态通过 ESXi 控制台或 SSH 进 CentOS先跑几条命令摸清现状ip addr ip route nmcli connection showip addr看当前网卡名和有没有拿到地址ip route看默认路由指向哪nmcli connection show看连接名和当前使用的配置。这三条跑完你基本能判断出系统现在是用 DHCP 还是已有静态配置、网卡名是什么、网关通不通。我习惯在这一步把当前 DHCP 拿到的 IP 和网关记下来配静态时网关直接沿用减少出错概率。4.3 第三步CentOS 7 的配置文件修改与生效假设网卡名是ens192先备份原文件cd /etc/sysconfig/network-scripts/ cp ifcfg-ens192 ifcfg-ens192.bak然后编辑ifcfg-ens192按 3.2 节的模板填。填完保存执行systemctl restart network如果报错先看systemctl status network的输出常见错误是PREFIX写成了NETMASK但值格式不对或者GATEWAY不在IPADDR同网段。重启成功后用ip addr show ens192确认地址生效再ping -c 3 网关IP确认二层通最后ping -c 3 223.5.5.5确认出网通。三步都过配置就算成了。4.4 第四步CentOS 8/Stream 的 nmcli 落地CentOS 8 上先确认连接名然后按 3.3 节的命令逐条执行。执行完nmcli connection up ens192后用nmcli connection show ens192 | grep ipv4看配置是否落上再用ip addr和ping做同样的三步验证。这里有个实操细节如果你在nmcli里配了 DNS 但ping 域名不通先看/etc/resolv.conf里有没有你配的 DNS如果没有说明 NetworkManager 的 DNS 托管没生效可以nmcli connection modify ens192 ipv4.dns-priority 10调一下优先级或者确认dnsnone没被误设。4.5 第五步重启验证与持久化确认配完别急着收工reboot一次看配置是否持久。重启后重复ip addr、ip route、ping三步。如果重启后 IP 丢了CentOS 7 查ONBOOT是不是yesCentOS 8 查nmcli connection show里connection.autoconnect是不是yes。这两个是持久化最常见的漏项。另外如果你在 ESXi 里给虚拟机做过快照恢复快照后网络配置可能回到快照时的状态这点在测试环境里要留意别以为是配置没生效。5. 常见问题与排查技巧实录5.1 配完静态 IP 后 ping 不通网关这是最高频的问题。排查顺序我固定为先ip addr确认 IP 和前缀长度对不对再ip route确认默认路由在不在然后arping 网关IP看二层有没有响应。如果ip route里没有默认路由说明GATEWAY没写或写错网段如果路由在但arping没响应问题大概率在 ESXi 端口组——检查 VLAN 是否匹配、端口组是否绑了正确的上行链路、安全策略是否拦了 ARP。我遇到过一例是端口组 VLAN 设成了 0也就是不打标签但上游交换机要求带标签结果虚拟机发出的帧全被丢IP 配得再对也没用。5.2 重启后 IP 变回 DHCP 地址CentOS 7 上九成是BOOTPROTO没改成static或者改的文件不是当前生效的那个比如系统里有两个ifcfg-文件指向同一设备。CentOS 8 上查nmcli connection show里ipv4.method是不是manual以及connection.autoconnect是不是yes。还有一种情况是 ESXi 侧端口组挂了 DHCP系统虽然配了静态但 DHCP 客户端仍在跑导致地址被覆盖——CentOS 7 可以systemctl disable dhclient彻底关掉CentOS 8 用nmcli配了 manual 后一般不会再要地址但保险起见可以nmcli connection modify ens192 ipv4.dhcp-timeout 0。5.3 能通内网但域名解析失败先cat /etc/resolv.conf看里面有没有你配的 DNS。CentOS 7 用network服务时ifcfg里的DNS1会在服务重启时写入如果你手动改过resolv.conf又被覆盖说明 NetworkManager 在管 DNS。CentOS 8 上resolv.conf是 NetworkManager 生成的软链或托管文件手改无效。解决方式是回到nmcli里配ipv4.dns然后nmcli connection up重新激活。如果 DNS 配了还不通用dig DNS地址 域名直接测 DNS 服务器本身通不通排除是 DNS 服务器的问题而不是你配置的问题。5.4 多网卡场景下流量走错口虚拟机挂了两块网卡、各配一个网段时默认路由只能有一条。如果两条连接都设了DEFROUTEyes系统会按连接激活顺序选一条表现是“有时通有时不通”。正确做法是只给业务网卡设DEFROUTEyes管理网卡设DEFROUTEno需要跨网段访问管理网段时用ip route add加明细路由。CentOS 8 上用nmcli connection modify 管理连接名 ipv4.never-default yes更直观。这个坑我在测试环境里踩过当时两块网卡都设了网关结果 SSH 时通时断查了半天路由表才发现默认路由在两条连接间跳。5.5 常见问题速查表症状最可能原因快速验证解决方向ping 不通网关网关不在同网段或端口组 VLAN 不匹配ip route看默认路由arping测二层改 GATEWAY 或核对 ESXi 端口组 VLAN重启后 IP 丢失ONBOOTno 或 autoconnectno查 ifcfg 或 nmcli 对应项改为 yes 后重启验证域名解析失败DNS 未配或被覆盖cat /etc/resolv.conf在 ifcfg 或 nmcli 里配 DNS 并重新激活同网段通、跨网段不通前缀长度写错或默认路由缺失ip route看路由表修正 PREFIX 或补 GATEWAY多网卡时通时断多条连接都设了默认路由ip route看默认路由是否跳变只保留一条 DEFROUTEyes配完 IP 后 SSH 断连改配置时把当前管理 IP 覆盖了控制台进系统看ip addr用 ESXi 控制台改回或补回原 IP提示改网络配置前如果只有 SSH 一条路进系统务必先确认 ESXi 控制台能进否则改错 IP 就把自己锁外面了。这是最朴素也最容易被忽略的一条。6. 我踩过的坑与几条实操心得说几个文档里不太会写、但实际配的时候很要命的点。第一ESXi 里虚拟机的网卡如果选的是 E1000eCentOS 7 里设备名可能是ens33而不是ens192改配置文件前一定先用ip addr确认设备名改错文件等于没改。第二CentOS 7 上systemctl restart network有时会卡住几十秒原因是 NetworkManager 和 network 服务在抢着管同一块网卡如果你不打算用 NetworkManager可以systemctl disable NetworkManager再重启 network干净很多。第三配静态 IP 时如果原 DHCP 地址还在先ip addr flush dev ens192清一下再重启服务避免新旧地址同时挂在一个网卡上造成 ARP 混乱。还有一个心得是关于验证顺序的我习惯按“本机地址 → 同网段网关 → 外网 IP → 域名”四步走每步用最短的命令验证哪步断就停在哪步查不要一上来就ping 域名那样断了你分不清是网络不通还是 DNS 不通。这套顺序在 ESXi 环境里尤其好用因为虚拟化层的故障往往表现为“同网段都不通”而系统配置错误更多表现为“同网段通但出不去”按顺序走能快速定位到是哪一层的问题。最后提一句 CentOS 版本选择上的现实情况CentOS 7 已经停止维护新环境更可能拿到的是 Stream 或兼容发行版nmcli那套命令是更值得花时间熟悉的。但老环境里 CentOS 7 存量还很大ifcfg那套也不能丢。两套都掌握遇到什么环境都不慌。我自己现在配新机器基本直接上nmcli改完nmcli connection show一眼看全所有参数比翻文件快得多排查时也少一层“文件到底生效没有”的疑虑。