Mac优化记录4--修改系统路由表

背景

由于项目需要使用VPN软件才能连接到特定的环境,但是连接VPN之后,内网的服务就连不上了,就导致了没法连接打印机或者是内网的服务器,故而产生了这个文章,研究了怎么在连接VPN的同时还能够连接到本地的服务器

实现方案

这里我才用的是修改路由表的方式,将需要连接的内网ip强制转成走本地路由

查询当前路由表

1
netstat -rn

可以看到这样的结果,我已经让GPT给我解析了一下

可以看到,现在默认所有的目标网段都走了VPN了,这就导致了无法连接内网

关键点
第一条 default(VPN):
网关:10.11.11.6(VPN 服务器分配的虚拟网关)。
接口:utun23(VPN 虚拟接口)。
Flags:UGScg(U=启用,G=网关,S=静态,c=克隆,g=网关缓存)。
优先级更高:因为 g(网关缓存)标志表示它是系统当前生效的默认路由。

第二条 default(本地):
网关:10.0.95.254(本地路由器或光猫的 IP)。
接口:en0(物理网卡,如 Wi-Fi/以太网)。
Flags:UGScIg(I=间接路由,通常表示备用路由)。
优先级更低:I 标志表明它是备选路由,仅在主路由失效时使用。

配置新路由规则

以10.0.199.111为例

1
sudo route -n add 10.0.199.111/32 10.0.95.254

/32 表示精确匹配单个 IP。
10.0.95.254 需替换为你的实际本地网关(通过 netstat -rn | grep default 确认)。

验证路由是否生效

继续使用命令

1
netstat -rn

可以看到如下一条

1
10.0.199.111/32    10.0.95.254        UGSc                  en0 

表示验证通过

重启后路由被覆盖

当电脑重启之后,再次无法连接,原因在于路由表被重新覆盖
这时候只需要创建一个脚本,在重启之后运行即可

1
2
3
4
5
6
#!/bin/bash
# 删除可能冲突的路由
sudo route -n delete 10.0.199.111/32 10.11.11.1 2>/dev/null
# 添加本地路由
sudo route -n add 10.0.199.111/32 10.0.95.254
echo "已强制 10.0.199.111 走本地网络"

将脚本保存为fix_route.sh并运行即可

1
2
chmod +x fix_route.sh
./fix_route.sh

开机自动修改路由表

如果想开机自动修改的话,可以直接使用cron

1
2
3
4
crontab -e

# 添加一行
@reboot /path/fix_route.sh