有一次我做三节点的 ZooKeeper 集群测试,三个 CentOS 虚拟机跑得好好的,我顺手重启了其中一台,结果发现它的 IP 从 192.168.100.131 变成 192.168.100.142。集群直接分裂,我花了半个多小时排查才发现是 IP 变了导致节点互相连不上。从那次以后,我养成了一个习惯:只要是装虚拟机做实验,第一步永远是把固定 IP 配好。
这篇文章就围绕“虚拟机 centos 配置固定 IP”这件事,把 VMware 里的网络模式选择、CentOS 端的具体配置、以及我踩过的各种坑完整讲一遍。内容不挑版本,CentOS 7 到 CentOS Stream 9 都能用。适合刚接触 Linux 虚拟机的初学者,也适合那些配过几次但总在重启后掉线的老手。
1. 动手之前先想清楚:固定IP到底要固定哪些东西
很多人一上来就打开网卡配置文件,把 BOOTPROTO 改成 static,填一个 IP 完事。结果重启后要么连不上网关,要么 DNS 解析不了域名,折腾半天。其实固定 IP 这件事,表面上是在写一个地址,实质上是在向系统声明四个信息:IP 地址、子网掩码、网关、DNS。任何一个不对,网络都不通。
1.1 IP只是敲门砖,网关和DNS才是关键
先打个比方。IP 地址是门牌号,子网掩码决定你这个小区有多大,网关是你这个小区的总大门,DNS 是手机里的通讯录。你把门牌号改了、小区范围对了,但如果总大门地址填错,你出不了小区;如果通讯录坏了,你出小区后也不知道该往哪走——对应到网络里就是能 ping 通 IP 但上不了网。
在 VMware 的 NAT 模式下,虚拟机的网关几乎永远是那个网段的 .2 地址。比如 VMware 默认把 VMnet8 网段划分成 192.168.100.0/24,那么网关就是 192.168.100.2。这个 .2 是 VMware 虚拟网关的固定占用地址,你在配置虚拟机的时候一定不能把这个地址分配给自己用,否则就会冲突。
DNS 的选择比较自由。你可以用宿主机的 DNS,可以用 VMware NAT 的虚拟 DNS,也可以直接用公共 DNS 比如 223.5.5.5(阿里)或者 119.29.29.29(腾讯)。如果想让虚拟机在只有内网的环境里稳定运行,我会把网关地址同时填成 DNS1,再配一个公共 DNS 作为 DNS2。这样既能保证内网解析,又能在需要上外网的时候兜底。
1.2 为什么填了静态地址还会丢网络
这是我在新手阶段常遇到的问题:明明在图形界面里改了配置,IP 也填对了,重启后又变回去了。原因通常是 NetworkManager 和网卡配置文件之间产生了分歧。CentOS 7 时代,网络服务有 network 和 NetworkManager 两套机制;CentOS 8 开始更是默认由 NetworkManager 全权接管。如果你只是用文本编辑器改写了 ifcfg 文件,但没有让 NetworkManager 重新加载配置,系统下次启动时大概率还是按照旧的连接配置来。
理解“连接(connection)”这个概念很重要。NetworkManager 管的是一个连接配置,而不是直接管网卡。一个网卡上可能同时存在多个连接配置——比如系统原有的 ens33 连接、你手动新建的静态连接、还有 VMware 克隆时自动生成的连接。表现就是:你改了 ifcfg-ens33,屏幕上显示的是另一份配置。这部分细节我放在第 4 节详细展开,这里只要记住一句话:手动改文件之后,一定要重启 NetworkManager 或使用 nmcli 让新配置生效。
2. VMware三种网络模式怎么选:NAT模式才是固定IP的主战场
不少教程一上来就直接让读者改 /etc/sysconfig/network-scripts/ifcfg-ens33 文件,很少讲清楚 VMware 的三种网络模式对固定 IP 的影响。实际工作中我发现,网络模式选错了,静态 IP 再怎么配都是白搭。
2.1 三种模式适用于哪个场景,一张表说清楚
VMware Workstation 的虚拟机网卡有三种模式:桥接模式、NAT 模式、仅主机模式。它们的核心差别在于虚拟机如何与宿主机、局域网、外网沟通。
| 网络模式 | 虚拟机和宿主机通信 | 虚拟机上外网 | 虚拟机之间通信 | 固定IP的省心程度 |
|---|---|---|---|---|
| 桥接模式 | 借助物理网卡,逻辑上等同局域网内一台独立主机 | 依赖宿主机所在局域网的路由条件 | 可以互通,但依赖物理交换机 | 容易和局域网其他设备冲突,需要确认空闲 IP |
| NAT 模式 | 通过虚拟网关 VMnet8 转发 | 通过宿主机 NAT 转发,直通外网 | 同一 VMnet8 下可互通 | 网段隔离独立,静态 IP 最稳定 |
| 仅主机模式 | 只能和宿主机及同网段虚拟机通信 | 不能上外网 | 可以互通 | 适合纯内网测试,但外网不通 |
桥接模式最接近物理机的网络环境。虚拟机会直接用宿主机的物理网卡向外通信,表现上就像是局域网里又多了一条主机。反过来,你的虚拟机 IP 必须落在宿主机所在的局域网网段内,而且不能和现有设备冲突。比如你家路由器的网段是 192.168.1.0/24,那虚拟机就得设一个 192.168.1.x 的地址,还不能跟手机、电视、宿主机抢同一个 .x。听起来简单,但路由器 DHCP 分配的地址时不时会变化,静态 IP 就可能撞地址。一旦冲突,要么虚拟机掉线,要么把人家手机挤掉线。
仅主机模式则彻底断开外网,只有虚拟网卡 VMnet1 提供内网通道。它适合做渗透测试、内网实验,但不适合日常需要更新软件包的场景。
2.2 NAT模式下VMware的虚拟网关和DHCP服务
NAT 模式是绝大多数人做实验最省心的选择。它通过 VMnet8 虚拟网卡把虚拟机包一层 NAT,转发到宿主机的物理网络上。虚拟机的 IP 网段由 VMware 自己划分,和外部局域网隔离。就算你家里路由器的网段也是 192.168.100.0/24,VMware 的 VMnet8 也是同样的网段,虚拟机和物理局域网还是互不干涉,因为中间隔了一层 NAT。
VMware 在 NAT 模式里会自带两个服务:虚拟 DHCP 服务和虚拟 NAT 服务。虚拟 DHCP 负责动态下发 IP,虚拟 NAT 负责把虚拟机的流量伪装成宿主机流量发出去。默认情况下,VMnet8 子网的起始地址通常是 192.168.100.128 或者类似段位,具体看 VMware 的随机分配。你可以在 VMware 的“虚拟网络编辑器”里点选 VMnet8,查看子网 IP 和 DHCP 设置,这个界面我在第 5 节还会用到。
固定 IP 在这个模式下最舒服的地方在于:虚拟机的网段是完全由你控制的,系统不会把 192.168.100.200 这样的固定地址分配给其他设备,因为整个网段里只有你的虚拟机。相比桥接模式要担心局域网冲突,NAT 模式只需保证自己网段内不重复即可。
3. CentOS端配置静态IP的完整操作:命令方式和配置文件方式二选一
这一节是全文的核心操作。我会给你两套写法:第一套用 nmcli 命令,推荐优先使用,CentOS 7/8/9 都能跑;第二套直接改 ifcfg 配置文件,适合你更习惯传统做法的场景。两套选一套用就好,不要混着来,否则反而容易触发配置冲突。
3.1 先做三件事:确认网卡名、当前网络、连接名称
配置前必须知道自己机器上的网卡叫什么。很多人照着网上的教程写 ens33,但你的网卡可能是 ens160,也可能是 enp0s3。查网卡名用 ip addr,看当前网络配置用 ip route 和 nmcli con show。
ip addr nmcli con show ip route第一行命令会列出所有网卡和它们的当前地址。你要找到状态是 UP 的那块网卡名。第二行命令显示 NetworkManager 当前管理的连接列表,注意看 CONNECTION 列里那个名字是不是网卡名——经常会出现连接名和网卡名不一样的情况,这叫连接名(Connection Name),是 NetworkManager 的逻辑名称,后面改配置时要用这个连接名而不是设备名。第三行命令看默认路由,确认现在的网关地址是什么。
3.2 用nmcli一把梭:CentOS 7到9通用
假设你的网卡名叫 ens33,想把 IP 固定在 192.168.100.200/24,网关 192.168.100.2,DNS 用网关加一个公共 DNS。打开终端,逐条执行下面命令:
nmcli con mod ens33 ipv4.method manual nmcli con mod ens33 ipv4.addresses 192.168.100.200/24 nmcli con mod ens33 ipv4.gateway 192.168.100.2 nmcli con mod ens33 ipv4.dns "192.168.100.2 223.5.5.5" nmcli con down ens33 nmcli con up ens33第一行就是把连接从 DHCP 改成手动配置。第二行设置 IP 和掩码,必须带 /24 这种前缀长度,不写的话 nmcli 会报错。第三行设网关,第四行设 DNS,注意两个 DNS 之间用空格而不是逗号。最后两行是重启这个连接,让配置立刻生效。
个别情况下,你的连接名不是 ens33,而是系统自动起的 "Wired Connection 1" 之类的名字。这时候把上面命令里的 ens33 全部替换成对应的连接名就好。用 nmcli con mod "Wired Connection 1" 这种方式,最稳妥的判断方法是先执行 nmcli con show 看当前激活的连接名。
配置完成后,看结果:
ip addr show ens33 ping -c 3 192.168.100.2 ping -c 3 223.5.5.5第一条确认 IP 已经变成 192.168.100.200。第二条检查能不能通网关,如果 ping 网关都不通,说明配置或网段有问题;第三条检查外网,如果不通,基本就是 DNS 或 NAT 的问题。
3.3 老派做法:直接改ifcfg文件(也一样有效)
如果你更习惯改文件的方式,或者需要批量部署多台虚拟机,直接编辑 /etc/sysconfig/network-scripts/ifcfg-ens33 也可以。先备份原文件再动手:
cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak vim /etc/sysconfig/network-scripts/ifcfg-ens33文件内容大致改成这样:
TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes NAME=ens33 DEVICE=ens33 ONBOOT=yes IPADDR=192.168.100.200 NETMASK=255.255.255.0 GATEWAY=192.168.100.2 DNS1=192.168.100.2 DNS2=223.5.5.5BOOTPROTO 是关键,必须从 dhcp 改成 static。ONBOOT 必须为 yes,否则开机不启用。IPADDR、NETMASK、GATEWAY、DNS1、DNS2 都是固定 IP 的核心参数。改完后让配置生效:
systemctl restart network # CentOS 7 用法 systemctl restart NetworkManager # CentOS 8 及以上推荐用法这里有个容易犯迷糊的地方:CentOS 8 / CentOS Stream 9 里,network 服务已经被 NetworkManager 取代,service network restart 在某些版本里甚至不存在。所以,最保险的办法是使用 nmcli con reload && nmcli con up ens33 这两个命令来加载并激活配置。这套组合在 CentOS 7 到 9 上都有效。
3.4 学会验证才算配置完
很多时候配置完发现连不上,并不是 IP 没填对,而是没有彻底验证。我会按三个层次来做检查:
- 第一层,检查本机网卡是否拿到了配置。ip addr show ens33 看 IP 和掩码。
- 第二层,检查三层路由是否可用。ping 网关地址,不通就回头查掩码和网关。
- 第三层,检查 DNS 解析是否正常。用 nslookup www.baidu.com 或者 getent hosts www.baidu.com。如果网关能通但域名解析不了,基本就是 DNS 没覆盖到。
养成一个习惯:配完任何网络设置,都主动跑一遍这三个层次的验证。不然你安装半天的软件后发现 yum 源超时,再回头排查网络,浪费的时间比现在这三分钟多得多。
4. 固定IP踩坑实录:三个最容易翻车的隐藏细节
操作步骤看起来简单,实际配置过程中我踩过的坑比教程多得多。下面三个问题,是我在反复配置虚拟机 centos 固定 IP 时最高频踩中的,每一个都有完整的排查路径。
4.1 ifcfg文件和NetworkManager各改各的,谁生效全靠运气
有一次我给 CentOS Stream 9 配固定 IP,老老实实改了 ifcfg-ens33 文件,然后 systemctl restart NetworkManager。结果 ip addr 一看,IP 还是 DHCP 分配的旧地址,配置文件里写的内容像不存在一样。
排查时我首先执行 nmcli con show,发现当前激活的连接名是 "cloud-init ens33 connected ens33"。这个连接名里带着 ens33,但跟设备名不完全一样,说明系统里存在一份由 cloud-init 或者安装器生成的独立连接配置。NetworkManager 优先加载这个连接,而我改的 ifcfg-ens33 文件虽然还在,却没有被这个连接引用。
解决方式有两种。第一种,直接用 nmcli 修改真正生效的连接:
nmcli con mod "ens33" ipv4.method manual nmcli con mod "ens33" ipv4.addresses 192.168.100.200/24 nmcli con mod "ens33" ipv4.gateway 192.168.100.2 nmcli con mod "ens33" ipv4.dns "192.168.100.2 223.5.5.5" nmcli con down "ens33" nmcli con up "ens33"第二种,如果是初装系统还没有业务数据,直接删掉多余连接,删完再重新建立连接。用 nmcli con delete "连接名" 清理。记住:只要系统里存在多个连接配置,就一定会出现配置不生效的情况,排查的前提是先看 nmcli con show 到底有哪些连接在。
4.2 防火墙关了又重启,SSH还是连不上
固定 IP 配好后,从宿主机 SSH 登录虚拟机,发现连接被拒。很多人第一反应就是 systemctl stop firewalld,关了之后确实能连上。问题是,重启虚拟机之后 firewalld 又自己起来了,SSH 再次连不上。
这个坑的本质是 CentOS 的 firewalld 默认开机自启。systemctl stop 只是临时停止,并没有禁用服务。如果只是测试环境,直接禁用它:
systemctl disable firewalld systemctl stop firewalld如果生产环境不想完全关防火墙,那就只放行需要的端口,比如 SSH 的 22 端口:
firewall-cmd --permanent --add-service=ssh firewall-cmd --reload为什么我专门提这个坑?因为 SSH 连不上会给人造成“固定 IP 失败”的错觉。实际上 IP 已经是固定了,只是你无法远程访问而已。排查顺序应该是:先 ping IP 检测网络层,再 telnet IP 22 检测端口,最后才想到问题可能出在防火墙而不是 IP。
4.3 克隆出来的CentOS,两台MAC地址竟然一样
有一次我克隆了几台 CentOS 虚拟机做测试,配置好固定 IP 后发现一个诡异现象:只有一台机能从宿主机 SSH 通,其他几台时通时不通,ping 还经常丢包。用 nmcli con show 检查,IP 都正确。
最后查出来是 MAC 地址冲突。VMware 做“复制虚拟机”而不是“完整克隆”时,新的虚拟机会沿用模板机的网卡 MAC 地址。两台虚拟机在同一个 VMnet8 网段里,ARP 缓存根本分不清谁是谁,流量就会串线。
排查方法很简单,在两台机上分别执行:
cat /sys/class/net/ens33/address如果地址完全相同,说明 MAC 冲突了。解决方法是关掉出问题的虚拟机,在 VMware 虚拟机设置里找到网卡,点击“高级”,把 MAC 地址的“生成”按钮点一下重新生成。也可以在虚拟机内部通过改网卡配置的方式修改 MAC,但 VMware 层面重新生成更干净。为了防止以后再踩这个坑,每次克隆完虚拟机,第一步就检查 MAC,第二步再改 IP。顺序反了会浪费大量的排错时间。
5. 备选思路:DHCP保留地址实现“准固定IP”的玩法
固定 IP 不一定只能靠手动配置。很多场景下,动态分配反而比静态配置更安全,因为不会有 IP 冲突。在 VMware 里,有一种介于 DHCP 和静态 IP 之间的办法:DHCP 保留地址。搜索热词里有“dhcp 分配固定 ip”,指的就是这个思路。
5.1 什么时候该用DHCP保留地址
虚拟机数量一多,比如你有 20 台 CentOS,全部手动配静态 IP,每台都要单独登录改文件,效率低,还容易因为手滑把网关或 DNS 写错。而每台都用纯 DHCP,IP 又会变来变去。DHCP 保留地址的方案是:虚拟机的网卡仍然通过 DHCP 获取地址,但 DHCP 服务器根据你的 MAC 地址,永远只下发同一个 IP。
这个方案最典型的使用场景是实验集群和测试环境。管理端只需要在宿主机维护一张“MAC 地址—IP”对应表,新增虚拟机时不用登录虚机操作系统,也不用担心配错。虚拟机的网络配置保持最简单的 dhcp 模式,系统层面不会有任何“手动 IP”相关的残留配置。
5.2 在VMware里按MAC地址锁定IP的正确姿势
先说结论:VMware Workstation 的图形界面并不能直接做“按 MAC 绑定 IP”的操作,你需要手动编辑 DHCP 配置文件。这个文件在 Windows 宿主机上位于 C:\ProgramData\VMware\vmnetdhcp.conf,在 Linux 宿主机上位于 /etc/vmware/vmnet8/dhcpd/dhcpd.conf。以 Windows 为例,用管理员权限打开这个文件,找到 VMNET8 的 subnet 声明段:
subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.128 192.168.100.254; option broadcast-address 192.168.100.255; option router 192.168.100.2; }在这个 subnet 段内追加类似下面的配置:
host centos-node1 { hardware ethernet 00:0C:29:AB:CD:01; fixed-address 192.168.100.200; } host centos-node2 { hardware ethernet 00:0C:29:AB:CD:02; fixed-address 192.168.100.201; }hardware ethernet 后面填虚拟机的 MAC 地址,fixed-address 填你想固定的 IP。注意这个 IP 要落在 range 范围内,否则 VMware 的 DHCP 服务可能拒绝发地址。保存后,重新开关虚拟网络或重启 VMware 服务,让配置生效。
这个做法我在三节点集群上验证过,稳定程度不输手动静态 IP。唯一要注意的是,修改 dhcpd.conf 前先备份,因为它还管着 VMware 虚拟网络的其他参数,改坏了会导致整个 VMnet8 的 DHCP 服务不可用。
5.3 DHCP保留方案的优劣
优点很明确:集中管理、避免手动配错、系统层面保持最原始的 DHCP 配置。缺点也有:如果你离开了做 DHCP 保留的宿主机,换到另一台宿主机上运行同一个虚拟机,绑定关系会失效;另外,如果 VMware 的 DHCP 服务异常,所有虚拟机都会拿不到地址,而不像静态 IP 那样不受 DHCP 服务影响。
所以我的建议是:两三台虚拟机,直接用第 3 节的手动静态 IP,省事直观;五台以上且经常变动的新机器,用 DHCP 保留地址,维护成本更低。两者都是“固定 IP”的合理实现,选哪种取决于你管理虚拟机的习惯和规模。
6. 配好IP之后顺手做这几件事
固定 IP 配置只是第一步,网络通了不代表环境就稳了。实战里我习惯在确认网络正常后,立刻把下面几件事一并做完,避免后面返工。
6.1 SSH开机自启与主机名固定
固定 IP 解决的是“机器在哪里找”的问题,SSH 服务解决的是“能不能进去”的问题。先确保 sshd 服务开机自启:
systemctl enable sshd systemctl start sshd更推荐的做法是顺手把 hostname 也改了。比如三台虚拟机叫 node1、node2、node3:
hostnamectl set-hostname node1hostname 配合第 6.4 节的 hosts 映射,比记 IP 直观得多,也降低了“IP 没记错为什么连不上”的误解概率。
6.2 网络就绪后立刻拍快照
配好 IP、能 ssh、能 yum 联网的阶段,是虚拟机最干净的快照时机。很多人在这个阶段急着装 Java、MySQL,等软件装到一半发现某个包把网络配置覆盖了,再想回滚已经来不及。我现在的习惯是:CentOS 装完、固定 IP 配好、SSH 能连,三步走完后直接打一个快照,命名成“base-network-ready”。后续实验搞砸了,一条命令就能回到干净状态,比重新装系统省太多时间。
6.3 复制粘贴失效多半是VMware Tools的问题
不少人在虚拟机里复制宿主机内容,发现粘贴不过去,误以为是固定 IP 配置的问题。其实多半是 VMware Tools 没装好。CentOS 上装开源版本最省事:
yum install -y open-vm-tools装完 reboot。没有工具的话,虚拟机分辨率、共享剪贴板、拖拽文件都会受限,这些跟网络固定 IP 是两码事,别混在一起排查。
6.4 在宿主机加一个hosts映射
宿主机如果是 Windows,编辑 C:\Windows\System32\drivers\etc\hosts,加一行:
192.168.100.200 node1 192.168.100.201 node2 192.168.100.202 node3以后在宿主机上直接用 ssh node1 就能连过去,不用再记 IP。这个操作配合固定 IP 使用,等于把整套实验环境的“通讯录”提前整理好,比在浏览器收藏夹里存一堆 vCenter 地址还实用。
踩过几次坑之后,我最大的体会是:固定 IP 这件事,90% 的问题都出在动手之前没想清楚网络拓扑,动手之后又没做好验证。只要先确定好了用 NAT 模式、网段不冲突,再把网关和 DNS 一次写对,整个配置过程其实就三分钟的事。最后建议你配完 IP 之后顺手把 SSH 和快照一起搞定,一套流程走下来,后续做任何实验都会顺畅很多。