在 macOS 系统中,通过终端(Terminal)的 route 命令可以灵活管理静态路由,适用于双网卡、跨子网通信、连接多个内网网段等场景。与 Windows 的 CMD 不同,macOS 基于 BSD 系统,route 命令的语法、权限要求以及"永久路由"的实现方式都有明显差异。本文详细介绍 macOS 下静态路由的查看、添加、删除、验证及永久生效的配置方法。
静态路由基础命令
查看当前路由表
netstat -rn输出中 Destination 列为目标网段,Gateway 列为下一跳地址,Flags 列 UG 表示 Up + Gateway(可用路由),U 表示仅 Up(直连网段)。查看默认路由可以配合 grep:
netstat -rn | grep default只查询某条具体路由是否可达(不修改路由表):
route -n get 192.168.1.1临时路由配置
临时路由在系统重启或网络服务重启后失效,适用于短期测试。macOS 的 route 支持 CIDR 写法,也支持传统的 -netmask 写法。
命令格式(CIDR 写法):`bash
sudo route add -net 目标网段/前缀 网关IP
示例:
sudo route add -net 192.168.1.0/24 192.168.0.1
命令格式(传统写法):
sudo route add -net 目标网段 -netmask 子网掩码 网关IP
示例:
sudo route add -net 172.31.0.0 -netmask 255.255.0.0 192.168.15.254
### 添加默认路由
当需要临时更换默认网关时使用:
sudo route add default 192.168.0.1
> 注意:macOS 的 `route` 命令**没有** Windows 的 `-p` 永久参数。临时路由重启后一定会丢失,永久配置见下文"永久路由配置"章节。
---
## 关键参数说明| 参数 | 作用 | 示例值 |
|------|------|--------|
| -net | 指定目标网络(后接网段或 CIDR) | -net 192.168.1.0/24 |
| -netmask | 指定子网掩码(传统写法,与 -net 搭配) | -netmask 255.255.255.0 |
| -ifscope | 指定网卡接口(多网卡时使用) | -ifscope en0 |
| -interface | 直接指定接口作为出口(无网关场景) | -interface en0 |
| -priority | 路由优先级(数值越小优先级越高,可选) | -priority 10 |
| default | 默认路由(代替目标网段) | route add default 网关 |
> 与 Windows 的差异:Windows 用 `mask` 关键字,macOS 用 `-netmask` 或 CIDR;Windows 的 `route print` 查看接口编号,macOS 用 `networksetup -listallhardwareports` 或 `ifconfig` 查看接口名(en0/en1...)。
---
## 操作步骤详解
### 打开终端并获取管理员权限Command + Space → 输入 `终端` → 回车。凡是添加/删除路由的命令都必须以 `sudo` 开头,首次执行会提示输入开机密码(输入时屏幕不显示,属正常现象)。
### 查看网卡接口编号
多网卡场景先确认接口名:
networksetup -listallhardwareports
或
ifconfig
### 添加路由
sudo route add -net 10.0.0.0/8 192.168.1.1
### 验证路由表
netstat -rn | grep 10.0.0.0
或验证到具体地址的路径:
route -n get 10.1.2.3
### 删除静态路由
命令格式:
sudo route delete 目标网段
示例:
sudo route delete 10.0.0.0/8
---
## 多网卡场景配置
先执行 `networksetup -listallhardwareports` 查看接口名(如 en0 = Wi-Fi、en1 = USB 以太网),再用 `-ifscope` 指定出口接口:```bash
sudo route add -net 172.16.0.0/12 10.100.1.254 -ifscope en1对于无网关的点对点链路(如 USB 共享网络、隧道),可直接指定接口:
sudo route add -net 169.254.0.0/16 -interface en0永久路由配置
macOS 没有 route -p,重启后临时路由全部丢失。下面两种方案任选其一,推荐方案一。
方案一:networksetup(官方推荐,按网络服务配置)
networksetup -setadditionalroutes 会把路由绑定到指定的网络服务(如 Wi-Fi / 以太网),网络服务连接时自动生效,重启保留。
命令格式:
sudo networksetup -setadditionalroutes "网络服务名" 目标网段 子网掩码 网关IP [更多路由...]示例(为 Wi-Fi 配置两条永久路由):`bash
sudo networksetup -setadditionalroutes "Wi-Fi" 172.31.0.0 255.255.0.0 192.168.15.254 10.0.0.0 255.0.0.0 192.168.15.254
查看已配置的永久路由:
networksetup -getadditionalroutes "Wi-Fi"
清空永久路由:
sudo networksetup -setadditionalroutes "Wi-Fi"
> 网络服务名可通过 `networksetup -listallnetworkservices` 查看,中文系统常见为「Wi-Fi」「以太网」。
### 方案二:LaunchDaemon(开机自启脚本)
创建系统级守护任务 `/Library/LaunchDaemons/com.local.staticroute.plist`:```xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.local.staticroute</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/route</string>
<string>add</string>
<string>-net</string>
<string>172.31.0.0/16</string>
<string>192.168.15.254</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>加载并启动:`bash
sudo launchctl load /Library/LaunchDaemons/com.local.staticroute.plist
> 若有多条路由且依赖网络就绪,建议将加路由命令写成 shell 脚本(脚本内先 `sleep 5` 再执行 `route add`),plist 中调用脚本,避免开机时网卡未就绪导致添加失败。
---
## 完整示例代码
1. 查看当前路由表
netstat -rn
2. 添加临时静态路由(重启失效,测试用)
sudo route add -net 172.31.0.0/16 192.168.15.254
3. 验证路由
route -n get 172.31.0.1
4. 删除路由
sudo route delete 172.31.0.0/16
5. 配置永久路由(绑定 Wi-Fi 服务,重启保留)
sudo networksetup -setadditionalroutes "Wi-Fi" 172.31.0.0 255.255.0.0 192.168.15.254
6. 验证永久路由
networksetup -getadditionalroutes "Wi-Fi"
---
## 常见问题处理- **权限不足**:macOS 下添加/删除路由必须使用 `sudo`,普通用户执行会提示 `route: permission denied`。
- **参数错误**:注意与 Windows 的区别——不要写 `mask` 关键字,用 `-netmask` 或直接写 CIDR(如 `10.0.0.0/8`)。
- **重启后路由丢失**:临时路由不会持久化,请改用 `networksetup -setadditionalroutes` 或 LaunchDaemon 配置永久路由。
- **路由冲突 / 无法生效**:先删除旧路由(`sudo route delete 目标网段`),或使用 `-priority` 调整优先级;掩码越精确的路由优先级越高。