根本原因是macos路由表仅保留一条默认路由,需手动配置:内网流量走有线网卡(如10.10.0.0/16→en1),外网流量走wi-fi(default→en0),并设置开机自启脚本确保持久生效。

Mac同时插着网线和Wi-Fi时,内网系统打不开、外网网页加载超时,根本原因是系统路由表里只保留一条默认路由,另一张网卡的出口被自动屏蔽——必须手动拆解流量路径,让去10.x.x.x的包走有线,去0.0.0.0/0的包走Wi-Fi。
确认两张网卡的网络参数
打开“系统设置→网络”,分别点开Wi-Fi和有线连接(如“以太网”或“USB 10/100/1000 LAN”),记下每张网卡的IPv4地址、子网掩码、路由器(即网关)地址。重点看清楚:哪张网卡连的是公司内网(比如网关是10.10.0.1),哪张连的是办公Wi-Fi(比如网关是192.168.1.1)。这一步漏看网关,后面所有路由都会发往错误设备。
打开终端,执行networksetup -listallhardwareports,核对服务名称与物理接口对应关系,例如en0常为Wi-Fi,en1或en7可能是雷电转接的有线网卡。
清空冲突的默认路由并禁用内网网关自动注入
在终端中执行:sudo route -n delete default。这会删掉当前所有0.0.0.0/0路由,避免多条默认路由互相打架。
回到“系统设置→网络”,点击内网网卡(如“以太网”)→详情→IP设置→把“路由器”字段里的网关地址【全部删除,留空】。否则每次重启或重连,macOS会自动把该网关重新写进路由表,覆盖你刚设的规则。
添加精确路由:内网网段走内网网卡
方法一:按实际内网网段添加(推荐)
假设内网使用10.10.0.0/16网段,网关是10.10.0.1,有线网卡接口是en1,则执行:sudo route -n add -net 10.10.0.0/16 10.10.0.1 -interface en1。
方法二:适配常见私有地址段(适合不确定具体网段时)
一次性覆盖主流内网范围:sudo route -n add -net 10.0.0.0/8 10.0.0.1 -interface en1;sudo route -n add -net 172.16.0.0/12 172.16.0.1 -interface en1;sudo route -n add -net 192.168.0.0/16 192.168.0.1 -interface en1。注意:最后的网关地址必须替换成你内网网卡的真实网关,不能照抄。
方法三:指定出口接口编号(防选错物理端口)
先执行route -n get 10.10.0.10(填一个内网服务器IP),查看输出中的interface字段值(如en1),再执行带-interface参数的add命令。不指定-interface可能导致流量从Wi-Fi卡发出,内网设备收不到包。
设置外网默认路由:所有其他流量走Wi-Fi
第一步:确认Wi-Fi网卡当前IP和网关
执行ipconfig getifaddr en0(假设Wi-Fi是en0),再执行netstat -nr | grep 'default' | grep en0,确认当前Wi-Fi网关是否已存在。如果已有,跳过第二步;如果没有,继续下一步。
第二步:添加永久生效的外网默认路由
执行:sudo route -n add default 192.168.1.1 -interface en0(把192.168.1.1换成你Wi-Fi的实际网关,en0换成你Wi-Fi对应接口名)。这一步必须在内网路由添加之后执行,否则系统可能优先匹配默认路由而忽略内网条目。
第三步:验证路由表是否符合预期
执行route -n get 10.10.5.20(填一个内网IP)→应显示interface为en1;执行route -n get www.baidu.com→应显示gateway为192.168.1.1且interface为en0。若任一结果不符,说明某条路由未生效或顺序错误。
让路由配置开机自动加载
macOS不保存临时route命令,重启后失效。创建启动脚本:sudo nano /Library/Scripts/setup-dual-network.sh,粘贴以下内容(替换为你自己的网段、网关和接口名):
#!/bin/bash
sudo route -n add -net 10.10.0.0/16 10.10.0.1 -interface en1
sudo route -n add default 192.168.1.1 -interface en0
保存后执行:sudo chmod +x /Library/Scripts/setup-dual-network.sh;再执行:sudo launchctl load -w /Library/LaunchDaemons/com.example.dualnet.plist(需提前创建plist文件调用该脚本)。这一步不做,每次重启都要手动敲一遍route命令。











