之前介绍过的分支互连都是基于IPSEC点到点,除了这个方法之外,还可以用反向连接的方式,把分支接入到一个大的虚拟专网中(类似于带着整个局域网穿透)。下面介绍的是如何利用OpenVPN客户端将一个分支接入到中心节点,供其它节点访问。
* 位于运营商大NAT环境下时,这种做法局限会很大,因为目标网段很可能和运营商内网网段有交叉重合。

一、拓扑

拓扑很简单,Server端(Windows Server 2019)和Client端(pfSense防火墙)分别位于两个局域网里,Client运行在防火墙上。预期效果是:Client一侧成功拨入后,除了常规的Client访问Server之外,Server端局域网内的主机也可通过OpenVPN连接反过来访问Client侧的主机。

二、服务端搭建和配置

本例的服务端跑在一台Windows虚拟机上,具体的部署网上教程太多了,抄一遍没什么意义。搭建过程也可以参考我之前写的pfSense搭建OpenVPN服务的文章。

搭建好服务后,Server侧还需要做如下工作:

  1. 为Client分配固定的IP作为Server端访问Client侧的下一跳地址;
  2. 在路由器上添加静态路由:目标网段为Client侧网段,下一跳为OpenVPN的服务器IP(如果由网关设备担任OpenVPN服务器,这一步可以省略);
  3. 在Server上添加静态路由:目标网段为Client侧网段,下一跳为Client获取到的IP。

首先,从Server侧trace到Client侧,发现中间没有网段重合(在半路陷到循环路由里了,说明中间节点不存在网络重合的情况),大前提已经满足,方案可行。

根据拓扑可以看出来,Server侧主机访问Client侧主机时,必须从Server走才行,而不是从路由器走。所以要让Server侧的所有主机跨出正确的第1步 —— 找得到OpenVPN服务器。因为相同的原因,服务器和路由器是同一台设备时,这条路由可以免去。

因此在路由器上添加到Client侧网段的静态路由,下一跳是OpenVPN服务器。如果没有这条路由,Server侧的电脑无从得知到目标网段的出口在哪里。这条路由也可以添加到Server侧所有主机中,但是远不如添加到路由器来得方便。

到目前为止,Server端的主机访问Client侧主机时,已经被路由器指到了服务器上,但是到这以后又开始找不到北了。Server侧的主机也好,Server本身也好,都不知道172.16.6.0/25在哪里,因为Server直连网段只有局域网的192.168.1.0/24和OpenVPN的虚拟网络网段10.10.10.0/24,因此需要在Server上也添加一条路由。

由于Client拿到的IP需要做Server端的下一跳地址,这个地址需要尽量固定,这样可以省去很多麻烦。

三、客户端配置

首先,准备需要的文件:

  1. Server端的CA证书(ca.crt, Server端的CA服务中导出);
  2. TLS Auth的key文件(服务端里直接拷);
  3. 用户的密钥对(client.key和client.crt,由CA签发的客户端证书)。

在 System -> Certificate Manager页面里,导入外部CA(流程和桌面安装一样,类似于Windows里把CA证书导入可信任的根证书颁发机构)和客户端证书。

配置OpenVPN客户端(配置关键点和PC客户端一样,tap/tun模式、tcp/udp、端口、ta.key、选择CA、选择客户端证书、配置匹配的Direction,匹配的加密算法)。

查看连接状态可以看到已经建立了连接,成功获取到了10.10.10.2。

防火墙策略比较粗放,出于连通测试的目的,仅配置了permit any,正式环境应该规划更精准严格的策略。

四、测试

1. 从Server侧访问Client侧的服务器

2. 从Client侧访问Server侧的服务器

五、客户端的另一种场景

如果不是由Client侧的网关作为客户端连接,而是Client网络内部的一台主机运行客户端,还需要在Client侧网关上添加对应路由:下一跳是Client的Lan地址,目标网段为Server侧网段。