1. 项目概述:宿主机为虚拟机创建子网络
在虚拟化环境中,宿主机为虚拟机创建独立的子网络是一项基础但关键的技能。我最近在部署多虚拟机开发环境时,就遇到了需要让虚拟机既能访问外网,又能相互通信的需求。通过NAT模式配合自定义虚拟网络,最终实现了这个目标。下面分享具体实现方法和踩坑经验。
2. 网络架构设计思路
2.1 为什么需要子网络
当宿主机运行多个虚拟机时,默认的NAT模式会让每个虚拟机获得独立IP,但虚拟机间无法直接通信。而桥接模式虽然能让虚拟机加入物理网络,但会占用大量IP地址。创建子网络可以完美解决这两个问题:
- 虚拟机共享宿主机的一个外网IP(通过NAT)
- 虚拟机间通过子网IP直接通信
- 不占用物理网络的IP资源
2.2 三种实现方案对比
| 方案 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| NAT+虚拟交换机 | 配置简单,隔离性好 | 需要手动设置IP | 小型开发环境 |
| Linux Bridge | 性能好,延迟低 | 需要root权限 | 生产环境 |
| Open vSwitch | 功能强大,支持VLAN | 配置复杂 | 企业级虚拟化 |
我选择了第一种方案,因为:
- 不需要特殊权限
- 配置过程可视化
- 适合个人开发使用
3. 具体实现步骤
3.1 环境准备
- 宿主机:Windows 10专业版
- 虚拟化平台:VMware Workstation 16 Pro
- 虚拟机:Ubuntu 20.04 LTS × 2
注意:家庭版Windows可能缺少某些网络功能,建议使用专业版或企业版。
3.2 创建虚拟网络
- 打开VMware → 编辑 → 虚拟网络编辑器
- 点击"更改设置"获取管理员权限
- 添加新的网络(我选择VMnet2)
- 设置子网IP:192.168.100.0
- 子网掩码:255.255.255.0
- 勾选"将主机虚拟适配器连接到此网络"
- NAT设置中确保启用了DHCP
关键参数说明:
- 子网IP不要与现有网络冲突
- 建议使用192.168.x.0/24这类私有地址段
- DHCP范围避开前20个IP(留给静态分配)
3.3 配置虚拟机网络
对每个虚拟机进行以下设置:
- 右键虚拟机 → 设置
- 网络适配器 → 自定义:选择刚创建的VMnet2
- 在虚拟机内部配置网络:
bash复制添加配置:# Ubuntu示例 sudo nano /etc/netplan/00-installer-config.yamlyaml复制network: ethernets: ens33: dhcp4: yes version: 2 - 应用配置:
bash复制sudo netplan apply
4. 网络测试与验证
4.1 基础连通性测试
- 虚拟机访问外网:
bash复制
ping 8.8.8.8 - 宿主机ping虚拟机:
powershell复制ping 192.168.100.128 - 虚拟机互ping:
bash复制
ping 192.168.100.129
4.2 常见问题排查
问题1:虚拟机无法获取IP
- 检查DHCP是否启用
- 确认虚拟网络编辑器中的子网设置
- 重启虚拟机网络服务:
bash复制sudo systemctl restart systemd-networkd
问题2:宿主机无法ping通虚拟机
- 检查Windows防火墙设置
- 确认VMware相关服务已启动
- 尝试禁用再启用虚拟网卡
问题3:虚拟机间通信延迟高
- 检查是否启用了虚拟化加速
- 调整虚拟机内存分配
- 考虑使用Linux Bridge替代标准虚拟交换机
5. 高级配置技巧
5.1 静态IP分配
对于需要固定IP的虚拟机,修改netplan配置:
yaml复制network:
ethernets:
ens33:
addresses: [192.168.100.10/24]
gateway4: 192.168.100.1
nameservers:
addresses: [8.8.8.8, 8.8.4.4]
version: 2
5.2 端口转发设置
如果需要从外部访问虚拟机服务:
- 虚拟网络编辑器 → NAT设置
- 添加端口转发规则
- 例如将宿主机8080转发到虚拟机80端口
5.3 多子网隔离
通过创建多个虚拟网络(如VMnet2、VMnet3),可以实现不同虚拟机组的网络隔离,这在以下场景特别有用:
- 开发环境和测试环境分离
- 不同项目组的网络隔离
- 安全等级不同的系统隔离
6. 性能优化建议
-
MTU调整:
bash复制sudo ip link set dev ens33 mtu 9000适合大文件传输场景,但需要两端设备都支持
-
关闭IPv6:
如果不需要IPv6,可以禁用减少开销:yaml复制network: ethernets: ens33: dhcp6: no accept-ra: no -
使用virtio网卡:
在虚拟机设置中将网卡类型改为virtio,可提升性能
7. 安全注意事项
-
防火墙配置:
bash复制sudo ufw enable sudo ufw allow from 192.168.100.0/24 -
定期检查ARP表:
bash复制
arp -a防止ARP欺骗攻击
-
禁用不必要的服务:
特别是Windows虚拟机,建议关闭NetBIOS等老旧协议
8. 替代方案比较
当需求更复杂时,可以考虑:
方案A:Docker网络
bash复制docker network create --subnet=192.168.101.0/24 mynet
适合容器化环境,但学习曲线较陡
方案B:Hyper-V虚拟交换机
powershell复制New-VMSwitch -Name "InternalSwitch" -SwitchType Internal
Windows原生支持,但功能有限
方案C:云平台VPC
适合企业级部署,提供更完善的网络功能
我在实际使用中发现,对于个人开发环境,VMware的虚拟网络方案在易用性和功能性上取得了很好的平衡。特别是当需要同时运行Windows和Linux虚拟机时,这种配置方式可以避免很多兼容性问题。
