尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
解决虚拟机IP漂移:手把手配置静态IP(CentOS/Ubuntu)
前端项目连着虚拟机里的Redis和MySQL改着改着突然连不上了。查半天不是代码问题是虚拟机的IP又变了——上一秒还是192.168.187.129重启一下变成192.168.187.132再过会儿又跳到192.168.187.135。所有配置文件里写死的地址全部作废这应该是不少人在跑点评类实战项目时都撞过的墙。虚拟机默认走DHCP动态拿地址只要遇到重启、快照回滚、网卡重置IP就可能漂走手动改回来很快又会漂。这篇文章我会把“改成固定IP”这件事从头到尾捋清楚为什么会漂、固定IP前要看哪几个参数、CentOS和Ubuntu分别怎么配、配完怎么验证再把踩过的坑和排查思路一并写出来。内容不绕弯子直接对着操作来就行。1. 先搞明白IP为什么会“漂”再动手改很多人一上来就搜“如何设置静态IP”搜到教程就照着改改完确实固定了但遇到复制虚拟机或点了某个重置按钮后IP又变了。这时候不懂原理就会很懵。所以第一步不是改配置而是把IP漂移的机制弄明白。1.1 虚拟机的IP是从哪来的在VMware里最常见的网络模式是NAT。它的逻辑可以这样理解VMware在Windows宿主机上虚拟出一块网卡相当于一个内部小交换机虚拟机所有网卡都接在这台“小交换机”上。这个虚拟网络的网段默认是192.168.x.0网关一般是192.168.x.2宿主机对应一块192.168.x.1的虚拟网卡。问题是虚拟机开机时自己并不知道该用哪个IP它得向这个虚拟网络里的DHCP服务申请地址。VMware在安装时自带了一个轻量级DHCP服务虚拟机网卡一启动就发广播“给我个地址。”DHCP服务就从地址池里挑一个空闲IP分给它同时附上租期。这个流程和公司办公室里的路由器分配IP没有任何区别只是把设备从手机换成了虚拟机。1.2 DHCP租约到期或重连就是IP漂移的根源DHCP分配的IP不是永久绑定的它有一个“租约”概念。你可以把DHCP服务器想象成酒店前台虚拟机每次入住登记前台随机分配一个房间号并说明住多久。租期内续住没问题但一旦退房再重新登记或者前台觉得租约到期了要重新分配房号就可能换。具体到VMware场景下面几种操作都会触发重新分配虚拟机重启Linux里的DHCP客户端重新请求地址虚拟机挂起后再恢复网络连接重建恢复快照或复制虚拟机网卡状态回到历史节点可能重新匹配在虚拟机设置里点了“重置”网卡MAC地址都换了DHCP自然按新设备分配虚拟网络编辑器里DHCP租期被人为调短比如改成30分钟那IP就会高频变动。MAC地址是这里的关键。DHCP服务器分配IP时通常会按MAC记忆同一个MAC来过优先分配上次同一个地址。但如果MAC都变了或者DHCP服务本身重启后缓存丢失前台的“会员记忆”失效IP就散了。1.3 为什么有的机器IP一直没变过很多人会有疑问“我的虚拟机从来没改过为什么IP一直稳定”这是因为DHCP会优先尝试续租旧地址。虚拟机重启时DHCP客户端会带着原IP去请求续租只要地址池没冲突服务器大概率会把同一个IP还给你。但这只是“大概率”不是承诺。地址池被占用、快照回滚到不同网络状态、VMware服务重启等因素都会打破这种稳定。所以正确心态是在本地开发环境里DHCP带来的“随机稳定性”不可靠想要一劳永逸要么在Linux端配置静态IP要么在VMware层面对某台虚拟机做固定分配。后者配置入口藏得比较深绝大多数场景下直接在Linux里写死IP是最高效的方案。2. 固定IP前的关键准备看清网段、网关和地址池固定IP不是随便拿个数字填进去就行。填错了轻则虚拟机没网重则和宿主机或其它设备冲突。改配置之前有三项信息必须先查清楚子网网段、网关IP、DHCP地址池范围。2.1 在VMware里查NAT网段和网关打开VMware Workstation菜单栏点“编辑”-“虚拟网络编辑器”。在列表里找到VMnet8注意它对应的网络模式要显示“NAT”。选中后右侧能看到“子网IP”和“子网掩码”比如子网IP192.168.187.0子网掩码255.255.255.0记下这个网段后面所有IP都必须在这个网段里。接着点右下角“NAT设置”弹窗里会显示“网关IP”常见是192.168.187.2。这个就是虚拟机出网的默认网关配置静态IP时要和它保持一致。2.2 查DHCP地址池决定静态IP取值在虚拟网络编辑器里点击“DHCP设置”会看到起始IP和结束IP。VMware默认通常是从128开始到254结束。这一步很多人会忽略直接填一个像192.168.187.200这样的地址。如果200正好落在DHCP池内就可能和DHCP分配的地址冲突。虽然DHCP服务器一般情况下会先检查冲突但本地测试环境里这种事情并不罕见尤其在多个虚拟机同时开的时候。正确的取法是在网关与DHCP起始地址之间选一个空闲IP。例如网关是.2DHCP池从.128开始那静态IP可以取.100、.110、.120这种。这里给你一份对照参考项目建议值说明子网掩码255.255.255.0与VMware虚拟网络一致网关192.168.x.2在虚拟网络编辑器NAT设置里查看静态IP192.168.x.100避开DHCP池起始地址如128DNS114.114.114.114 / 223.5.5.5国内公共DNS或网关地址注意不要在虚拟网络编辑器里随意修改子网IP。改了之后整个网段变化所有虚拟机的IP都要重新适配而且宿主机相关配置也会乱属于给自己挖坑。2.3 改之前确认网络模式还有一点基础但容易出错虚拟机网络适配器必须选择“NAT模式”。右键虚拟机-设置-网络适配器勾选“NAT”。如果你当前选的是“仅主机模式”那么虚拟机只能和宿主机通信不能访问外网如果是“桥接模式”IP会直接从路由器获取这时去配置192.168.187.x反而可能不通。本文所有操作建立在NAT模式下。3. 实操CentOS和Ubuntu固定IP手把手配置信息查完之后进入正式配置。这里分别覆盖CentOS系和Ubuntu系的常见做法。不要只抄一种根据自己的系统选择对应章节。3.1 第一步确认虚拟机里的网卡名和当前IP在虚拟机终端执行ip addr输出里找到一个以ens、eth或enp开头的网卡比如ens33、ens160这就是你的物理网卡。同时记下当前IP确认它在VMware虚拟网络编辑器查到的同一网段内。如果当前IP完全不在这个网段说明网络模式可能选错了先回到2.3检查。3.2 CentOS 7/8/Stream 配置静态IPCentOS配置网卡的经典路径是编辑/etc/sysconfig/network-scripts/下的ifcfg文件。文件名通常和网卡名对应比如ifcfg-ens33。先备份再修改sudo cp /etc/sysconfig/network-scripts/ifcfg-ens33 /etc/sysconfig/network-scripts/ifcfg-ens33.bak sudo vi /etc/sysconfig/network-scripts/ifcfg-ens33核心要改动和新增的字段如下TYPEEthernet BOOTPROTOstatic NAMEens33 DEVICEens33 ONBOOTyes IPADDR192.168.187.100 NETMASK255.255.255.0 GATEWAY192.168.187.2 DNS1114.114.114.114 DNS2223.5.5.5字段含义逐一说清楚BOOTPROTOstatic把协议从dhcp改为static这是最关键的一行ONBOOTyes开机自动启用网卡必须设置否则重启后网卡不工作IPADDR你选定的静态IPNETMASK子网掩码一般就是255.255.255.0GATEWAY虚拟网络的网关要和VMware NAT设置里保持一致DNS1/DNS2建议填国内公共DNS方便虚拟机访问外网。有些机器ifcfg文件里还带着UUIDxxxx和HWADDRxx:xx:xx:xx:xx:xx保留原值即可不要删。HWADDR对应的是网卡MAC写错会导致网络起不来。保存退出后重启网络。CentOS 7常用命令sudo systemctl restart networkCentOS 8或Stream版本里传统network服务可能已经被废弃推荐用NetworkManager管理sudo nmcli connection reload sudo nmcli connection up ens33如果嫌编辑文件麻烦CentOS完全可以不走ifcfg直接用nmcli命令完成同样配置sudo nmcli connection modify ens33 ipv4.method manual ipv4.addresses 192.168.187.100/24 ipv4.gateway 192.168.187.2 ipv4.dns 114.114.114.114 223.5.5.5 sudo nmcli connection up ens33这种方式更不容易踩到NetworkManager接管网卡的坑适合不想折腾文件细节的人。3.3 Ubuntu 18.04 配置静态IPnetplan方案Ubuntu新版使用netplan管理网络配置文件在/etc/netplan/目录下常见文件名有00-installer-config.yaml、01-network-manager-all.yaml。先查看实际文件ls /etc/netplan/ sudo cat /etc/netplan/00-installer-config.yaml编辑前同样备份。以Ubuntu 20.04/22.04为例将配置改成network: version: 2 ethernets: ens33: dhcp4: false addresses: - 192.168.187.100/24 routes: - to: default via: 192.168.187.2 nameservers: addresses: - 114.114.114.114 - 223.5.5.5务必注意YAML对缩进极其敏感不能用Tab键必须用空格。不同网卡名称对应ethernets下的键名比如是ens33就写ens33。routes里via是网关地址。如果没有routes这段虚拟机可能配置完静态IP后能ping通内网但上不了外网。保存后执行sudo netplan apply没有任何报错说明配置已生效。如果提示Invalid YAML基本就是缩进问题回到文件检查冒号后面是否有空格、层级是否对齐。有时候Ubuntu桌面版会用NetworkManager接管网络netplan apply后IP没有变化可以再执行sudo systemctl restart NetworkManager3.4 修改后验证不只ping还要重启验证配置改完先看IP是否生效ip addr show ens33确认当前的IP已经变成192.168.187.100。接着依次验证网关和外网ping -c 4 192.168.187.2 ping -c 4 114.114.114.114第一跳通了说明静态IP和网关没问题第二跳通了说明DNS和路由没问题。这里要特别提醒不要只看IP显示就以为大功告成必须重启一次虚拟机再确认IP没变。很多人的情况是systemctl restart network后IP正常但一reboot又回到DHCP原因通常是BOOTPROTO没改干净或者NetworkManager配置文件干扰。重启后再执行ip addr确认地址仍然是192.168.187.100这才是完整闭环。4. IP固定之后点评类项目的连接方式再优化一步IP固定只是第一步。真正项目中每次IP变化要改的配置文件远比想象中多。把IP固定之后我还建议顺手做一次连接方式的收尾让开发体验更顺。4.1 每次IP变化到底会牵动哪些文件以典型的点评类项目为例后端服务通常部署在Windows宿主机上通过虚拟机里的Redis、MySQL、Nginx等服务做数据存储和反向代理。IP一变至少下面几处要跟着改application.yml或application.properties里的Redis地址同一文件里的MySQL数据库地址前端项目请求后端接口的BaseURLNginx反向代理配置里指向后端服务的地址如果用了Docker容器容器内的环境变量也可能写死IP。这些地方散落在不同项目、不同配置文件里改漏一个系统跑起来就是各种超时和连接拒绝。换成固定IP后这个问题从源头消失但为了以后部署到云服务器时省事连接方式还可以更优雅一点。4.2 用hosts把IP映射成域名配置里不直接写IP方法很简单在Windows宿主机的C:\Windows\System32\drivers\etc\hosts文件末尾加一行192.168.187.100 vm-dev.local然后在项目配置文件里凡是原本写192.168.187.100的地方全部换成vm-dev.local。比如spring: redis: host: vm-dev.local port: 6379 datasource: url: jdbc:mysql://vm-dev.local:3306/dianping?useSSLfalse这样做的好处显而易见当虚拟机IP真的再次变化时只需要改hosts里一行项目代码完全不用动。以后部署到云服务器也只需要把hosts指向换成云服务器IP业务代码原封不动。这个习惯越早养成越省心。需要注意的是修改Windows hosts文件需要管理员权限。建议先用文本编辑器打开hosts再以管理员身份运行编辑器保存否则容易被系统拒绝写入。虚拟机内如果也要访问某个服务域名同样可以修改/etc/hosts。4.3 两个容易让固定IP前功尽弃的操作IP改好之后大部分人会很顺利但有两个操作会让配置一夜回到解放前。第一个是在VMware的“虚拟机设置 - 网络适配器 - 高级”里点“重置”。这个按钮会重新生成虚拟网卡的MAC地址也就是说你的网卡对系统来说变成了一块新网卡。就算你在Linux里配置的是静态IP新网卡对应的是新配置文件原来的静态配置不会自动生效系统会重新走一遍DHCP。我的建议是除非明确知道自己在做什么否则永远不要点这个重置。第二个是复制虚拟机。直接复制一份虚拟机文件后打开VMware通常会检测到这是副本并提示“我已复制该虚拟机”。如果你选择了“复制”VMware会重新生成MAC地址新虚拟机又会变成一个DHCP新设备。复制前最好先把原虚拟机的网络改成静态IP并提前给副本规划好一个不同IP复制后进入副本系统修改网卡配置IP为新值再重启网络这样两台机器才能同时在线且不冲突。5. 实战中翻过车的排查思路与速查表配置静态IP看起来简单但真到动手的时候每个人遇到的报错五花八门。这里把最常见的几类坑按场景整理出来遇到问题可以直接对照着查。5.1 重启网络服务失败命令报错现象执行systemctl restart network后提示Job for network.service failed网络直接断掉。原因1CentOS 8以上版本已经移除了老旧的network.service改用NetworkManager。这种情况不要死磕network命令直接用nmcli connection reload和nmcli connection up 网卡名。原因2ifcfg文件里IPADDR或GATEWAY填错比如网关写成了192.168.187.1。记住VMware NAT模式下网关通常以.2结尾不是.1。原因3UUID重复或者HWADDR被误改。备份过原文件的话直接diff对比一下。5.2 宿主机ping不通虚拟机先确认虚拟机内部能ping通网关和外网如果能ping通外部但宿主机ping不通多半是Windows防火墙拦了ICMP临时放行或检查防火墙规则即可本地开发环境可适当放宽。如果虚拟机内部连网关都ping不通多半是VMware NAT服务没运行。Windows上打开服务管理器找到“VMware NAT Service”确认状态是“正在运行”。检查虚拟机网络适配器是否还是NAT模式。有人配置过程中顺手改成了“仅主机模式”表现形式就是内网通外网不通。5.3 改完静态IP后自动变成169.254.x.x这个地址是操作系统在没有拿到有效IP时自动生成的保留地址。看到169.254开头的IP说明配置根本没生效。优先检查两件事ONBOOTyes是否写上没有的话网卡开机不启动是否真的重启了网络服务特别是Ubuntu执行netplan apply后是否出现YAML报错。5.4 常见问题速查表问题可能原因排查方向IP没变还是原来的动态地址BOOTPROTO没改成static或NetworkManager配置覆盖检查ifcfg文件用nmcli命令重设内网能通外网不通网关或路由缺失检查GATEWAY确认指向192.168.x.2能ping通IPping不通域名DNS配置错误检查DNS1/DNS2改为公共DNSUbuntu执行netplan报错YAML缩进错误检查空格、冒号、层级对齐虚拟机复制后两台IP相同MAC重复或快照恢复重置MAC后分别设置不同静态IPWindows hosts配置无效hosts文件被缓存或权限不够用管理员权限修改执行ipconfig /flushdns配置完这些之后我个人最深的体会是固定IP本身不复杂复杂的是一套环境里有太多变量。如果你正在跑的点评类项目已经连了好几个服务建议把IP、网关、DNS这些信息单独存到一个说明文件里放在项目目录下。以后换机器、换网络、重建虚拟机照着说明就能快速恢复环境不用再靠记忆到处翻配置。再讲究一点就把hosts域名映射这个习惯一并用上项目代码永远只写域名不写IP网络环境怎么变都不慌。
RELATED

相关推荐

open-code-review:构建自动化代码评审工作流

open-code-review:构建自动化代码评审工作流

1. 代码评审这件事,大部分团队卡在了同一个地方先说个我见过的普遍现象:很多团队不是没有代码评审,而是把评审做成了“通知”。PR 一提交,reviewer 被系统随机点名,或者默认 给技术组长。忙的人会拖到周五下午才打开 …

📅 2026/10/19 14:04:08
从零构建代码评审自动化机器人:open-code-review 实战与避坑指南

从零构建代码评审自动化机器人:open-code-review 实战与避坑指南

"open-code-review"是我最近在公司内部开源的一个代码评审辅助工具项目。说白了,它就是一个跑在你代码仓库旁边的机器人:每当有人提交 Pull Request,它自动拉取变更内容,按照你预先定义的规则跑一遍检查,然后…

📅 2026/10/19 14:04:08
开源代码评审工具open-code-review:轻量自托管,专注代码审查

开源代码评审工具open-code-review:轻量自托管,专注代码审查

1. 项目概述与设计初衷1.1 为什么我自己动手做了个评审工具代码评审是软件工程里最“贵”也最“值”的环节。说它贵,是因为一次认真评审往往要花掉开发者半小时甚至更久,评审人需要在几百行的diff里翻找上下文,反复切换文件确认调用链&#x…

📅 2026/10/19 14:04:08
MORE NEWS

更多资讯

📰

2026图文带货必备:五款AI去水印与图文排版工具实测

2026年了,做自媒体已经不是“能拍会剪”就能混下去的阶段了。素材从哪来、怎么处理成自己的东西、怎么把图文内容做出转化,每一个环节都在考验效率。尤其搞图文带货的同行,每天要过手几十张商品图,去水印、抠背景、排卡片、配文案…

📰

Windows下Docker部署openclaw:从环境配置到迁移实战

前阵子要给 openclaw 换部署环境,折腾的过程中发现一个问题:网上关于 Windows 平台用 Docker 部署 openclaw 的资料很少,而且大多数写得模棱两可。我花了一个下午,在一台只装了 Docker Desktop 的 Windows 机器上,把 o…

📰

本地化AI工作流:OpenAI协议兼容的私有化部署实践

1. 这不是“平替”,是重新定义AI工作流的本地化主权实践“彻底告别每月$100刀”——这句话在2024年中后期的开发者圈子里,已经不是一句营销口号,而是一群人用真实硬件、真实日志、真实掉发换来的共识。我亲眼见过某高校实验室的A同学&#xf…

📰

校园食堂订餐系统毕业设计:Java+Spring Boot+MySQL完整实战指南

做校园食堂订餐系统的毕业设计,很多同学一开始都觉得"不就是个点餐网站吗",真上手才发现,从选题到答辩,处处是坑。选题太大会做不完,数据库设计不合理会越改越乱,版本兼容问题能折腾你一下午&…

📰

MySQL事务底层机制:从redo/undo到MVCC与锁的实践解析

先用一个场景把问题说清楚:你在秒杀系统里扣库存,业务逻辑往往是“先查库存,再写订单,最后扣减库存”。如果这三步中间任何一步失败,前面成功的数据都要一并撤销,否则就会出现“订单生成了,库存…

📰

大模型重塑移动端自动化测试:从痛点破局到智能落地实践

1. 痛点复盘:自动化测试投入产出比为何逐年恶化做了几年移动端测试的同学,多半都会有同一个感受:自动化框架越搭越完善,脚本数量越来越多,但真正节省的时间反而越来越少,维护成本倒是肉眼可见地往上涨。这个…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬