VMware虚拟机双网卡配置详解:从网络模式到路由冲突解决

发布时间:2026/10/17 6:36:09
VMware虚拟机双网卡配置详解:从网络模式到路由冲突解决
VMware里给虚拟机加块网卡点几下鼠标的事。但真正用起来双网卡踩坑的人太多了明明两块网卡都亮了外网不通或者虚拟机两块网卡互相抢路由业务IP能通,管理IP死活连不上。这篇东西我从底层网络模式讲起再到Windows和Linux两种客户端里的实际配置最后把常见坑全部过一遍照着做就能稳定复现一套能用的双网卡环境。我平时做虚拟化测试和网络实验双网卡用得非常多。比如要模拟一台同时连接办公网和服务器网段的机器或者搭建一个三层的实验环境一块网卡根本不够。这个配置本身不难难的是理解VMware那几张虚拟网卡到底在干什么以及配完以后路由怎么走。1. 先把VMware的虚拟网络结构搞清楚1.1 VMnet0、VMnet1、VMnet8分别是干嘛的VMware Workstation装完以后会在宿主机上创建好几块虚拟网卡和对应的虚拟交换机。默认情况下你能在“虚拟网络编辑器”里看到三个核心的虚拟网络虚拟网络模式默认网段作用VMnet0桥接模式与物理网络同网段虚拟机直接接入宿主机所在物理局域网VMnet1仅主机模式192.168.137.0/24新版本常见不同版本有差异仅虚拟机之间及与宿主机通信VMnet8NAT模式192.168.xx.0/24随机生成虚拟机通过宿主机共享IP上网桥接模式下虚拟机看起来就是物理网络里的一台独立设备跟宿主机在同一广播域里。它的IP由上层路由器分配可以和局域网其他设备互相访问。NAT模式下虚拟机躲在宿主机后面靠宿主机做地址转换访问外网。仅主机模式最封闭VMnet1下的虚拟机只能跟宿主机和其他同网络的虚拟机通信。这个理解非常重要因为你配双网卡时选哪个模式基本决定了这块网卡能连通哪些范围。1.2 为什么一块网卡不够用很多人刚学虚拟机的时候只给虚拟机分配一块网卡选NAT模式能上外网就完事了。但实际工作里单向网络根本不够用。举个我常遇到的例子要在一台虚拟机上部署一个Web服务同时我想用宿主机浏览器直接访问它还想让这台虚拟机作为测试网络的网关给另外几台VM提供DHCP和路由。这时候一块网卡就捉襟见肘了——如果只走NAT外部访问不方便如果只走桥接虚拟机又暴露在整个局域网里安全性不好。双网卡的意义在于角色分离一张网卡负责“对外”通信另一张网卡负责“对内”通信。它们各走各的路径互不干扰。这种模型在物理服务器里也非常常见——管理口和业务口分离、内网口和外网口分离VMware只不过是把这套玩法挪到了虚拟化环境里。2. 双网卡的两种主流设计方案2.1 方案一NAT加仅主机模式这是我最常用的组合。一块NAT网卡负责访问外网一块仅主机网卡负责和宿主机及其他虚拟机组成隔离的实验网络。NAT网卡解决了虚拟机软件源、系统更新、DNS解析等所有需要外网的场景。仅主机网卡则承担内部服务访问比如我可以直接在宿主机浏览器里打开虚拟机的管理后台如果管理后台监听在仅主机网卡的IP上完全不受外部攻击面影响。这个方案的另一个好处是网段天然隔离。VMware默认给VMnet1是192.168.137.0/24这类网段给VMnet8是另一段。只要两个网段不冲突内部路由就这么简单默认路由走NAT访问内网段走仅主机。2.2 方案二双桥接模式有些场景要虚拟机直接暴露在物理网络上比如做网络抓包分析、模拟真实服务器、加入局域网组播/广播测试。这时候两块网卡都可以选桥接模式分别桥接到宿主机的不同物理网卡上。比如宿主机有一块有线网卡接办公网一块无线网卡接另一个网段虚拟机两块虚拟网卡分别桥接到这两块物理网卡虚拟机就等于同时接入了两个物理网络。但双桥接有个隐患如果两块网卡桥接的是同一个物理网卡虚拟机里会出现两个MAC地址在同一物理广播域内的情况某些交换机的端口安全策略可能会触发警告比如MAC地址飘移。所以双桥接要尽量让两个VMnet分别绑定不同的物理网卡不要绑同一个。2.3 自定义VMnet的作用除了默认的VMnet0、VMnet1、VMnet8虚拟网络编辑器里还可以添加自定义的VMnet2到VMnet19。自定义VMnet唯一的网络类型限制是只能选仅主机模式或NAT模式不能选桥接。自定义VMnet的好处是什么呢还是隔离。比如我用VMnet2当“服务器网段”VMnet3当“客户端网段”然后在虚拟机上再加一块网卡接到VMnet3这就实现了更复杂的多臂路由实验。3. 从零配置一套双网卡虚拟机3.1 虚拟机设置里添加第二块网卡打开虚拟机的“虚拟机设置”在“硬件”选项卡点“添加”选“网络适配器”。添加完成后把网络连接改成你需要的模式。这里有一个非常容易忽略的细节添加完第二块网卡后一定要在设置界面里确认一下“设备状态”里的“启动时连接”勾选上了否则下次开机这块网卡不生效。还有个经验记得给两块网卡起清楚的名字比如“NAT-外网”“VMnet1-内网”。虽然系统显示叫网络适配器1、网络适配器2但自己在备注里写清楚排查问题时省一半力气。3.2 虚拟网络编辑器的必要检查默认VMnet1和VMnet8的网段是自动生成的。但如果你配双网卡建议手动固定网段。固定网段能避免后面DHCP分配混乱最重要的是保证虚拟机的静态IP配置不会因为宿主机重启后网段变化而失效。在“虚拟网络编辑器”里选中VMnet1点“更改设置”把子网IP改成一个计划好的网段比如192.168.100.0子网掩码255.255.255.0。注意DHCP服务器也可以在这里改。如果你打算给虚拟机配静态IP其实可以把DHCP关掉。提示修改虚拟网络网段时宿主机上对应VMware网卡的IP也会自动变。如果你之前配过静态地址需要顺手把它同步改掉。3.3 客户端里的网卡识别与配置进入虚拟机系统后首先用命令确认两块网卡都被识别。Windows下用ipconfig /allLinux下用ip addr。如果只看到一块网卡可能原因有两个虚拟机设置里第二块网卡没勾选“启动时连接”或者系统驱动没加载。Linux下有时候需要udevadm trigger或者重启网络服务。识别到两块网卡后接下来就是配置IP地址了。比较稳妥的方式是把规划好的IP写在/etc/network/interfacesDebian系或者/etc/sysconfig/network-scripts/ifcfg-*RHEL系或者用NetworkManager。# Debian/Ubuntu 示例编辑 /etc/network/interfaces auto ens33 iface ens33 inet static address 192.168.1.88 netmask 255.255.255.0 auto ens37 iface ens37 inet static address 192.168.100.2 netmask 255.255.255.0这里有个技巧配置时先把两块网卡的网关都指向它们各自对应的上游设备但默认路由只能有一条。也就是说如果两块网卡都要保留必须想清楚哪条是主用默认路由。4. 双网卡路由策略最容易出问题的一环4.1 双网关冲突的原理当两块网卡都配了网关系统会在路由表里出现两条默认路由。默认路由是分优先级的按metric值判断。如果两条默认路由的metric一样流量就会随机或者按顺序走其中一条后果就是访问某些IP时通另一些IP时不通看起来毫无规律。MySQL连不上、外部SSH断断续续、网页经常刷新失败都可能是一口气给两块网卡都配了默认网关导致的。路由表这个东西是“最长前缀匹配”逻辑默认路由是最后兜底的那条。多个兜底路由就等于没有兜底。4.2 Windows下调整路由优先级Windows系统里网卡的“接口metric”可以在高级TCP/IP设置里手工指定。数值越小优先级越高。比如我希望走NAT网卡访问外网那就把NAT网卡的metric设为10仅主机网卡的metric设为100。这样默认流量都走NAT访问VMnet1网段的流量通过直连路由走仅主机网卡不会冲突。还有另一个做法直接删掉不想要的默认路由。# 以管理员身份运行查看当前路由 route print # 删除通过某块网卡的默认路由举例网关192.168.100.1是仅主机网卡的网关 route delete 0.0.0.0 mask 0.0.0.0 192.168.100.1这样操作有个后果重启后路由可能被重新加回来持久性差。更稳的还是用metric。4.3 Linux下策略路由的用法Linux推荐用策略路由解决双网卡多网关的问题。策略路由可以根据源IP、目的IP、标记等条件选择不同的路由表。我用一个实际例子说明。假设ens33是NAT网卡IP 192.168.1.88网关192.168.1.1ens37是仅主机网卡IP 192.168.100.2网关192.168.100.1我希望访问192.168.100.0/24网段时自动走ens37其余流量走ens33。这其实不需要策略路由普通的路由表就能解决ip route add 192.168.100.0/24 dev ens37 src 192.168.100.2因为192.168.100.0/24是一条直连网段路由系统自然优先匹配它。但如果你需要通过192.168.100.1访问别的未知网段或者两块网卡都要做默认网关就必须上策略路由了。# 为ens37单独建一张路由表 echo 200 internal /etc/iproute2/rt_tables # 把ens37的默认路由放进internal表 ip route add default via 192.168.100.1 dev ens37 table internal # 匹配来自192.168.100.2的流量走internal表 ip rule add from 192.168.100.2 lookup internal配置完成后凡是源地址是192.168.100.2的流量一律走ens37的默认路由即使ens33的默认路由metric更小也不会干扰。这个做法在有多张网卡的虚拟机上非常实用做网关实验、双线接入测试都靠它。5. 双网卡场景下的网络连通性排查5.1 网卡都亮了但ping不通先把防火墙放一边最经常出问题的是VMware虚拟网络的网段冲突。比如VMnet1默认网段192.168.137.0/24你的物理局域网也是192.168.137.0/24那完了路由全乱了。这时候把VMnet1改成一个不冲突的网段即可。还有一个问题Windows宿主机上VMnet1和VMnet8是两块虚拟网卡它们是会参与路由计算的。如果虚拟机里的路由策略是对的但宿主机这边的虚拟网卡也有多条默认路由同样会出问题。检查方法是在宿主机上跑route print看看有没有两个0.0.0.0的默认路由。5.2 网络适配器对应错位VMware一个容易迷惑人的地方在于虚拟机的“网络适配器1”不一定对应客户操作系统里的“eth0”。特别是Linux系统网卡命名可能因为PCI槽位变化而改变比如ens33变ens37。配置时不要靠名字猜要看MAC地址。方法很简单在虚拟机设置里查看每块网卡的MAC地址然后在系统里用ip link或ipconfig /all确认对应关系再去做IP配置。我见过一个朋友配了半天以为是ens33的问题结果是两块网卡的MAC地址装反了全白费。5.3 网络服务绑定IP时的注意事项双网卡环境下服务绑定IP一定要明确。不要用0.0.0.0通配符绑定到所有网卡除非你真的想把服务暴露到所有网络上。比如Nginx默认监听80端口双网卡下默认监听所有IP仅主机网卡那边的人也能访问。安全敏感的场景最好明确绑定到特定IP比如仅监听仅主机网卡的那个地址。server { listen 192.168.100.2:80; ... }如果是Windows上的服务也要注意“全部未分配”和“指定IP”的区别。双网卡环境下服务监听的端口可能因为IP绑定配置不当导致局域网能访问、外网访问不了之类的怪问题。5.4 一个真实的排查案例不久前我在测试环境里遇到一个双网卡故障虚拟机可以正常访问外网宿主机也能访问虚拟机的NAT网卡IP但宿主机访问不到VMnet1上那个IP。排查过程是这样的先看虚拟机里两块网卡的IP和网关然后看路由表。结果发现VMnet1网卡的IP掩码被设成了255.255.255.255导致只有这台虚拟机自身认为IP存在宿主机根本没法通过ARP解析到它。修改为255.255.255.0后立即恢复通信。另一个教训是虚拟机内两块网卡不要都配同一个网段除非你是特意做网卡绑定或者冗余测试。正常情况下这是没意义的而且会造成路由混乱。6. 双网卡的高级玩法与个人经验6.1 用双网卡搭建网关实验环境很多网络实验都需要一台虚拟机充当Linux路由器。比如我有三台虚拟机客户端VM、网关VM、服务器VM。网关VM上两块网卡一块连VMnet2客户端网段192.168.20.0/24一块连VMnet3服务器网段192.168.30.0/24。在网关VM上开启IP转发客户端VM就能通过它访问服务器网段。这就是一个最基础的虚拟路由环境。# 在网关VM上开启转发 echo 1 /proc/sys/net/ipv4/ip_forward # 永久开启修改 /etc/sysctl.conf设置 net.ipv4.ip_forward 1做这类实验时双网卡的配置必须精确到网段、网关、转发三件套缺一不可。这也是双网卡配置最常见的“进阶用途”。6.2 快照与克隆时的网卡注意点配置完双网卡后如果你想给虚拟机做快照或者克隆一定要先确认网卡的配置逻辑。快照本身包含网卡状态没问题。但克隆虚拟机时如果选择“复制”而非“链接克隆”克隆出来的系统里网卡MAC地址会变化Linux下的网卡名称可能会从eth0变成eth1导致IP配置失效。如果你对系统里网卡名字依赖很深最好在克隆前把udev规则里的MAC绑定清掉让系统重新识别网卡。Windows系统则相对简单旧网卡驱动会被识别为新设备但需要手动改IP。6.3 双网卡配置的验收清单配置完成后我习惯按这几步验收虚拟机关机时检查两块网卡的“启动时连接”状态。开机后确认两块网卡都被操作系统识别为UP状态。检查每块网卡是否拿到了预期IP和网关。检查路由表确认默认路由唯一且走预期网卡。分别测试外网、宿主机、同网段其他虚拟机的连通性。测试核心服务是否绑定在正确的网卡IP上。这套清单是我踩了无数坑以后总结出来的基本上走一遍就能定位90%的双网卡问题。6.4 最后分享一个我个人的习惯我在多网卡虚拟机里尽量以“NAT负责出网、只有一条默认路由、其他网卡全部关掉网关或者用策略路由隔离”为原则。这样配置最简单维护也最轻松。很多人在双网卡上栽跟头就是给太多网卡配了网关。如果你不确定某块网卡的网关该不该填就先让它空着等确定确实需要跨网段通信再填。工具上我也建议装好tcpdump或wireshark双网卡问题很多时候光看表象猜不出来抓包一下看看ARP、ICMP到底从哪块网卡进出立刻就能判断出路由选路是否正确。