Mac 上装了虚拟化软件之后,偶尔会遇到这种怪事:主机好好的,虚拟机没网;或者反过来,关掉虚拟机后主机的网络也断了,非得重启才行。
根因通常是多块虚拟网卡同时往路由表里写默认路由,谁最后写入谁生效,互相覆盖。
先看有哪些虚拟网卡
ifconfig | grep -A3 '^[a-z]' | grep -E '^[a-z]|inet '
常见的几块:
| 网卡 | 来源 | 作用 |
|---|---|---|
vmnet1/8 | VMware | 仅主机 / NAT |
bridge100 | Parallels / 共享网络 | 虚拟机桥接 |
utun* | 各类 VPN / TUN | 隧道 |
docker0 | Docker | 容器网络 |
看谁在抢默认路由
netstat -rn | grep default
route -n get default
default 那几行会显示每条默认路由对应的网卡和优先级。正常情况下应该只有一条走物理网卡(en0 或 en1)。
如果看到 utun3、vmnet8 这类也在默认路由里,而且优先级更靠前,那就是冲突源。
三种处理方式
一、关掉不用的虚拟网卡
sudo ifconfig vmnet8 down
临时生效,重启回来。适合快速验证是不是它的锅。
二、调整服务顺序
系统设置 → 网络 → 右下角「…」→「设定服务顺序」,把物理网卡拖到最上面。这样默认路由优先生效,虚拟网卡只在需要时用。
三、让虚拟化软件别接管默认路由
VMware 可以在偏好设置里把网络模式改成「仅主机」;Parallels 可以在虚拟机配置里改用「共享网络」而不是「桥接」。这两项改完,虚拟网卡就不会写默认路由了。
关掉虚拟机后主机断网
这是最典型的症状:虚拟机关闭时把它写的那条默认路由删了,但没恢复原来的,主机就只剩一条无效路由。
临时恢复:
sudo route delete default
sudo route add default 192.168.1.1
(把 192.168.1.1 换成你的路由器地址)
根治:按上面第三种方式,让虚拟化软件不接管默认路由。
判断口诀
主机正常、虚拟机异常 → 虚拟机的网络模式问题。
虚拟机关掉、主机异常 → 默认路由被删没恢复。
两者都异常 → 有第三块网卡(常见是 TUN)在抢。
💡 一条命令看全貌:
netstat -rn | head -20,默认路由有几条、分别走哪块网卡,一眼就能看出来。