这篇文章比较长, 将从需求, 思路, 原理, 架构, 实施步骤, 细节分析, 高可用等几个方面来讲述 Open**N 的使用, 如果看到很熟悉的内容或者不感兴趣的部分, 请您跳过.
需求
公司网络环境更换, 导致原来连接阿里云的 VPN 现在只能建立一个连接, 网管解决不了, 所以只好换别的 VPN 解决方案. 阿里云自身有提供相关产品, 既支持 VPN 网关连接, 也支持单点 SSL 连接, 还有高可用支持, 唯一的缺点就是小贵, 对于我这种平常简单管理使用有点不值. 因为和谐上网的需要, 之前也了解过有哪些免费 VPN 服务器可用, 这次首先就想到了 OpenVPN.
这里有三个环境: 公司内部网络, 阿里云测试环境, 阿里云生产环境.
测试环境和生产环境都基于阿里云 VPC, 都是私网, 其中的机器都不能互相访问.
测试和生产环境可以用来部署 OpenVPN 的机器都是 Windows 操作系统.
需要在公司多人同时连接测试环境和生产环境, 并能够访问其中的所有机器.
测试环境和生产环境目前不需要互通, 以后可能有这方面的需求.
测试环境和生产环境不需要主动访问公司网络, 以后也不会有这方面的需求.
思路
在生产环境部署 OpenVPN Server, 在测试环境和公司内部部署 OpenVPN Client.
利用 OpenVPN 的 client to client 能力, 使 VPN 节点之间互相可以访问, 并能够路由请求到节点所在私网的其它机器, 从而实现物理隔离的私网之间的互通; 然后再使用防火墙 (阿里云安全组) 精细控制不同私网之间的访问权限, 比如以后测试环境和生产环境的互通控制需求.
原理
因为使用 OpenVPN 的桥接模式没有成功, 而且路由模式访问控制更加灵活, 所以这里介绍的是 OpenVPN 的路由模式.
先简单看一张图, 因为网上介绍的大部分都是在 Linux 上安装配置的, Windows 上的 Tun/Tap 驱动如何实现的不是很清楚, 但是应用到 OpenVPN 原理上应该差不多. 其中用户态和核心态可以这样理解: 用户态就是应用程序, 核心态就是操作系统.
OpenVPN 是 IP 层的 VPN, 节点安装后会在本机创建一个虚拟网卡; OpenVPN Server 可以将访问 OpenVPN 其它节点所在私网的路由推送到 OpenVPN Client, 这些路由的接口对应到当前机器的虚拟网卡; 所有使用 VPN 网络的应用将发送数据到这些虚拟网卡; OpenVPN 会读取虚拟网卡的数据, 封装后通过真实网卡发送到其它节点, 以及从真实网卡接收从其它节点发送的数据, 解析后发到虚拟网卡, 然后数据再被使用 VPN 网络通信的具体应用获取到.
部署架构
在开始安装之前, 先来看下整体的部署架构.
三个物理网络的网段分别为(注意这些网络不能有重复的, 否则会有冲突无法正常连接):
公司内网: 192.168.0.0/24
阿里云测试环境: 172.31.200.0/24
阿里云生产环境: 172.31.201.0/24
VPN 网络的网段为: 10.250.250.0/24
黑色的实线是实际的网络连接, 三个环境分属不同的私网, 他们和互联网都通过网关相连.
蓝色的虚线是 VPN 网络, VPN 网络由 OpenVPN 的 Server 和 Client 节点组成, Server 同时充当 VPN 网络的网关.
参与到 VPN 网络的三台机器都是私网内部的机器, 非私网的网关服务器, 需要给 OpenVPN Server 所在的机器绑定一个阿里云的弹性公网 IP, 因为客户端要跨越互联网来连接它.
如果 VPN 节点部署在网关服务器, 很多路由就不用单独配置了, 不过阿里云上无法实现, 部署过程中会提到这些路由.
部署步骤
1, 安装 OpenVPN
国家将 OpenVPN 的网站和谐了, 但是我们这里不是用于非法目的, 所以需要自己想办法搞一个安装包, 我这里版本是: 2.4.6.
安装服务器端和客户端的基本上是一样的, 需要注意服务器端要用来生成证书和密钥, 所以安装服务器的时候把 EasyRSA 这个选项勾上.
2, 创建证书和密钥
OpenVPN 节点之间的通信需要认证和加密. 通过 Windows 自带的命令行管理工具进入 easy-rsa 目录, 默认是在 C:\Program Files\OpenVPN\easy-rsa 然后执行如下命令初始化环境:
init-config
vars
clean-all
然后生成 CA 根证书: build-ca, 注意 Common Name 不要和后边其它密钥的重复.
然后创建迪菲. 赫尔曼密钥: build-dh, 这个是用在协商 VPN 数据加密密钥时用到的.
然后创建 ta 证书: openvpn --genkey --secret keys/ta.key, 这个是用来防御 DoS,UDP 淹没等恶意攻击.
然后生成服务器端证书: build-key-server server, 注意 Common Name 不能重复, 这里还需要设置一个证书密码, 随便取就行.
然后生成两个客户端 证书: build-key testclient,build-key comclient, 两个证书分别为测试环境和公司环境, Common Name 不能重复, 证书密码随便取.
这些证书或者密钥文件会生成到 easy-rsa/keys 目录下.
如果关闭了这个窗口, 下次再生成证书的时候需要先执行下 vars 命令, 加载变量到当前运行环境.
建议将 ca.key 文件放到一个离线的机器上, 需要生成客户端证书的时候再复制过来, 防止文件被窃取导致安全问题.
关于创建证书这块网上教程比较多, 我这里没有截图, 不明白的可以参考这个: https://www.cnblogs.com/airoot/p/7201227.html
3, 配置并启动 Server 节点
server 的配置文件需要放到安装目录的 cnofigs 目录下, 包括: ca.crt,dh2048.pem,server.crt,server.key,ta.key,server.ovpn.
除了 server.ovpn, 其它文件都从 easy-rsa/keys 拷贝就可以了.
server.ovpn 可以从 OpenVPN 安装目录 / sample-config 拷贝一个, 然后根据需要进行修改, 这里提供下这里的配置:
# OpenVPN 监听地址, 不配置默认所有本地地址
;local a.b.c.d
# 监听端口, 默认 1194
port 1194
# 使用 UDP 协议, IPv4, 效率比 TCP 更高
proto udp4
# 使用路由模式
dev tun
# 虚拟网卡的名称, 也可以注释掉
dev-node OVPN
# CA 证书和服务端密钥文件配置
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
# 使用 subnet, 每个 OpenVPN 节点分配一个 VPN 子网的 IP 地址
topology subnet
# OpenVPN 分配 IP 的网络号和子网掩码, 这里支持 254 个节点
server 10.250.250.0 255.255.255.0
# VPN 客户端分配的 IP 记录, 客户端重启后可以继续使用
ifconfig-pool-persist ipp.txt
# 需要把这些子网路由推送到 VPN 客户端, VPN 客户端会自动判断是否本地网段, 如果不是才会添加
# VPN 客户端所在机器根据这些路由转发对私网的网络请求
push "route 172.31.200.0 255.255.255.0"
push "route 172.31.201.0 255.255.255.0"
# client-to-client 将开放 VPN 客户端之间的互相访问
# client-config-dir ccd 是指定客户端配置文件的目录, Windows 在 OpenVPN 安装目录 / configs 下
# 这里因为要实现对测试环境子网的访问, 所以要添加一个 testclient 配置文件, 里边给出到 VPN 客户端 testclient 节点的路由
client-to-client
client-config-dir ccd
# 控制从系统核心到 OpenVPN 的路由, 即在 OpenVPN Server 所在机器增加到 VPN 客户端 testclient 的路由
# 到 172.31.200.0/24 的请求将通过本机虚拟网卡发送, 然后通过 OpenVPN Server 封装后发送到真实网络
route 172.31.200.0 255.255.255.0
keepalive 10 120
tls-auth ta.key 0
cipher AES-256-CBC
persist-key
persist-tun
status openvpn-status.log
verb 3
explicit-exit-notify 1
在 ccd 文件夹中新建名为 testclient 的文件, 为 testclient 指定 OpenVPN 内部路由配置, 也就是从 OpenVPN Server 到 testclient 节点的路由, 文件内容:
iroute 172.31.200.0 255.255.255.0
现在就可以启动 OpenVPN Server 了.
启动 OpenVPN GUI, 在任务栏中右键点击 Connect, 连接成功后会有提示, 并分配一个 VPN 的 IP, 这个 IP 应该是 VPN 网段的第一个 IP, 这里是 10.250.250.1.
4, 配置并启动阿里云测试环境 Client 节点
client 的配置文件也是放到本机 OpenVPN 安装目录下 configs 中, 包括: ca.crt,testclient.crt,testclient.key,ta.key,testclient.ovpn.
除了 testclient.ovpn 外, 其它四个文件都是在 OpenVPN Server 生成的, 拷贝过来就可以了. 这里看下 testclient.ovpn 的配置:
# 声明节点为 client
client
# tun 模式
dev tun
# 使用 UDP 通信
proto udp
# OpenVPN Server 服务器外网 IP, 请在阿里云给服务器绑定个弹性公网 IP, 然后写到这里
remote 123.x.x.x 1194
# 断网无限重试
resolv-retry infinite
# 本地不使用固定端口
nobind
persist-key
persist-tun
# 证书文件
ca ca.crt
cert testclient.crt
key testclient.key
# server 段证书
remote-cert-tls server
tls-auth ta.key 1
cipher AES-256-CBC
verb 3
启动 OpenVPN GUI, 在任务栏中右键点击 Connect, 连接成功后会有提示, 并分配一个 VPN 的 IP.
5, 配置并启动公司 Client 节点
公司 Client 节点和阿里云测试环境 Client 节点是差不多的, 区别就是证书文件不同, 公司 Client 节点的使用 comclient.crt,comclient.key, 替换相关文件就可以了.
comclient.ovpn 可以复制 testclient.ovpn, 然后修改其中的 cert 和 key 的名字.
启动 OpenVPN GUI, 在任务栏中右键点击 Connect, 连接成功后会有提示, 并分配一个 VPN 的 IP.
VPN 节点之间现在可以相互访问和连接了, 可以试试 ping 一下. 但是对于各个节点子网的访问还要继续配置下.
6, 开放子网机器给 VPN 网段
阿里云的 ECS 服务器都会归属于某个安全组, 安全组可以设置数据按照端口和协议进出的规则. 默认情况下, 安全组的入方向是全部被拒绝的, 如果要从 VPN 网段访问这些机器, 需要增加一个入方向的规则. 这个规则在测试环境和生产环境都需要添加.
7, 添加 VPN 网段路由
这时候会发现从客户端还是访问不了 Server 节点所在子网的其它机器, 这是因为虽然数据可以到达这些机器, 但是响应的数据无法回复给客户端, 因为这些机器通过路由找不到客户端; 所以生产环境这里还要做两个配置:
(1)在阿里云生产环境网关路由表中增加对 VPN 网段的路由, 将 VPN 网段路由到 OpenVPN Server 所在机器.
(2)在 OpenVPN Server 上启动路由服务, 也就是 Windows 服务: Routing and Remote Access 如果没有这个服务, 请首先安装 Windows 组件: 路由和远程访问, 安装后应该就有了, 注意不要配置 NAT.
现在应该可以从客户端节点访问到 Server 节点所在子网的其它机器了.
阿里云测试环境也要做相同的配置: 添加到 VPN 网段的路由, 启动 OpenVPN 所在服务器的路由服务, 这里就不啰嗦了.
这两个配置完成以后, 就可以从公司网络连接阿里云测试和生产环境的所有机器了.
但是不要高兴的太早, 这时候访问测试环境和生产环境的互通还是不行的, 为什么呢? 还是路由的问题, OpenVPN Server 所在子网的机器找不到去测试环境网段的路由; 所以在阿里云生产环境 VPC 路由中还需要增加路由条目, 和上边类似: 目标网段换成 172.31.200.0/24, 下一跳还是 OpenVPN Server 所在的服务器.
这样就可以实现测试环境和生产环境的互访了.
8, 控制测试环境和生产环境的互访权限
测试环境和生产环境的互通是比较危险的, 因为如果部署的时候搞错配置, 到时候数据可能乱掉. 但是有时候一些公共的查询服务没必要搞两份, 比如天气服务只在生产环境搞一份就行了, 测试环境要使用也访问这个. 这个问题一般可以通过防火墙解决, 在阿里云上有一个安全组的概念, 可以用来干这件事. 比如这样配置:
这里完全禁止了测试环境访问生产环境, 上边的端口范围可以根据自己的需要调整. 阿里云入方向其实默认是全部禁止的, 需要自己开放端口和协议. 可以自己试试看看效果.
到这里安装配置基本上就完成了, 感觉还是很繁琐的, 中间的事比较多, 希望读者能够顺利完成. 但是从另一个方面也说明这个方案实现网络访问控制很灵活, 可以配置的东西比较多.
细节分析
如果你很想搞清楚在 VPN 网络中数据是怎么流转的, 以及上边的这些配置到底是怎么发挥作用的, 这里写了一个流程, 希望能够帮助到你.
以公司某台电脑 C1: 192.168.0.220 使用远程桌面访问生产环境某台服务器 S1: 172.31.201.110 为例:
1,C1 安装 OpenVPN 后本机会创建一个虚拟网卡, 这时候虚拟网卡还没有连接;
2, 将 OpenVPN Client 连接到 Server 节点后, 会分配到一个 VPN 地址(比如 10.250.250.4), 以及创建到生产环境的路由信息, 这些信息是 Server 节点 push 过来的;
3,C1 现在要访问 S1 了, 通过本机路由信息得知需要走 10.250.250.4 对应的虚拟网卡接口;
4,C1 的远程桌面客户端发送 S1 的连接请求, 请求访问操作系统网络调用, 最终封装为一个 IP 报文, 通过虚拟网卡发送;
5,C1 的 OpenVPN 此时会读取到通过虚拟网卡发送的数据, 然后在 IP 报文的外层再包裹 IP 头和 UDP 协议, 指示要前往生产环境时的真实网络 IP 信息, 然后提交到 C1 的真实网卡;
6,C1 的真实网卡会将数据通过本地网关发到互联网, 最终发到生产环境 OpenVPN 所在服务器 V1,V1 的真实网卡会根据 UDP 协议关联到当前节点的 OpenVPN 程序进行数据接收;
7,V1 的 OpenVPN 取出内层的 IP 报文, 发现目标地址 172.31.201.110 为局域网内部, 通过局域网网关获取目标服务器 Mac 地址, 直接走真实网卡, 然后就到达了 S1;
8,S1 收到建立远程桌面的请求后, 要给对方回个消息, 这时候要知道数据发向哪里, 它会发一个 ARP 广播, 寻找 10.250.250.4 的物理地址;
9, 生产环境的局域网中没有 10.250.250.4, 但是生产环境的网关知道, 对于 10.250.250.4 请发送到 OpenVPN 所在服务器 V1;
10,V1 服务器启动了路由服务, 也就是 V1 是个路由器, 会继续发现到 10.250.250.4 需要走本地虚拟网卡 10.250.250.1, 并获取虚拟网卡的 Mac 地址;
11, 然后数据到达 V1, 通过 V1 的虚拟网卡进行发送, V1 上的 OpenVPN 获取到响应数据, 将这些数据再次封装, 通过真实网卡, 网关和互联网发送到公司内部的 C1 服务器;
12,C1 的真实网卡会根据 UDP 协议关联到当前节点的 OpenVPN 程序进行数据接收, OpenVPN 取出内层的 IP 报文, 根据本地路由查找发现是给虚拟网卡的, 然后写数据到虚拟网卡;
13, 然后 C1 上的远程桌面客户端会从虚拟网卡中读取到 S1 发送给自己的数据.
这样就完成了一次数据的交互, 后续的数据交互都是按照这个流程去走, 中间过程还是比较复杂的, 而且我省略了很多底层机制, 重点描述了 OpenVPN 对数据的处理过程.
高可用
OpenVPN 官网上有一个负载均衡 / 故障转移的策略:
来源: https://www.cnblogs.com/bossma/p/10055631.html
推荐本站淘宝优惠价购买喜欢的宝贝:
本文链接:https://hqyman.cn/post/3255.html 非本站原创文章欢迎转载,原创文章需保留本站地址!
打赏微信支付宝扫一扫,打赏作者吧~
休息一下~~