有些时候我们需要通过 OpenVPN 连接到特定的内网环境。但是用了 OpenVPN 之后,本地所有的流量都走 OpenVPN 了,这个时候可能Clash 或者其他的本来在用的代理就会出现冲突。两个代理只能同时开一个。
最好的状态是什么样的了,日常的代理还是能继续用,然后特定内网的 IP 和 域名流量走 OpenVPN。
研究了一下,目前可以用这样的方式实现。(如果可以修改 OpenVPN 服务端参数,会有另外的改法,这里只是讲单纯在客户端怎么改)

修改 OpenVPN 接管的流量范围

OpenVPN 的每个连接都有一个配置,比如 macOS 上,客户端配置的地址在 ~/Library/Application Support/OpenVPN Connect/profiles
我们需要在配置里加上这样两部分内容

route-nopull # 禁止客户端接收服务器推送的路由规则,即不要让 OpenVPN 接管所有流量

route 10.0.0.0 255.255.0.0 vpn_gateway # 这里手动添加路由信息,因为不用服务端下发的了,所以手动添加需要通过 vpn 访问的 ip 段。
route 10.30.0.0 255.255.0.0 vpn_gateway
route 172.30.0.0 255.255.0.0 vpn_gateway

上面的 vpn_gateway 就是标识走 VPN 的出口路由,同样的还有一个相反的 net_gateway 。比如加上

route 192.168.0.0 255.255.0.0 net_gateway 

就是表示强制这个 ip 段不走 VPN。

如果有配置 redirect-gateway,也需要注释掉。

处理域名访问问题

通过上面的方式,部分 ip 段的流量会走 VPN 了,但是还有很多地方是用域名访问的,没有了 VPN,这些域名无法解析。

配置 DNS

一种方案是在 DNS 里配置上 VPN 内网的 DNS 地址,这里我没试过,应该是可以的。

配置 host

目前我是用的这种方案,将需要使用 VPN 访问的域名在 host 里配置上,域名不多的情况下,这种方案是最简单的。缺点是不支持泛域名。
如果要支持上泛域名解析,可以自己在本地搭建一个 DNS 服务,比如 dnsmasq。

使用 http 代理

另外如果要支持泛域名,可以在内网某台机器上安装一个 http/socks 代理。然后在对应的应用上配置这些代理,比如只是网页上使用的话,可以安装 Proxy SwitchyOmega 插件配置。想测试 API 接口可以在 Postman 上配置。

参考

https://blog.kagamikun.com/archives/openvpnshe-zhi-fei-quan-ju-dai-li
https://blog.rayfalling.com/2020/01/openvpn-%E8%B7%AF%E7%94%B1%E8%AE%BE%E7%BD%AE.html