ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

VMware 虚拟机「一边上网、一边 ping 开发板」:NAT + 桥接双网卡完整方案(含 DUP! 详解)

VMware 虚拟机「一边上网、一边 ping 开发板」:NAT + 桥接双网卡完整方案(含 DUP! 详解) VMware 虚拟机「一边上网、一边 ping 开发板」NAT 桥接双网卡完整方案含 DUP! 详解主机连着 WiFi 上网开发板用网线直连电脑有线网口。虚拟机既要能apt update上网又要能 ping 通开发板做 NFS/TFTP/交叉调试。网上教程要么让你用 NAT上得了网、看不见板要么让你用桥接看得见板、上不了网难道只能二选一结论先行不用二选一。给虚拟机加第二块网卡一块 NAT 专门上网一块桥接专门连板互不干扰。本文记录一次完整的配置 排障过程包括桥接选错网卡、误用仅主机、169.254.x.x、netplan 缩进翻车、以及那个吓人的DUP!到底是怎么回事。一、环境与目标项目实际情况主机系统Windows 10/11通过WiFi 无线网卡MediaTek Wi-Fi 6上网有线网卡Realtek PCIe GbE网线直连开发板不接路由器虚拟化VMware WorkstationUbuntu 22.04 桌面版开发板网口静态 IP192.168.0.133/24目标虚拟机同时满足① 能访问外网② 能 ping 通192.168.0.133最终 IP 规划全部设备在板卡链路上同网段设备IP所在网络用途Ubuntu 网卡 ens37192.168.199.128DHCP 自动获取VMnet8 NAT192.168.199.0/24上网 / aptUbuntu 网卡 ens33192.168.0.200/24静态VMnet0 桥接 Realtekping / NFS / TFTPWindows 有线网卡192.168.0.100/24网关留空物理有线链路主机端开发板192.168.0.133/24网关留空物理有线链路调试目标注意你的网卡名、NAT 网段可能不同比如 NAT 是192.168.161.0、桥接网卡叫ens34一切以虚拟机里ip -br a的实际输出为准本文的名字只是我这台机器的实例。二、核心思路两块网卡各司其职VMware 的三种网络模式先掰扯清楚NATVMnet8虚拟机通过主机共享上网最省心、最稳定但外部物理设备你的开发板看不见虚拟机。桥接VMnet0虚拟机通过指定的物理网卡直接接入物理二层网络和网线对端的设备处于同一网段可以互相 ping。桥接到哪块物理网卡是关键。仅主机VMnet1一个只连虚拟机和主机虚拟网卡的封闭网络不接任何物理网卡——所以它天然到不了插在物理网口上的开发板坑②详述。既然一块 NAT 管上网、一块桥接管连板加第二块网卡把两者拼起来即可。最终拓扑可以概括为ens37 经 VMnet8(NAT) 走主机 WiFi 出外网ens33 经 VMnet0 桥接到 Realtek 有线网卡与网线对端的开发板处在同一网段。动手前三条铁律先记住板子网线插在有线网卡上VMnet0 桥接就必须绑定Realtek 有线网卡不能选自动更不能选 WiFi桥接网卡只配同网段静态 IP不写 gateway否则它会抢默认路由把外网搞断改完虚拟网络/网卡硬件在虚拟机里sudo poweroff彻底关机再开机挂起会保留旧网络状态。三、完整配置步骤3.1 虚拟网络编辑器主机侧VMware 菜单【编辑】→【虚拟网络编辑器】→ 左下角【更改设置】提权。VMnet0选【桥接模式】【已桥接至】下拉手动指定Realtek PCIe GbE Family Controller不要用自动。VMnet8NAT 模式勾选【使用本地 DHCP 服务】子网保持默认我这里是192.168.199.0。VMnet1仅主机子网保持默认192.168.72.0本次用不到它千万别改成192.168.0.0坑④。点【应用】→【确定】。3.2 给虚拟机添加第二块网卡必须关机操作虚拟机内sudo poweroff彻底关机挂起状态下【添加】可能是灰的。然后【编辑虚拟机设置】快捷键CtrlD网络适配器 1→ 选【NAT 模式】勾【启动时连接】点左下角【添加】→【网络适配器】→【完成】新增网络适配器 2→ 选【桥接模式】勾【启动时连接】【复制物理网络连接状态】可勾可不勾【确定】后开机。3.3 Windows 有线网卡配静态 IPWinR输入ncpa.cpl回车 → 右键接板子的【以太网Realtek】→【属性】→ 双击【Internet 协议版本 4 (TCP/IPv4)】IP 地址192.168.0.100子网掩码255.255.255.0默认网关、DNS 全部留空这块网卡只用来直连板子不允许它产生默认路由3.4 Ubuntu 内用 netplan 固化网卡配置开机后先确认实际网卡名ip-bra我这台机器上ens33是桥接网卡、ens37是 NAT 网卡你机器上可能是 ens34/ens38以实际为准。Ubuntu 22.04 桌面版默认让 NetworkManager 接管netplan 文件通常是/etc/netplan/01-network-manager-all.yaml。编辑它sudonano/etc/netplan/01-network-manager-all.yaml# Let NetworkManager manage all devices on this systemnetwork:version:2renderer:NetworkManagerethernets:ens33:# 桥接网卡连开发板dhcp4:falseaddresses:-192.168.0.200/24# 注意不写 gateway4 / routes不写默认网关ens37:# NAT 网卡上网dhcp4:true应用sudochmod600/etc/netplan/01-network-manager-all.yamlsudonetplan applysleep5ip-bra预期结果ens33拿到192.168.0.200ens37拿到192.168.199.x。yaml 只能用空格缩进绝对不能用 Tab否则netplan apply后两块网卡都会变成没有 IP 的 UNKNOWN 状态坑⑤。3.5 验证三跳全通ping-c3baidu.com# 第 1 跳外网走 ens37 NATping-c3192.168.0.100# 第 2 跳主机有线网卡走 ens33 桥接ping-c3192.168.0.133# 第 3 跳开发板三跳全通即收工。我这边的实测结果PING baidu.com (124.23.177.164): 3 packets transmitted, 3 received, 0% packet loss PING 192.168.0.133: 3 packets transmitted, 3 received, 0% packet loss $ ip neigh 192.168.199.2 dev ens37 lladdr 00:50:56:fc:7d:10 REACHABLE 192.168.0.133 dev ens33 lladdr ea:a1:50:1d:75:fd REACHABLE之后板子要挂载虚拟机的 NFS/TFTP服务器地址统一填192.168.0.200。四、踩坑实录全部实测踩过坑① 桥接选成了 WiFi 网卡 / “自动”主机靠 WiFi 上网VMnet0 默认自动桥接时经常挑中无线网卡手动选错成MediaTek Wi-Fi 6时更直接——板子在有线网口上流量却从天线发出去物理上就是两条路。现象ping 192.168.0.133报Destination Host Unreachableip neigh里板子是FAILED/incomplete。解决VMnet0【已桥接至】手动锁定 Realtek PCIe GbE。另外之前桥接时灵时不灵很多时候只是因为当时网线没插、有线网卡处于网络电缆被拔出状态桥接自然没有链路。坑② 用仅主机 VMnet1连直连的板子仅主机模式是一个封闭虚拟交换机只连接虚拟机和主机上的 VMnet1 虚拟网卡不绑定任何物理网卡。虚拟机的帧根本到不了 Realtek 物理口更到不了网线对端的板子。解决网线直连板子的场景第二块网卡必须用桥接VMnet0 → Realtek虚拟机和板子才在同一个二层广播域。仅主机适合只跟主机通信、完全隔离的场景不适合接物理设备。坑③ 网卡拿到169.254.x.x自动私有地址169.254.0.0/16是 DHCP 失败后的 link-local 自动地址。当时我把 VMnet1 的 DHCP 关了、静态 IP 又没配对网卡两头落空于是自我分配了一个169.254.12.80从这个地址发出去的 ping 全部Host Unreachable。解决桥接网卡明确写静态 IPdhcp4: falseaddressesNAT 网卡明确dhcp4: true。别让网卡自谋生路。坑④ 把 VMnet1 子网改成192.168.0.0引发 DUP!为了凑板子网段一度把 VMnet1 的子网也改成了192.168.0.0/24。结果 Windows 主机上VMnet1 虚拟网卡和 Realtek 物理网卡都处在192.168.0.0/24两个接口一起回应ping 主机时满屏DUP!详细分析见第五章。解决VMnet1 子网改回默认的192.168.72.0让它离开板卡网段本次方案根本不用 VMnet1保持默认即可。坑⑤ netplan yaml 一个 Tab两块网卡全灭用 vim 编辑时缩进混进了 Tabnetplan apply后ip -br a里 ens33、ens37 全部变成UNKNOWN 且没有 IP外网瞬间断掉。yaml 对缩进零容忍。解决避免手工缩进翻车可以直接用 heredoc 整段写入sudotee/etc/netplan/01-network-manager-all.yaml/dev/nullEOF network: version: 2 renderer: NetworkManager ethernets: ens33: dhcp4: false addresses: [192.168.0.200/24] ens37: dhcp4: true EOFsudochmod600/etc/netplan/01-network-manager-all.yamlsudonetplan apply调试时用sudo netplan --debug apply 21 | tail -20看具体报错桌面版若 NetworkManager 没重新接管执行sudo systemctl restart NetworkManager。坑⑥ 网卡名不是教程里的 ens33/ens34教程写 ens34机器上却是 ens37——网卡名由 PCI 插槽/添加顺序决定照搬必错。任何时候先ip -br a确认真实名字再写进 netplan。以后若增删虚拟硬件导致网卡名变化同步改 netplan 即可。坑⑦ 给桥接网卡写了默认网关外网反被抢走给 ens33 顺手填了网关后路由表里可能出现两条默认路由系统把上网流量也往192.168.0.x发而那块网卡根本不通外网于是域名解析失败、网页打不开。解决桥接网卡只留addresses不写 gateway/routes默认路由只能有一条指向 NATens37。用ip route检查默认路由应从 ens37 走。坑⑧ 改完设置不关机热切换不生效虚拟机运行中改桥接对象、加网卡旧连接常常不释放、新配置不生效表现为明明改了还不行。解决sudo poweroff彻底关机不是挂起、不是只在系统里 reboot再冷启动让两块网卡重新初始化。五、DUP! 到底是怎么回事会不会影响通信这是本次最让人心里发毛的现象。ping 主机有线网卡时每个请求都收到两个回应64 bytes from 192.168.0.100: icmp_seq1 ttl128 time3.06 ms 64 bytes from 192.168.0.100: icmp_seq1 ttl128 time3.23 ms (DUP!) 64 bytes from 192.168.0.100: icmp_seq2 ttl128 time5.96 ms 64 bytes from 192.168.0.100: icmp_seq2 ttl128 time6.81 ms (DUP!) --- 192.168.0.100 statistics --- 3 packets transmitted, 3 received, 2 duplicates, 0% packet lossDUP!duplicate表示同一个 ICMP 序号收到了多个回应。它有两种完全不同的成因必须区分成因 A真·IP/网段冲突需要处理主机上有两个接口同时处在192.168.0.0/24坑④物理网卡.100 被错误改网段的 VMnet1 虚拟网卡两个接口都对 ARP/ICMP 做出回应。这种情况下回应来自两个不同的 MAC 地址会造成 ARP 表混乱应当消除——把 VMnet1 子网改回192.168.72.0。成因 BVMware 桥接的回包重复 hairpin无害可忽略桥接模式下虚拟机 ping 的是宿主机自身那块被桥接物理网卡的 IP。这个帧在 VMware Bridge Protocol 桥接层和主机 TCP/IP 协议栈之间可能被各处理一次于是主机用同一个 MAC回应了两遍。这是桥接模式的已知现象只出现在guest ping 宿主自身物理网卡 IP这一特定路径上对 ping 板子、NFS、TFTP、SSH 没有任何影响。一键判别用 arping 看回应的 MAC 是否相同sudoaptinstallarpingsudoarping-Iens33-c3192.168.0.100所有回应都是同一个 MAC我这里84:ba:59:c0:9f:3b3 发 6 收、3 extra但 MAC 全相同→ 成因 B无害忽略即可回应来自两个不同 MAC→ 成因 A去 Windows 执行ipconfig /all找出所有赖在192.168.0.x的接口重点查残留的 VMnet1 适配器禁用再启用或还原 VMnet1 默认设置。作为对照ping 真正的外部设备板子时是干干净净的没有任何重复$ sudo arping -I ens33 -c 5 192.168.0.133 60 bytes from ea:a1:50:1d:75:fd (192.168.0.133): index0 ... --- 192.168.0.133 statistics --- 5 packets transmitted, 5 packets received, 0% unanswered (0 extra)一句话总结先看 MAC 再决定要不要慌——同 MAC 的 DUP 是桥接自带的回声不同 MAC 才是配置冲突。六、分层排障流程与命令速查不要一上来就乱改设置按从外到内、一跳一跳的顺序定位外网 → 主机有线口 → 开发板能解决 90% 的问题。命令速查ip-bra# 一眼看全部网卡名与 IP网卡名以它为准iproute# 查默认路由只能从 NAT 网卡走ipneigh# 查 ARP 表REACHABLE通incomplete/FAILED不通sudoarping-Iens33192.168.0.133# 二层直查板子在不在线比 ping 更底层sudodhclient ens37# NAT 网卡手动重新获取 IPsudonetplan--debugapply# 应用配置并打印详细报错查 yaml 缩进sudosystemctl restart NetworkManager# 让桌面版 NetworkManager 重新接管按现象对号入座现象含义处理网卡是169.254.x.xDHCP 失败 静态没配明确静态 IP 或dhcp4: trueDestination Host Unreachable本机 ARP 解析失败查桥接是否绑定 Realtek、板子是否在线ip neigh为incomplete/FAILED二层没有任何应答板子上电/IP/网线/网口灯ping 8.8.8.8 通、域名不通纯 DNS 问题修/etc/resolv.conf的 nameserverping 网关通、8.8.8.8 不通NAT 转发故障启动 VMware NAT/DHCP 服务或还原默认设置NAT 完全拿不到 IP服务没启动或网卡没接 VMnet8Windowsservices.msc启动 VMware NAT/DHCP Serviceping 主机出现 DUP!网段冲突或桥接 hairpinarping 看 MAC不同 MAC 改网段同 MAC 忽略板子侧串口终端最后检查清单板子上电、系统启动完成PC 端和板端网口灯都亮/闪ip a确认网口状态为UP、IP 确实是192.168.0.133/24没有就配ifconfigeth0192.168.0.133 netmask255.255.255.0 up板子反向ping 192.168.0.200双向验证换一根网线现代网卡支持自动翻转普通直通线即可无需交叉线。七、写在最后整个问题的本质是把两种职责不同的虚拟网络硬塞进一块网卡造成的NAT 的职责是借道主机上网它看不见物理设备桥接的职责是挂进物理网段它不负责给你联网。想明白这点方案就很自然两块网卡、两条通路、两套 IP互不抢路由。配置固化在 netplan 里以后只要板子上电、网线插好开机即用重启不丢。回顾这次踩坑链桥接误选 WiFi → 误用仅主机 →169.254地址 → VMnet1 改网段引发 DUP → netplan 缩进全灭 → 网卡名对不上 → 热切换不生效每一步都很典型。希望这篇记录能帮你少走一晚上的弯路。环境VMware Workstation Ubuntu 22.04 桌面版主机 WiFi 上网开发板网线直连有线口。文中 IP/网卡名为本人环境实例复现时请以ip -br a实际输出为准。
返回列表