我有一点设置简单 OpenVPN 解决方案的经验,其中几个客户端连接到中央服务器并在一个 VPN 中一起通信。
然而,我现在要从头开始建立一个 OpenVPN 基础设施,并且我怀疑我所考虑的方法是否合理。OpenVPN 基础设施具有以下特点:
- 有否两种类型的站点:
- 移动网站
- 固定站点
- 从逻辑上讲,每个移动网站恰好有一个已分配固定站点
- 站点固定客户A可能仅与网站的移动客户端对话A反之亦然
- 一个或多个移动客户端 (Linux)每个站点必须通过移动网络连接到中央服务器(linux),因此由于提供商的 NAT,没有可直接访问的固定 IP。
- 一个或多个固定客户端(窗口)每个站点应连接到一个中央服务器。每个客户端都应能够连接到一个移动客户端或移动客户端的子集。但是,固定客户端一次不得与多个移动客户端通信。
- 两个连接的客户端之间的通信应该与所有其他可能建立的连接隔离。
- 移动客户端最有可能尝试始终与中央服务器建立连接。但它们可能被配置为仅在收到请求时才进行连接。
- 固定客户端可以随时与中央服务器建立连接,并能够立即与所需的移动客户端进行通信(当然,当它也已连接时)
- 未来可能需要一个移动站点的所有移动客户端之间进行通信,或者一个移动站点的客户端子集之间进行通信。然而,即使有这样的要求,固定客户端可能仍然只能连接到一个移动客户端。
- 固定客户端,即使属于同一站点,也无需相互通信
- 负责基础设施的固定管理客户端必须能够访问每个移动客户端(每次一个),无论它属于哪个站点。管理客户端永远不必与固定客户端之一对话。
- 整个基础设施将(首先)让所有移动客户端都配备 OpenVPN 2.1.3,这个版本相当老旧,可能会随着固件更新而改变(这不是我负责的)。固定客户端和服务器将使用更新版本的 OpenVPN。
- 固定和移动客户端之间定期传输的数据量非常低(我预计它会少于几 KiB/s)但是随着时间的推移,这个数据量可能会大幅增加,这取决于我们将来将使用哪些额外的通信技术。
经过阅读和思考后,我想到,所有这些要求都可以通过以下方式满足:
- 提供单一中央 OpenVPN 服务器(考虑使用类似 Docker 的解决方案)https://github.com/kylemanna/docker-openvpn)
- 提供一个脚本基础设施,其中管理机构可以请求一对固定证书/pk 和移动证书/pk,以及在 OpenVPN 服务器中执行配置更改,根据所使用的通用名称设置一些路由/ip 配置。
- 只需使用特定的 cert/pk 对连接到服务器,即可在固定客户端中选择所需的移动目标进行连接。
这听起来像是一种满足要求的合理机制吗?如果从可扩展性和速度的角度考虑方法,我应该设置类似的东西还是应该研究替代方案(甚至是 OpenVPN 以外的其他技术?)
提前感谢您的意见
答案1
抱歉,我没有时间完全思考你的答案(尽管我承认,对于如此出色的解释,我表示赞赏,这对于 SO 格式来说很少见),但这里列出了一些你可能还不熟悉但可能会对你今后的学习有所帮助的想法:
- 您可能在单个服务器上运行多个 OpenVPN 实例(在不同的端口上);这可以提供客户端组的粗粒度分离(有关 Netfilter 请参见下文)。
- 使用拓扑
subnet
连接您的客户端并将它们放入不同的私有子网;您可以拥有由 OpenVPN 服务器实例控制的任意数量的私有网络。 - 在服务器配置中启用
client-to-client
选项,允许客户端在单个 OpenVPN 服务器实例的上下文中相互通信。 - 用于
push "route <addr> <netmask>"
告诉客户哪个其他 他们可以通过他们的 OpenVPN 连接访问的网络(即,除了他们的“本机”网络(他们在连接时碰巧连接的网络)之外的网络);请注意,您可能需要iroute
在 OpenVPN 配置中包含匹配的指令。 client-config-dir
您可以通过参数(称为)使用特定于客户端的配置片段ccd
;这允许将特定的路由指令推送到特定客户端,以便不同的客户端可以在需要时连接到不同的网络集。- 当您完成 OpenVPN 设置后,您可以使用 Netfilter 规则(
iptables
)对其进行优化,因为 OpenVPN 处理的所有流量仍然会通过链的适当表传递FORWARD
,因此在这里您可以控制 OpenVPN 处理的哪些网络可以相互通信。 - 还可以让 OpenVPN 接受客户端同时使用相同通用名称 (CN) 证书的连接;这可以作为最后的手段,将相同的设置应用于不同的客户端(通常通过
ccd
上面提到的机制)。我要强调的是,这是最后的手段,因为它可以防止对单个客户端的访问权限进行细粒度的撤销。
希望这可以帮助!