手里同时跑着好几台 Ubuntu 虚拟机最烦的就是每次重启后 IP 变了SSH 配置跟着失效服务也连不上。后来我把这台自建的 Git 服务器和测试环境迁到 Hyper-V 上花了一晚上折腾固定 IP总算把网络这块理顺了。这篇就来聊聊在 Hyper-V 里创建 Ubuntu 虚拟机并设置固定 IP 的完整过程包括虚拟交换机的选型、系统安装的坑、netplan 的配置细节以及那些文档里不会写的排查经验。如果你也在用 Hyper-V 跑 Linux 虚拟机或者正准备把测试环境从 VMware 迁过来这篇文章应该能帮你少走不少弯路。1. 方案选型三种虚拟交换机该选哪一种1.1 先搞清楚 Hyper-V 虚拟交换机的三种类型在动手之前先把概念理清楚。Hyper-V 里有三种虚拟交换机分别对应不同的网络模式很多人在固定 IP 配不上之后才发现问题出在交换机类型选错了。外部虚拟交换机External相当于把虚拟机的网卡桥接到宿主机物理网卡上虚拟机跟宿主机所在局域网里的其他设备直接通信。这是“宿主机上网虚拟机也上网其他设备能直接访问虚拟机”的唯一选择。内部虚拟交换机Internal只有宿主机和虚拟机之间可以通信虚拟机无法直接访问外部网络除非你在宿主机上再做一层 NAT 转发后面会讲怎么搞。专用Private不同虚拟机之间能通信但宿主机都进不去基本只用于完全隔离的调试环境。我要设置固定 IP而且这台虚拟机还需要被局域网里的其他机器直接访问比如同事要提交代码到 Git 服务所以自然选外部虚拟交换机。如果你只是自己本机开发用虚拟机只需要跟宿主机通信内部交换机加 NAT 也可以但步骤会多一点。1.2 为什么固定 IP 这么重要DHCP 默认分配的 IP 会变这是个很现实的问题。Hyper-V 的默认 NAT 网段是192.168.137.x重启虚拟机后 DHCP 未必会分配同一个地址给你。一旦地址变了你的 SSH 配置文件、nginx 反代、防火墙规则、数据库连接串全部跟着失效。固定 IP 解决的不仅是“地址稳定”的问题更多是为后续服务化铺路。比如我要把 Ubuntu 虚拟机用作测试服务器需要把 80/443 端口映射到物理机或者给虚拟机绑定一个自定义域名指向固定 IP没有一个稳定地址根本玩不转。1.3 为什么我不推荐直接用默认 NATHyper-V 默认的 NAT 网段是安装 Hyper-V 时自动生成的内部网络它有一个特点只要宿主机重启IP 网段可能变化。这不是你手动改能彻底解决的因为默认交换机的地址分配逻辑是系统管理的。如果你只是临时用一下默认 NAT 无所谓一旦你要做固定 IP老老实实建一个外部交换机把虚拟机的 IP 规划到和宿主机相同的局域网段是风险最小的方案。2. 准备工作启用 Hyper-V、桥接物理网卡、准备镜像2.1 启用 Hyper-V 的两种方式很多人的电脑其实没开 Hyper-V。Windows 10/11 专业版或企业版可以直接在“启用或关闭 Windows 功能”里勾选“Hyper-V”和“Windows 虚拟机监控程序平台”。但你也可以直接用管理员 PowerShell 一次性搞定Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Hyper-V-All完成后重启。注意如果你用的是 Windows 11 家庭版这个功能默认不显示需要特殊处理比如升级系统版本或者用命令行开启有时有效但不保证。Hyper-V 依赖 CPU 虚拟化BIOS 里得先打开 VT-x/AMD-V这一步卡住的概率还挺高。2.2 在 Hyper-V 管理器里创建外部虚拟交换机打开 Hyper-V 管理器右侧找到“虚拟交换机管理器”。新建一个外部交换机名字我建议直接写成ExternalSwitch这种一眼能认出来的别搞什么Switch1后面脚本里引用起来也省心。关键是“连接类型”要选“外部网络”然后在下面的下拉框里选中你宿主机物理网卡一般是“以太网”或“WLAN”。这里有个细节经常被忽略外部交换机会把物理网卡“交给”虚拟交换机管理Windows 桌面上会出现一个“Hyper-V Virtual Ethernet Adapter”的虚拟网卡。勾选“允许管理操作系统共享此网络适配器”宿主机才能正常上网。如果不勾宿主机可能直接断网。旧版 Hyper-V 管理器中这个选项在创建交换机时就有新版默认开启但最好确认一下。PowerShell 创建外部交换机更可靠适合远程操作New-VMSwitch -Name ExternalSwitch -NetAdapterName 以太网 -AllowManagementOS $trueNetAdapterName换成你物理网卡在“控制面板\网络和 Internet\网络连接”里显示的名称。如果名字里有空格注意用引号包好。2.3 Ubuntu 镜像选 LTS 还是 Interim镜像这块我的建议是生产或测试环境一律用 LTS 版本比如 Ubuntu 22.04 LTS 或 24.04 LTS。LTS 有五年更新支持踩坑的解决方案也最多。非 LTS 的版本除非你有特殊需求否则别碰。下载镜像时直接去 Ubuntu 官网下载桌面版或服务器版 ISO。服务器版没有图形界面但占用资源小适合跑服务。如果你想要桌面环境就下桌面版后面配置固定 IP 的方法一模一样。3. 创建 Ubuntu 虚拟机从“新建虚拟机向导”到“系统安装”3.1 用 Hyper-V 管理器图形化创建Hyper-V 管理器右侧菜单点“新建” - “虚拟机”跟向导走。几个关键地方代数建议选“第二代Generation 2”。它支持 UEFI 启动安装 Ubuntu 22.04/24.04 都很顺畅而且磁盘性能和兼容性都更好。内存跑桌面环境至少 4GB如果只是命令行服务器2GB 也够。想省内存就把“动态内存”打开但这玩意儿对固定 IP 没有影响不影响后面的配置。网络连接的时候选你刚才创建的ExternalSwitch这一步别漏了很多人用默认的“未连接”装完系统才发现没有网卡。虚拟硬盘默认 127GB 动态扩展盘够用。想自定义就自己改大小建议至少 30GB。向导结束后在虚拟机的“设置”里把刚才下载的 Ubuntu ISO 挂载到 DVD 驱动器然后启动虚拟机。3.2 安装 Ubuntu 的几个关键选择Ubuntu 安装界面出现后选“Install Ubuntu”或“Try or Install Ubuntu”一路往下。到“Installation type”时选“Erase disk and install Ubuntu”就行因为虚拟机里没有别的东西没必要手动分区。有一个地方我建议切一下就是“Software selection”时选“Minimal installation”别选完整的桌面安装能省下不少时间。如果你的机器只用来跑服务选“Install OpenSSH server”那个勾选框装完就能直接 SSH省得再补装。系统装完重启的时候记得把虚拟机的 DVD 驱动器里的 ISO 移除不然有可能再次进入安装界面。3.3 装完系统后的第一件事确认网卡状态进系统后先用ip addr或者ip a看看网卡有没有起来。如果你创建虚拟机时选了外部交换机这里应该能看到一个eth0或enp1s0之类的网卡并且拿到了局域网里的 IP。如果网卡是 DOWN 的状态手动拉起来sudo ip link set eth0 up或者直接重启网络服务sudo systemctl restart systemd-networkd如果这里就看不到 IP说明交换机类型选错了或者物理网卡桥接有问题。先回去检查外部交换机的绑定网卡别急着配固定 IP。4. 核心环节用 netplan 给 Ubuntu 设置固定 IP4.1 先搞清楚你用的 Ubuntu 版本不同 Ubuntu 版本网络配置方式不一样这是最容易搞混的地方。Ubuntu 18.04 开始用netplan配置文件在/etc/netplan/目录下文件名通常是01-netcfg.yaml或00-installer-config.yaml。Ubuntu 20.04/22.04/24.04 全部走 netplan所以下面这套方法对这些版本都适用。如果是 Ubuntu 16.04 及更早版本用的是/etc/network/interfaces但你这会儿不应该还在用这么老的系统了吧。查看当前生效的网卡名和 IP先执行ip addr一般你会看到eth0虚拟机里最常见、enp1s0、ens33这类名字。记下你网卡的真实名字后面 YAML 文件里要写。4.2 编辑 netplan 配置文件找到你的配置文件ls /etc/netplan/假设文件是00-installer-config.yaml先备份再编辑sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak sudo nano /etc/netplan/00-installer-config.yaml默认内容大概是这样的network: version: 2 renderer: networkd ethernets: eth0: dhcp4: true把它改成network: version: 2 renderer: networkd ethernets: eth0: dhcp4: false addresses: - 192.168.1.100/24 routes: - to: default via: 192.168.1.1 nameservers: addresses: - 192.168.1.1 - 223.5.5.5这里要解释一下几个关键参数免得大家照抄完不知道自己改了什么dhcp4: false关掉 DHCP表示我们要用静态地址。addresses你想要的固定 IP注意一定要带掩码/24。如果不带netplan 会直接报错或者用默认的/32导致路由异常。routes默认路由via是网关地址。网关必须和你的 IP 在同一网段且指向你物理路由器或局域网网关。nameserversDNS 服务器。第一个可以填网关地址第二个填223.5.5.5国内可用性比较好。如果你对局域网网段不确定先在原来 DHCP 状态下用ip route和ip addr查一下看当前网关是多少、网段是多少。4.3 应用配置并验证保存文件后执行sudo netplan apply没有报错就说明配置语法没问题。然后用ip addr确认 IP 是否变成了你设置的值再 ping 一下网关ping -c 4 192.168.1.1能通说明局域网没问题。再测试一下 DNSping -c 4 223.5.5.5能通说明外网没问题。如果外网通但域名解析失败重点检查nameservers配置。注意netplan apply只会应用网络配置如果 SSH 连接断了不要再通过宿主机控制台操作重新连接新 IP 就行。这也是为什么我建议先把新 IP 记下来不要改完自己都忘了。4.4 用可视化界面配置的另一种路径如果你安装的是 Ubuntu 桌面版也可以直接通过“设置” - “网络” - 齿轮图标 - IPv4 选项卡里把方式从“自动 (DHCP)”改成“手动”填上地址、掩码、网关和 DNS。这个方法对新手更友好但本质还是改 netplan只不过系统帮你生成了配置。我个人更推荐直接改 YAML因为你在无桌面环境的服务器上也能操作而且脚本化、自动化也方便。4.5 备用方案内部交换机 宿主机 NAT如果你的虚拟机只需要宿主机访问不需要局域网其他设备直接访问那用“内部虚拟交换机 宿主机 NAT”也是一个选择它更安全一点毕竟外部网段的人看不到你的虚拟机。创建内部交换机后虚拟机的静态 IP 可以设为192.168.131.100/24网段随意只要和 Windows 宿主机上的虚拟网卡同网段即可。然后在 Windows 宿主机上开启 Internet 连接共享ICS把物理网卡的网络共享给内部虚拟网卡。这样虚拟机可以上外网但局域网其他设备访问不了它。这个方案也能设置固定 IP但网络拓扑多了一层 NAT性能略有损耗。两种方案的对比我整理在下表里场景外部交换机 静态 IP内部交换机 NAT局域网其他设备访问虚拟机可以不可以虚拟机访问外网可以可以需要配置 ICS宿主机访问虚拟机可以可以配置复杂度低中安全性较低暴露在同一网段较高隔离在内部网络大多数情况下我都建议用外部交换机简单直接。只有在多虚拟机测试隔离网络时才考虑内部交换机。5. 踩坑记录固定 IP 配置中的常见问题与排查技巧5.1 问题速查表现象可能原因解决方法netplan apply报错YAML 缩进错误、网卡名字错用netplan try先测试出错会自动回滚配置后 IP 没变网卡名不对或系统用了 NetworkManager检查网卡真实名称桌面版可能需要配置 renderer 为 NetworkManager虚拟机可以上网局域网其他设备访问不了外部交换机没有桥接物理网卡检查虚拟交换机设置确认绑定的是正确的物理网卡宿主机断网没有勾选“允许管理操作系统共享此网络适配器”重新编辑交换机勾选该选项ping 网关通ping 外网不通默认路由缺失检查 routes 里的to: default和via是否正确ping IP 通ping 域名不通DNS 配置错误检查 nameservers可以临时用223.5.5.5测试重启后 IP 变回 DHCPnetplan 配置没保存或 apply 后没生效重新编辑 YAML确认dhcp4: false重启后再看SSH 连接被拒SSH 服务没装或防火墙挡了安装 openssh-server确认 22 端口开放虚拟机无法启动 UbuntuGen2 虚拟机安全启动问题虚拟机设置里关闭“安全启动”或用 Gen1 重建克隆虚拟机后 IP 冲突MAC 地址或 IP 重复重新生成 MAC 地址修改 IP5.2 缩进问题——最容易被忽略的 YAML 陷阱netplan 用 YAML 格式YAML 对缩进极其敏感。我见过太多人写配置时addresses前面少了一个空格或者-和内容中间没加空格结果netplan apply直接报错。一个稳妥的办法先用sudo netplan try而不是apply。这个命令会先验证配置如果 120 秒内没人确认它还会自动回滚非常安全。sudo netplan try确认无误后它会提示应用配置再按回车确认。5.3 SSH 连不上先看防火墙设置固定 IP 后 SSH 连不上原因一般有三个SSH 服务没开、防火墙挡了 22 端口、或者你新 IP 记错了。排查顺序systemctl status sshd sudo ufw status sudo ufw allow 22/tcp如果之前用的是 Ubuntu 桌面版防火墙默认可能是关闭的问题基本出在服务或者网络配置上。5.4 克隆虚拟机后的 IP 冲突问题做实验时我经常克隆虚拟机克隆出来的虚拟机如果是 DHCP 模式大概率会自动拿到新 IP没问题但如果两台都是固定 IP且克隆时没改 MAC 地址和 IP那它们就会冲突后面那台虚拟机可能直接断网。正确做法是克隆后先在新虚拟机的设置里“清除”原有 MAC 地址并重新生成或者用macchanger修改虚拟机内部网卡 MAC然后改掉 netplan 里的 IP。固定 IP 和 MAC 绑定是配套的改了 MAC 不改 IP 一样不行。5.5 Windows 11 家庭版没有 Hyper-V 的替代思路总有人问 Windows 11 家庭版找不到 Hyper-V 怎么办。除了升级专业版还有一个思路是用 VMware Workstation Player 或 VirtualBox 跑 Ubuntu它们的创建和配置流程跟 Hyper-V 略有不同但固定 IP 的原理一样最终都是在 Ubuntu 里配置静态网络。如果你不是非 Hyper-V 不可用 VMware 也可以我后面有机会再单独写一篇。6. 一些我自己的经验和新手容易忽略的细节6.1 配置固定 IP 的最佳时机我的建议是装完系统、改完国内软件源之后第一件事就是配固定 IP。很多人习惯先把环境搭起来再回头配网络结果环境里到处写的是 DHCP 分配的临时 IP后面改起来烦死。趁系统还干净直接把 IP 固定下来之后所有服务都基于这个 IP 配置一劳永逸。6.2 备份永远不嫌多改 netplan 之前永远先备份一份原始配置。这个习惯帮我救回了很多次手滑sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.bak如果哪天你改坏了恢复起来就是一条cp命令的事。6.3 如果想彻底防止 IP 漂移MAC 地址也可以固定在 Hyper-V 的设置里高级选项 - 网络适配器 - 静态 MAC 地址可以给虚拟机指定一个固定的 MAC 地址。把这步做了之后即使你把虚拟机的虚拟网卡删了重建只要 MAC 不变IP 固定配置大概率还是有效的。这是因为外部交换机网桥对虚拟机的识别有一部分依赖于 MAC 地址。6.4 网卡名混乱的问题有些 Ubuntu 版本里网卡名不是eth0而是enp1s0、enp2s0这种。你在写 netplan 时千万不要想当然必须先用ip addr看清楚。用错网卡名配置虽然能 apply但根本不生效还会让你十分困惑。6.5 多虚拟机场景的 IP 规划建议如果你像我一样在同一台 Hyper-V 上跑好几台 Ubuntu建议做一张 IP 规划表比如192.168.1.100Git 服务器192.168.1.101CI 构建机192.168.1.102测试数据库这样后续维护防火墙规则、nginx 反代、端口映射的时候脑子里就清楚得多。不要等到机器多了IP 随手一配最后连自己都不知道哪台是哪台。7. 最后再分享一个实用技巧用宿主机定时检查虚拟机连通性我自己的使用习惯是给固定 IP 配好之后在 Windows 宿主机上写一个简单的 PowerShell 脚本每隔几分钟 ping 一下虚拟机地址不通就发一条通知。这样即使虚拟网络出了故障宿主机这里也能第一时间知道。$vmIP 192.168.1.100 if (-not (Test-Connection -ComputerName $vmIP -Count 1 -Quiet)) { Write-Host 虚拟机 $vmIP 无法访问请检查网络或系统状态 }脚本可以挂在“任务计划程序”里作为定时任务。这个东西不复杂但对长期运维的人来说特别有用毕竟固定 IP 配好之后最怕的就是网络哪天悄悄出问题而你到了想连的时候才发现。整体来看Hyper-V 里给 Ubuntu 配置固定 IP 的核心就三步建一个外部虚拟交换机装 Ubuntu 时选择正确的网络安装完成后用 netplan 把静态 IP 写进去。原理清楚了后面不管放在什么环境下都适用。我自己踩过的坑是配置缩进和交换机类型选错这两点你留意一下基本能顺利走完整个流程。