先说结论这个需求在企业办公、开发调试场景里特别常见——Mac通过有线网卡连公司内网同时用Wi-Fi连外网。很多人一上来就插两根网线或者连上两个网络结果发现要么内网通外网断要么外网通内网断甚至两个都不通直接被系统默认路由表教做人。我最早在公司折腾这个场景的时候也懵过后来把路由表、网关优先级、静态路由这些概念捋清楚之后发现事情并不复杂。今天这篇就完整记录一下我的实操过程包含原理讲解、配置步骤、踩坑记录照着做基本能一次搞定。1. 双网卡场景解析为什么会“顾此失彼”1.1 核心需求拆解这个标题背后对应的其实是一个很经典的路由策略问题。Mac同时接入两个网络系统默认只会选择一条“主路由”来处理流量并不会自动帮你分流。比如你同时插着网线内网IP10.x.x.x和连上Wi-Fi外网IP192.168.x.x系统默认走网线这条网关那么外网就访问不了如果默认走Wi-Fi网关那么公司内网系统、内部服务器又连不上。说白了你需要的不是“同时连接两个网络”而是“让去内网的流量走内网网关其他所有流量走外网网关”。这才是整个配置的核心逻辑。1.2 网卡与IP的网络通信原理要搞明白这件事得先补一个基础概念IP数据包是怎么找到出路的。Mac上每一个网卡代表一条物理链路每条链路挂在一个网段下对应一个网关地址。数据包发出去时系统协议栈会查找路由表按“最长前缀匹配”原则决定从哪条链路转发。举个例子目标地址子网掩码下一跳网关从哪个网卡出10.10.0.0/16255.255.0.010.10.0.1有线网卡en00.0.0.0/00.0.0.0192.168.1.1Wi-Fi网卡en1当你要访问内网的10.10.5.20时系统先匹配到第一条路由走有线当你访问百度时第一条不匹配就落到默认路由第二条走Wi-Fi。这里的核心是“两条路由同时存在且具体目的地的路由优先于默认路由”。这就像快递分拣中心每个包裹按照地址找对应的传送带默认传送带负责那些没有明确线路的包裹。思路对了方案就清晰了。1.3 为什么你直接插上两个网络没用很多人一开始都会想我都插上了系统难道不会自动判断吗答案是不会。macOS的网络服务优先级只会决定“谁是主默认路由”而不是智能分流。你要是把内网放在服务列表第一位默认路由就被内网网关抢占外网流量也试图从内网出去自然就断了。服务顺序优先级默认路由走向外网结果内网结果网络服务1有线内网10.10.0.1超时正常网络服务2Wi-Fi外网192.168.1.1正常超时调整后有线优先 静态路由192.168.1.1正常正常所以我们需要做两件事一、调整服务顺序或删掉内网网卡的默认路由避免它抢走外网流量二、把内网网段精确指向内网网关让内网流量按需走有线。这两件事做完双网卡才能真正同时工作。2. 配置前的准备工作信息收集比动手更重要2.1 确认IP、网关与网段信息动手之前先把基础信息摸清楚。打开“终端”分别执行以下命令。# 查看有线网卡信息 ipconfig getifaddr en0 ipconfig getoption en0 router # 查看Wi-Fi网卡信息 ipconfig getifaddr en1 ipconfig getoption en1 router这里列一下我在实际环境中的示例值方便后面演示有线网卡内网IP 10.10.8.66网关 10.10.0.1网段 10.10.0.0/16Wi-Fi网卡外网IP 192.168.1.100网关 192.168.1.1网段 192.168.1.0/24有些公司内网不是标准的/16掩码可能只有/24甚至更小但只要知道网段信息后面写路由的时候把范围替换一下即可。内网网段怎么确认你可以在公司内网访问一个内部网页然后用traceroute -n 目标内网IP看一下第一跳是不是自己的内网网关或者直接问IT要一下网段规划这是最稳的。提示Mac上有线网卡通常叫en0Wi-Fi网卡叫en1或en2但具体型号因机器而异。用ifconfig命令看一下有哪些接口能拿到IP的那个一般就是对应的网卡。2.2 确认网关地址的两种方式除了ipconfig getoption还可以用netstat -rn | grep default来查看当前所有的默认路由其中带interface字段的那一行就是每张网卡对应的IPv4默认网关。多执行几次对比接入和断开不同网络时的变化基本就能确定哪条是内网、哪条是外网。确认不了的时候还有一个办法拔掉网线只看Wi-Fi接入后的route表再插上网线对比新增了哪些条目。新增条目里带有内网网段的就是内网路由带有default字样的就是干掉的内网默认路由。搞清楚了再配置比盲目敲命令稳得多。2.3 判断内网网段是否需要走专线不是说所有内网IP都得走有线网卡。比如有些公司的内网服务在10.x网段有些在172.16.x网段有些在192.168.x网段。你得先想清楚“我要访问的内网资源到底在哪些IP段”比如公司OA、内部Git、文档系统10.10.0.0/16另一套老系统172.16.8.0/24打印机192.168.50.0/24这些网段如果都走有线那就在路由表里分别添加。如果内网只有一段那就加一条静态路由就够了。我碰过一种特殊情况公司内网和Wi-Fi的外网网关恰好同网段比如都是192.168.1.1但分属不同物理区域。这种情况比较坑因为默认路由会冲突如果你也是这种网络结构后面的自动脚本方案可能需要手动指定metric权重或者直接用策略路由解决。不过绝大多数公司不会这么设计遇到再单独排查。3. 核心配置实操一个命令一个命令来3.1 快速临时配置适合当场测试临时配置的目的是先验证网络连通性。不改任何配置文件重启或者断开重连之后配置就失效适合先测试方案是否可行。第一步查看当前默认路由记录Wi-Fi的外网网关。netstat -rn | grep default假设输出如下default 192.168.1.1 en1 default 10.10.0.1 en0此时默认走的是en0有线外网基本不通。我们先把内网的默认路由删掉让Wi-Fi接管默认流量。sudo route -n delete default 10.10.0.1注意如果你的服务顺序本来就是Wi-Fi第一那么也许不需要删除可以直接跳到第三步。第二步删除之后再netstat -rn | grep default看一下应该只剩一条默认路由default 192.168.1.1 en1这时测一下外网ping 223.5.5.5如果通了说明Wi-Fi已经接管默认流量。第三步添加内网静态路由让所有访问内网网段的数据包走有线网卡。sudo route -n add 10.10.0.0/16 10.10.0.1添加后再验证ping 10.10.8.20如果通说明内网也OK。此时你的Mac已经实现“默认流量走Wi-Fi外网内网网段走有线内网”。临时配置生效但这只是开始重启后这些手动加的静态路由会丢失需要做持久化配置。3.2 配置永久生效的静态路由macOS里添加永久静态路由常见方式有几种设置里建一个“位置”每次切换手动敲一遍命令。写一个LaunchDaemon开机脚本自动执行。用networksetup -setadditionalroutes给指定网络服务添加静态路由。比较推荐的是第三种因为networksetup是系统自带命令路由会跟随网络服务一起加载比LaunchDaemon更稳定且不会出现睡眠唤醒后路由丢失的问题。先查看当前网络服务的名字注意不是网卡接口名是“服务”名networksetup -listallnetworkservices我这边输出类似An asterisk (*) denotes that a network service is disabled. Wi-Fi USB 10/100/1000 LAN Thunderbolt Bridge我的有线网卡对应的是“USB 10/100/1000 LAN”。那么添加静态路由的命令如下sudo networksetup -setadditionalroutes USB 10/100/1000 LAN 10.10.0.0 255.255.0.0 10.10.0.1这个命令的格式是networksetup -setadditionalroutes 网络服务名 目标网段 子网掩码 网关意思是把“10.10.0.0/16”这条路由绑定到有线网卡的服务上网关是10.10.0.1。绑定到对应网络服务后只要这个服务被系统识别并激活路由就会自动加入路由表。如果有多段内网需要添加可以在同一命令行里继续追加参数格式为“网段 掩码 网关 网段 掩码 网关……”sudo networksetup -setadditionalroutes USB 10/100/1000 LAN 10.10.0.0 255.255.0.0 10.10.0.1 172.16.8.0 255.255.255.0 10.10.0.1添加完成后断开网络重连一次再看路由表netstat -rn | grep 10.10如果能看到类似10.10/16 10.10.0.1 UGSc en0说明已经永久生效。实测在macOS 14/15的系统上这种配置方式是最稳的没有之一。3.3 调整网络服务顺序防止默认路由被抢前面说过如果系统默认路由跑到了有线网卡上外网就是不通。所以配置双网卡的另一步重要操作是调整网络服务顺序让Wi-Fi排在前面或者让内网网卡不参与默认路由竞选。打开“系统设置” - “网络” - 左下角或右下角的“更多选项” - “设置服务顺序”旧版本是“服务顺序”按钮把Wi-Fi拖到有线上面。要注意的是有些版本Mac在“网络”设置里并不能直接拖拽需要点右下角的按钮进入服务顺序编辑。调整完后系统会重新按顺序生成默认路由默认路由会优先选择Wi-Fi。这里补充一个知识点如果你不想调整服务顺序也可以使用另一种方案——开启有线的“关闭所有受限网络”或者直接关掉有线网卡的IPv4 DHCP分配只保留一个“链路本地地址”。但这种方式太极端会丢内网不建议。调整顺序之后还需要确认一下默认路由是否真的落在Wi-Fi上执行netstat -rn | grep default如果第一条就是default 192.168.1.1 en1那么外网已经没问题了。3.4 一键切换场景适合你经常在“纯内网”和“双网”之间切换很多公司网络环境会限制某种模式比如开会插有线投屏、去实验室断Wi-Fi。天天手动改路由也不现实所以我习惯准备两个脚本放在/usr/local/bin下方便随时切换。第一个脚本开启双网模式默认外网优先 内网静态路由。#!/bin/bash # 双网模式把Wi-Fi设置为默认路由添加内网静态路由 WIFI_SERVICEWi-Fi LAN_SERVICEUSB 10/100/1000 LAN LAN_NET10.10.0.0 LAN_MASK255.255.0.0 LAN_GW10.10.0.1 # 1. 删除内网本来可能存在的默认路由 sudo route -n delete default 2/dev/null # 2. 设置Wi-Fi优先 sudo networksetup -setnetworkserviceenabled $WIFI_SERVICE on sudo networksetup -setorderoftheservices $WIFI_SERVICE $LAN_SERVICE 2/dev/null # 3. 添加静态路由 sudo routes -n add ${LAN_NET}/${LAN_MASK##*/} $LAN_GW 2/dev/null || sudo route -n add $LAN_NET $LAN_GW sudo networksetup -setadditionalroutes $LAN_SERVICE $LAN_NET $LAN_MASK $LAN_GW echo 双网模式已启用外网走Wi-Fi内网走有线第二个脚本恢复纯内网模式。#!/bin/bash # 纯内网模式取消静态路由让默认流量回到有线 LAN_SERVICEUSB 10/100/1000 LAN LAN_NET10.10.0.0 LAN_GW10.10.0.1 sudo route -n delete -net $LAN_NET $LAN_GW 2/dev/null sudo networksetup -setadditionalroutes $LAN_SERVICE echo 已恢复纯内网模式注意这个脚本里删除静态路由时需要匹配子网掩码直接route -n delete 10.10.0.0/16在某些macOS版本可能不生效需要用-net加掩码的方式。具体写法可以结合netstat -rn查看实际路由条目来调整。4. 折腾路上最常见的几个坑4.1 路由添加成功但ping不通内网IP这种情况大概率不是路由配置问题而是目标内网机器开了防火墙或者Mac自带的“应用防火墙”拦了ICMP。你可以先ping一下网关ping 10.10.0.1网关能通说明有线物理链路没问题如果网关也不通检查网线、交换机端口、有没有插入VLAN需要配置公司环境可能需要额外设置VLAN ID这就要找IT开通了。还有一种可能性就是子网掩码写错了。你以为内网是10.10.0.0/16结果实际规划是10.10.8.0/24这时候你访问10.10.9.1的时候系统匹配不到静态路由默认走了Wi-Fi当然不通。解决办法就是精确网段或者改成更大范围的掩码比如/16这样只要内网都是10.10.x.x就都能覆盖。4.2 重启后路由丢失如果你用的是route -n add手动添加的临时路由重启后丢失是非常正常的。这时候就用前面说的networksetup -setadditionalroutes重新添加一遍并确认添加时绑定的网络服务名字是对的。有时候networksetup -listallnetworkservices显示的名字和实际不符比如一些USB转以太网网卡的名字里带“USB GbE”而不是“USB 10/100/1000 LAN”复制粘贴时注意空格和大小写。最好直接复制命令输出的全名别手打。4.3 睡眠唤醒后路由表异常这个问题在旧版macOS里偶有发生表现为睡眠唤醒后静态路由凭空消失或者默认路由跳到了有线网卡。我实测在macOS Sonoma和Sequoia上networksetup -setadditionalroutes配置的路由相对稳定很少出现睡眠丢失。如果还是出现了可以写一个简单的launchd plist在唤醒时重新执行一次路由脚本。网上很多方案我就不贴了实际用下来优先级最低。建议先用networksetup方案不行再上launchd。4.4 内网DNS解析失败但IP能ping通这又是一个容易忽略的坑。你在内网访问某个服务时直接输IP地址没问题但输入域名就报错。这说明路由已通但DNS没走内网。Mac默认的DNS是Wi-Fi获取的外网DNS自然解析不了公司内网域名。解决办法是在“系统设置” - “网络” - 对应有线网卡的“详细信息” - “DNS”里把公司内网的DNS服务器地址加进去比如10.10.0.2之类的。但要注意顺序如果你同时让外网和公司DNS生效最好将内网DNS地址放在追加列表靠前的位置因为macOS会按顺序尝试。遇到解析特别慢的也可以用scutil --dns查看当前系统DNS配置顺序再对症调整。4.5 两个网段的默认路由都被抢轮流断网这种情况一般出现在“服务顺序”调整之前或者误删默认路由之后。表现为一会儿外网能通一会儿不行netstat -rn里default一会在Wi-Fi一会在有线。其实就是两个网卡都有默认路由系统在切换时发生了抖动。解决思路给有线网卡去掉默认路由的能力或让它给默认路由最高的路由“度量值”。macOS上通常可以通过配置顺序解决把Wi-Fi放到最上面另外不要随意route -n delete default两个网关只删内网的那条即可。5. 我踩过的一些额外心得5.1 关于“服务顺序”和“路由”到底先调哪个我建议先调服务顺序再加静态路由因为服务顺序影响的是默认路由归属静态路由影响的是精确网段归属。而且服务顺序变更后旧的临时路由可能残留最好配置完顺序之后重启一次网络服务再添加静态路由会清爽很多。5.2 关于公司网络的坑公司网络有时会做准入控制比如要装Agent、或者需要账号密码拨号。如果你有线网卡已经连上但内网始终拿不到IP多半是802.1X准入没通过。这时候查无线网卡能不能单独连内网Wi-Fi先排除准入问题再研究路由配置。5.3 关于“外网”是否需要公司代理如果你在的公司访问外网本身还要走代理比如浏览器配置了PAC代理那么即使你路由配置正确浏览器里外网也可能仍然打不开。这时要检查“系统设置” - “网络” - “代理”确认是否走代理以及代理服务器本身是否可达。如果代理服务器在内网那就意味着访问外网的流量实际还是要先走到内网网关的代理上……这种情况下双网卡的路由配置思路要反过来默认路由走内网外网走代理具体就得看公司代理策略了。这个属于特殊场景我这里就不展开。5.4 给笔记本用户的一句忠告如果你用的是MacBook经常在公司和家之间移动建议公司场景单独建一个“网络位置”。在“系统设置” - “网络” - “位置”里新建一个位置配置好双网卡路由在家切回“自动”位置这样就不会把公司的静态路由带到家里去避免到家后路由表一片混乱。最后的实践经验总结折腾双网卡这件事本质上就是“搞清楚自己有哪些网段哪些该走哪条路然后把路由表写明白”。很多人配不好不是命令不会敲而是没理解“默认路由”和“静态路由”的关系。一旦想通了后面就是重复执行命令的事。我这套方案里最核心的其实就三样删掉内网默认路由、让Wi-Fi当默认网关、给内网精确网段加静态路由。配合networksetup -setadditionalroutes做持久化基本可以做到“配置一次长期使用”。你如果在配置过程中遇到跟我不太一样的网络环境可以先把netstat -rn的输出贴给熟悉网络的人看一眼比对一下默认路由的走向问题一般很快就能定位。最后再分享一个自己的小习惯每次调整完路由我都会先ping网关再ping目标IP最后再访问域名三步走哪一步有问题就知道是哪一层的问题排查效率高很多。
