我在之前的两篇文章中介绍了如何搭建并使用openvpn【1】,【2】。但是在日常链接访问的时候,我发现用此种方式搭建的openvpn用的是全局模式。也就是说不管我们访问什么网络,都需要通过VPN链接才行。这样在平时的网络访问中,反而降低了我们的效率。

于是我想到之前用ssr的小飞机的时候,有个PAC智能路由模式。心想OpenVPN能不能也做到这样的功能呢。于是搜索了解,果真有实现的方法。在此做一下记录。

因为我需要的是想走VPN的IP走VPN,但其他的网络访问都不走VPN。这样就需要自定义路由。主要由route-nopull、vpn_gateway、net_gateway三个参数决定。其中:

1.route-nopull:当客户端加入这个参数后,openvpn 连接后不会添加路由,也就是不会有任何网络请求走 openvpn。

2.vpn_gateway:当客户端加入 route-nopull 后,所有出去的访问都不从 Openvpn 出去,但可通过添加 vpn_gateway 参数使部分IP访问走 Openvpn 出去。

例如:
route 192.168.1.0 255.255.0.0 vpn_gateway
route 172.121.0.0 255.255.0.0 vpn_gateway

3.net_gateway:这个参数和 vpn_gateway 相反,表示在默认出去的访问全部走 Openvpn 时,强行指定部分IP访问不通过 Openvpn 出去. max-routes 参数表示可以添加路由的条数,默认只允许添加100条路由,如果少于100条路由可不加这个参数。

例如:
max-routes 1000
route 172.121.0.0 255.255.0.0 net_gateway

比较常用做法是在客户端配置文件中加上 route-nopull 再使用 vpn-gateway 逐条添加需要走 Openvpn 的 ip。
设置如下:

#block-outside-dns
route-nopull
#以下路由根据自己实际情况进行添加调整
route 172.16.0.0 255.255.0.0 vpn_gateway
route 172.17.0.0 255.255.0.0 vpn_gateway

设置好后我们进行验证可以发现,连接上OpenVPN后百度IP显示的还是我们宽带的IP,并不是VPN服务器的IP,可以得出该智能路由有成功生效。

遇到的问题

Linux 上没有问题,但是在 Win 10 上 OpenVPN,配置中写入了route-nopull,发现没有用,因为发现所有流量都走了 VPN。
所以需要删除block-outside-dns

Q.E.D.