构建OpenVPN集群,实现端到端安全互联
构建OpenVPN集群,实现端到端安全互联
Author: OwnDing
Date: 2021-09-04
问题
最近在帮一家子公司处理一些IoT相关的事情,碰到一个需求:要让公司的5G网关产品能够安全的连接到服务器,并且同一个客户公司帐下的5G网关能够相互联通访问。
能够满足成千上万的客户端的安全连接各个客户端之间能够相互联通访问原有的5G网关产品自带有OpenVPN功能可以安全的连接到服务器,也可以在一个OpenVPN服务器内相互联通。但是,一台OpenVPN服务器能提供的VPN不超过200个,Windows客户端的话只有60多个,那么如何满足成千上万个5G网关产品连接呢?
面对这一问题,自然而然的想到了搭建OpenVPN集群,一个OpenVPN服务器提供100个连接,那么100台服务器自然就可以提供1万个连接了。不过随之新的问题又来了。我们需要同一个公司帐下的5G网关产品能够相互联通。一个公司有20台5G网关,10台连接到A服务器上了,10台连接到B服务器上了,那么这20台网关如何相互联通访问呢?
基本思路
搭建一个OpenVPN集群,集群在同一个子网内集群内的OpenVPN使用相同的密钥证书当OpenVPN客户端连接到服务器后,集群内其它服务器添加一条路由,将客户端IP路由到相关连接的服务器上
测试
OpenVPN测试示意图说明:两台OpenVPN服务器使用docker部署在一台阿里云服务器上,并且共享密钥证书。左边的客户端连接到VPN服务器(172.17.0.2,该地址为docker容器地址),获取到虚拟地址 192.168.255.6;右边的客户端连接到VPN服务器(172.17.0.4,该地址为docker容器地址),获取到虚拟地址 192.168.255.10。
1、客户端各自连接到对应的服务器上
2、在OpenVPN服务器上添加一条路由
1 | route add -host 192.168.255.6 gw 172.17.0.2 |
3、在 192.168.255.10 客户端上 ping 另一个客户端
1 | ping 192.168.255.6 |
4、可看到两个客户端可ping通
进阶
上面的测试例子使用的是同一网段的虚拟地址,一个网段能够提供的IP很有限无法满足需求,同时路由需要自己手动添加比较麻烦。我们需要不同OpenVPN服务器提供不同网段的虚拟地址,而且服务器能够自动添加相关路由。针对这一需求,在Github上找到一个示例。
部署OpenVPN集群,各个服务器使用相同的密钥证书,但是配置文件中的server网段可不同使用OpenVPN的learn-address脚本,当服务器接收到连接(add、update、delete)时,自动把连接信息进行子网内广播其它服务器接收到广播后自动添加或删除路由资料: