openvpn的PAC绕过大陆模式实现方法详解
简介
之前写过openvpn客户端证书上配置路由来达到提速和分流的目的,总觉得写的不是很详细,还是有一些
没讲清楚的地方。openvpn不做过多介绍,大致就是基于openSSL库的应用层VPN虚拟网络的实现,是基于SSL
协议。正常情况之下呢,VPN隧道连接成功后会自动增加路由条目,并且把网关地址设置成VPN的地址,这样所
有的流量都会通过VPN来传送。这样的话就不利于我们办公环境,如果要兼并VPN隧道和本地网络分流,让该走
的流量指定到需要走的路由,这就需要我们人工手动添加路由表增加路由条目来实现。
这个需求就有点像v2ray或者ssr当中的PAC模式了,但openvpn不具备天然的功能。
先往下看一下参数的介绍
参数介绍
控制着Openvpn自定义路由的三个参数
由route-nopull、vpn_gateway、net_gateway来决定路由
route-nopull
客户端的证书中加入这个参数后,openvpn 连接后不会添加路由,也就是不会有任何网络请求走 openvpn
,所有的流量都由本地转发(单独使用这条参数无意义)。
route-nopull
vpn_gateway
在客户端的证书中加入 route-nopull 后,所有出去的访问都不从 openvpn 出去,这里用到 vpn_gateway
参数使指定的IP访问走 openvpn 出去。例如:
route-nopull
route 192.168.1.0 255.255.0.0 vpn_gateway
route 10.0.0.0 255.255.0.0 vpn_gateway
net_gateway
这个参数和 vpn_gateway 相反,表示在默认出去的访问全部走 openvpn 时,强行指定部分IP访问不通过
openvpn出去。max-routes 参数表示可以添加路由的条数,默认只允许添加100条路由,如果少于100条路由可不
加这个参数。例如:
max-routes 1000
route 192.168.1.0 255.255.255.0 net_gateway
参数都介绍完了,下面就开始看实操部分,具体怎么实现,openvpn的路由条目怎么写
实例
官方的配置文件的写法,有兴趣的也可以研究一下
https://github.com/OpenVPN/openvpn/blob/master/sample/sample-config-files/server.conf
客户端修改
只需要手动的修改本地的配置文件即可,服务端那边不需要做修好。适合客户端数量较多并且网络条件复
杂,定制化路由需求。比如打开openvpn生成的配置文件1.ovpn进行演示,添加如下的路由条目。
第一种写法
route-metric 150
route-nopull
route 10.0.0.0 255.255.0.0 vpn_gateway
route-nopull:是不默认建立路由表(即不会出现所有流量经过VPN)
route:目标的IP和目标的子网掩码,利用vpn_gateway语句允许通过VPN流量
第二种写法
max-routes 1000
route 192.168.1.0 255.255.255.0 net_gateway
max-routes:则表示可以增加的路由条数
roote:这里写的是本地IP和子网掩码,利用net_gateway语句不通过VPN流量
使用语句不能添加 route-nopull
可以给不代理的国内IP段加进去,这里是国内IP段的列表
我使用的是第一种写法
具体修改
服务端修改
在服务器端上配置可以推送的全局路由,这样额好处则省却了客户端上进行配置,客户端不用修改任何
配置,配置推送全局路由,适合网络条件相似的环境。修改配置文件
vi /etc/openvpn/server/server.conf
在openvpn服务器配置文件中加入
push "route 172.16.0.0 0.0.0.0 net_gateway"
push "route 192.168.2.0 255.255.255.0 net_gateway"
push "route 192.168.1.0 255.255.255.0 net_gateway"
push "route 192.168.0.0 255.255.255.0 net_gateway"
查看openvpn进程ID,得到的进程ID值后
pidof openvpn
用kill命令结束掉
kill -9 ID值
最后重启服务
openvpn --daemon --config /etc/openvpn/server/server.conf
查看路由
最后我们查看路由表的变化,windows可以用这以下两套条命令查看
netstat -nr
route print
没连上之前我们的路由表情况
连上之后