背景
由于项目需要使用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 | !/bin/bash |
将脚本保存为fix_route.sh并运行即可
1 | chmod +x fix_route.sh |
开机自动修改路由表
如果想开机自动修改的话,可以直接使用cron
1 | crontab -e |