设置传统 VPN 连接
此 VPN 信息仅适用于传统群集。 有关 VPC 集群的 VPN 信息,请参阅设置 VPC VPN 连接。
通过 VPN 连接,您可以将 Red Hat® OpenShift® on IBM Cloud® 上 Red Hat OpenShift 集群中的应用程序安全地连接到内部网络。 您还可以将集群外部的应用程序连接到在集群内部运行的应用程序。
要将工作程序节点和应用程序连接到内部部署数据中心,可以配置下列其中一个选项。
-
strongSwan IPSec VPN 服务:您可以设置 strongSwan IPSec VPN 服务,将 Red Hat OpenShift 集群与内部网络安全连接起来。 strongSwan IPSec VPN 服务通过因特网提供基于业界标准因特网协议安全性 (IPSec) 协议套件的安全端到端通信信道。 要在集群与内部部署网络之间设置安全连接,请在集群的 pod 中直接配置和部署 strongSwan IPSec VPN 服务。
-
IBM Cloud® Direct Link: IBM Cloud Direct Link 允许您在远程网络环境和 Red Hat OpenShift on IBM Cloud 之间建立直接的专用连接,而无需通过公共互联网进行路由。 当您必须实施混合工作负载、跨提供商工作负载、大型或频繁的数据传输或私有工作负载时,IBM Cloud Direct Link 产品非常有用。 要选择 IBM Cloud Direct Link 产品并设置 IBM Cloud Direct Link 连接,请参阅 IBM Cloud Direct Link 文档中的 入门 IBM Cloud IBM Cloud Direct Link。
-
Virtual Router Appliance (VRA): 您可以选择设置 VRA(Vyatta) 以配置 IPSec VPN 端点。 如果您具有更大的集群,希望通过单个 VPN 访问多个集群,或者需要基于路径的 VPN,那么此选项会非常有用。 要配置 VRA,请参阅 使用 VRA 设置 VPN 连接。
如果计划将集群连接到本地网络,请查看以下有用的功能。
-
您可能与 IBM提供的缺省 172.30.0.0/16 范围 (针对 pod) 和 172.21.0.0/16 范围 (针对服务) 存在子网冲突。 在
--pod-subnet
选项中为 pod 指定自定义子网 CIDR,在--service-subnet
选项中为服务指定自定义子网 CIDR,这样就可以避免 从 CLI 创建群集 时发生子网冲突。 -
如果 VPN 解决方案保留请求的源 IP 地址,那么可以 创建定制静态路由 以确保工作程序节点可以将响应从集群路由回本地网络。
禁止 172.16.0.0/16
,172.18.0.0/16
,172.19.0.0/16
和 172.20.0.0/16
子网范围,因为它们是为 Red Hat OpenShift on IBM Cloud 控制平面功能保留的。
使用 strongSwan IPSec VPN 服务 Helm chart
使用 Helm chart 在 Kubernetes pod 内配置并部署 strongSwan IPSec VPN 服务。
由于 strongSwan 已在集群中集成,因此无需外部网关设备。 VPN 连接建立后,会自动在群集中的所有工作节点上配置路由。 这些路由支持在任何工作程序节点上的 pod 与远程系统之间通过 VPN 隧道进行双向连接。 例如,下图显示了 Red Hat OpenShift on IBM Cloud 中的应用程序如何通过 strongSwan VPN 连接与内部服务器通信。
-
集群中的应用程序
myapp
接收来自 Ingress 或 LoadBalancer 服务的请求,并且需要安全地连接到内部部署网络中的数据。 -
对内部部署数据中心的请求将转发到 IPSec strongSwan VPN pod。 目标 IP 地址用于确定将哪些网络包发送到 IPSec strongSwan VPN pod。
-
该请求已加密,并通过 VPN 隧道发送到内部部署数据中心。
-
入局请求通过内部部署防火墙传递,并传递到将在其中进行解密的 VPN 隧道端点(路由器)。
-
VPN 隧道端点 (路由器) 根据步骤 2 中指定的目标 IP 地址,将请求转发到本地服务器或大型机。 通过同一进程通过 VPN 连接将必需的数据发送回
myapp
。
strongSwan VPN 服务注意事项
使用 strongSwan Helm chart 之前,请查看以下注意事项和限制。
- 仅经典集群支持 strongSwan Helm Chart,VPC 集群不支持此 Chart。 有关 VPC 集群的 VPN 信息,请参阅设置 VPC VPN 连接。
- strongSwan Helm chart 需要远程 VPN 端点启用 NAT 遍历。 除了缺省 IPSec UDP 端口 500 之外,NAT 遍历还需要 UDP 端口 4500。 需要允许这两个 UDP 端口通过任何配置的防火墙。
- strongSwan Helm chart 不支持基于路径的 IPSec VPN。
- strongSwan Helm 图表支持使用预共享密钥的 IPSec VPN,但不支持需要证书的 IPSec VPN。
- strongSwan Helm chart 不允许多个集群和其他 IaaS 资源共享单个 VPN 连接。
- strongSwan Helm chart 作为集群内部的 Kubernetes pod 运行。 VPN 性能受集群中运行的 Kubernetes 和其他 pod 的内存和网络使用情况的影响。 如果您的环境中性能很重要,请考虑使用在集群外部的专用硬件上运行的 VPN 解决方案。
- strongSwan Helm chart 将单个 VPN pod 作为 IPSec 隧道端点运行。 如果 pod 发生故障,集群将重新启动该 pod。 不过,在新 pod 启动和重新建立 VPN 连接时,您可能会经历短暂的停机时间。 如果需要从错误更快恢复,或需要更详细的高可用性解决方案,请考虑使用在集群外部的专用硬件上运行的 VPN 解决方案。
- strongSwan Helm chart 不提供对通过 VPN 连接传递的网络流量的度量或监视。 有关受支持监视工具的列表,请参阅日志记录和监视服务。
- 仅支持过去 6 个月发布的 strongSwan Helm Chart 版本。 确保持续 升级 strongSwan Helm chart 以获取最新功能和安全修订。
集群用户可以使用 strongSwan VPN 服务,通过私有云服务端点连接到 Kubernetes 主站。 但是,通过私有云服务端点与 Kubernetes 主站的通信必须通过 166.X.X.X
IP 地址范围,而该范围无法从 VPN 连接中路由。 您可以 使用私有网络负载均衡器(NLB) 向集群用户公开主服务器的私有云服务端点。
私有 NLB 将主站的私有云服务端点作为 strongSwan VPN pod 可以访问的内部 172.21.x.x
集群 IP 地址公开。 如果只启用私有云服务端点,可以使用 Kubernetes 控制面板或临时启用公共云服务端点来创建私有 NLB。
在多专区集群中配置 strongSwan VPN
多专区集群通过使应用程序实例在多个专区中的工作程序节点上可用,可在发生中断时为应用程序提供高可用性。 但是,在多专区集群中配置 strongSwan VPN 服务比在单专区集群中配置 strongSwan 更复杂。
在多专区集群中配置 strongSwan 之前,请首先尝试将 strongSwan Helm chart 部署到单专区集群中。 首次在单区群集和内部网络之间建立 VPN 连接时,可以更容易地确定对于多区 strongSwan 配置非常重要的远程网络防火墙设置。
- 某些远程 VPN 端点在
leftid
文件中具有rightid
或ipsec.conf
等设置。 如果您有这些设置,请检查是否必须将leftid
设置为 VPN IPSec 隧道的 IP 地址。 - 如果连接是从远程网络到集群的入站连接,请检查远程 VPN 端点是否可以在一个专区中的负载均衡器发生故障时,与其他 IP 地址重新建立 VPN 连接。
要开始在多专区集群中使用 strongSwan,请选择下列其中一个选项。
- 如果可以使用出站 VPN 连接,那么可以选择仅配置一个 strongSwan VPN 部署。 请参阅从多专区集群配置一个出站 VPN 连接。
- 如果需要入站 VPN 连接,那么根据远程 VPN 端点是否可以配置为在检测到中断时与其他公共负载均衡器 IP 重新建立 VPN 连接,您可以使用的配置设置有所不同。
- 如果远程 VPN 端点可以自动与其他 IP 重新建立 VPN 连接,那么可以选择仅配置一个 strongSwan VPN 部署。 请参阅配置与多专区集群的一个入站 VPN 连接。
- 如果远程 VPN 端点不能自动将 VPN 连接重新建立到不同的 IP,则必须在每个区域部署单独的入站 strongSwan VPN 服务。 请参阅在多专区集群的每个专区中配置 VPN 连接。
请尝试将环境设置为针对多专区集群的出站或入站 VPN 连接仅需要一个 strongSwan VPN 部署。 如果必须在每个专区中设置单独的 strongSwan VPN,请确保计划如何管理这一增加的复杂性和提高的资源使用量。
从多专区集群配置一个出站 VPN 连接
要在多专区集群中配置 strongSwan VPN 服务,最简单的解决方案是使用可在集群中所有可用性专区的不同工作程序节点之间切换的单个出站 VPN 连接。
VPN 连接是来自多专区集群的出站连接时,只需要一个 strongSwan 部署。 如果某个工作程序节点已被除去或发生中断,kubelet
会将 VPN pod 重新安排到新的工作程序节点上。 如果某个可用性专区发生中断,kubelet
会将 VPN pod 重新安排到其他专区中的新工作程序节点上。
-
配置一个 strongSwan VPN Helm chart。 按照该部分的步骤操作时,请确保指定以下设置。
ipsec.auto
:更改为start
。 连接是来自集群的出站连接。loadBalancerIP
:不要指定 IP 地址。 请将此设置保留为空。zoneLoadBalancer
:为工作程序节点所在的每个专区指定一个公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址或释放使用的 IP 地址。 由于可以将 strongSwan VPN pod 安排到任何专区中的工作程序节点,因此该 IP 列表可确保在其中安排了 VPN pod 的任何专区中都可以使用负载均衡器 IP。connectUsingLoadBalancerIP
:设置为true
。 将 strongSwan VPN pod 安排到工作程序节点上时,strongSwan 服务会选择同一专区中的负载均衡器 IP 地址,并使用此 IP 来建立出站连接。local.id
:指定远程 VPN 端点支持的固定值。 如果远程 VPN 端点要求您将local.id
选项 (ipsec.conf
中的leftid
值) 设置为 VPN IPSec 隧道的公共 IP 地址,请将local.id
设置为%loadBalancerIP
。 此值会自动将ipsec.conf
中的leftid
值配置为用于连接的负载均衡器 IP 地址。- 可选:通过将
enableSingleSourceIP
设置为true
,将所有群集 IP 地址隐藏在每个区域的单个 IP 地址后面。 此选项为 VPN 连接提供了其中一种最安全的配置,因为不允许远程网络向后连接到集群。 您还必须将local.subnet
设置为%zoneSubnet
变量,并使用local.zoneSubnet
为集群中每个专区指定一个 IP 地址作为 /32 子网。
-
在远程网络防火墙中,允许来自
zoneLoadBalancer
设置中列出的公共 IP 地址的入局 IPSec VPN 连接。 -
配置远程 VPN 端点,以允许来自
zoneLoadBalancer
设置中列出的每个可能的负载均衡器 IP 的入局 VPN 连接。
配置与多专区集群的一个入站 VPN 连接
如果需要入局 VPN 连接,并且远程 VPN 端点可以在检测到故障时自动与其他 IP 重新建立 VPN 连接,那么可以使用可在集群中所有可用性专区的不同工作程序节点之间切换的单个入站 VPN 连接。
远程 VPN 端点可以与任何专区中的任何 strongSwan 负载均衡器建立 VPN 连接。 无论 VPN pod 位于哪个专区中,都会将入局请求发送到该 VPN pod。 来自 VPN pod 的响应会通过原始负载均衡器发送回远程 VPN 端点。 此选项可确保高可用性,因为如果某个工作程序节点已被除去或发生中断,kubelet
会将 VPN pod 重新安排到新的工作程序节点上。 此外,如果某个可用性专区发生中断,那么远程 VPN 端点可以与其他专区中的负载均衡器
IP 地址重新建立 VPN 连接,以便仍能访问 VPN pod。
-
配置一个 strongSwan VPN Helm chart。 按照该部分的步骤操作时,请确保指定以下设置。
ipsec.auto
:更改为add
。 连接是集群的入站连接。loadBalancerIP
:不要指定 IP 地址。 请将此设置保留为空。zoneLoadBalancer
:为工作程序节点所在的每个专区指定一个公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址或释放使用的 IP 地址。local.id
: 如果远程 VPN 端点要求您将local.id
选项 (ipsec.conf
中的leftid
值) 设置为 VPN IPSec 隧道的公共 IP 地址,请将local.id
设置为%loadBalancerIP
。 此值会自动将ipsec.conf
中的leftid
值配置为用于连接的负载均衡器 IP 地址。
-
在远程网络防火墙中,允许连至
zoneLoadBalancer
设置中列出的公共 IP 地址的出局 IPSec VPN 连接。
在多专区集群的每个专区中配置入站 VPN 连接
当您需要传入 VPN 连接,而远程 VPN 端点无法重新建立到不同 IP 的 VPN 连接时,您必须在每个区域部署单独的 strongSwan VPN 服务。
远程 VPN 端点必须更新为与每个专区中的负载均衡器建立单独的 VPN 连接。 此外,必须在远程 VPN 端点上配置特定于专区的设置,以便其中每个 VPN 连接都是唯一的。 确保这些多个传入的 VPN 连接保持激活状态。
部署每个 Helm chart 后,每个 strongSwan VPN 部署会作为正确专区中的 Kubernetes Load Balancer 服务启动。 对该公共 IP 的入局请求会转发到也在同一专区中分配的 VPN pod。 如果该专区遇到中断,不会影响其他专区中建立的 VPN 连接。
-
针对每个专区配置 strongSwan VPN Helm chart。 执行该部分中的步骤时,请确保指定以下设置:
loadBalancerIP
:指定在其中部署此 strongSwan 服务的专区中的可用公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址或释放使用的 IP 地址。zoneSelector
:指定要在其中安排 VPN pod 的专区。- 可能需要其他设置,例如
zoneSpecificRoutes
、remoteSubnetNAT
、localSubnetNAT
或enableSingleSourceIP
,具体取决于哪些资源必须可通过 VPN 进行访问。 请参阅下一步以了解更多详细信息。
-
在 VPN 隧道的两端配置特定于专区的设置,以确保每个 VPN 连接都是唯一的。 根据哪些资源必须可通过 VPN 进行访问,您有两个选项可用于区分连接:
- 如果群集中的 pod 必须访问远程内部网络上的服务、
zoneSpecificRoutes
:设置为true
。 此设置将 VPN 连接限制在群集中的单个区域。 特定专区中的 pod 仅使用针对该特定专区设置的 VPN 连接。 此解决方案减少了在多专区集群中支持多个 VPN 所需的 strongSwan pod 数,提高了 VPN 性能(因为 VPN 流量仅流至位于当前专区中的工作程序节点),并可确保每个专区的 VPN 连接不受其他专区中的 VPN 连接、崩溃的 pod 或专区中断的影响。 请注意,您无需配置remoteSubnetNAT
。 使用zoneSpecificRoutes
设置的多个 VPN 可以具有相同的remote.subnet
,因为路由是按专区设置的。enableSingleSourceIP
:设置为true
,并将local.subnet
设置为单个 /32 IP 地址。 这种设置组合可将所有群集专用 IP 地址隐藏在单个 /32 IP 地址后面。 此唯一的 /32 IP 地址允许远程内部部署网络通过正确的 VPN 连接,将回复发送回集群中启动请求的正确 pod。 请注意,为local.subnet
选项配置的单个 /32 IP 地址在每个 strongSwan VPN 配置中必须唯一。
- 如果远程内部网络中的应用程序必须访问群集中的服务、
localSubnetNAT
:确保内部部署远程网络中的应用程序可以选择特定的 VPN 连接来发送和接收流至集群的流量。 在每个 strongSwan Helm 配置中,使用localSubnetNAT
来唯一地标识可由远程内部部署应用程序访问的集群资源。 由于从远程内部网络到群集要建立多个 VPN,因此必须在内部网络的应用程序中添加逻辑,以便在访问群集中的服务时选择使用哪个 VPN。 请注意,集群中的服务可通过多个不同的子网进行访问,具体取决于在每个 strongSwan VPN 配置中为localSubnetNAT
配置的内容。remoteSubnetNAT
:确保集群中的 pod 使用相同的 VPN 连接将流量返回到远程网络。 在每个 strongSwan 部署文件中,使用remoteSubnetNAT
设置将远程内部部署子网映射到唯一子网。 集群中的 pod 从特定于 VPN 的remoteSubnetNAT
收到的流量会发送回特定于 VPN 的这一相同remoteSubnetNAT
,然后通过这一相同 VPN 连接传递。
- 如果集群中的 pod 必须访问远程本地网络上的服务,而远程本地网络中的应用程序必须访问集群中的服务,请配置第二个项目符号点中列出的
localSubnetNAT
和remoteSubnetNAT
设置。 请注意,如果集群中的 pod 向远程内部部署网络发起请求,那么必须向 pod 添加逻辑,以便其可以选择要用于访问远程内部部署网络上的服务的 VPN 连接。
- 如果群集中的 pod 必须访问远程内部网络上的服务、
-
配置远程 VPN 端点软件,以与每个专区中的负载均衡器 IP 建立单独的 VPN 连接。
配置 strongSwan Helm chart
安装 strongSwan Helm chart 之前,您必须决定 strongSwan 配置。
准备工作
- 在内部部署数据中心内安装 IPSec VPN 网关。
- 确保您拥有
default
命名空间的 Writer 或 Manager IBM Cloud IAM 服务访问角色。 - 访问 Red Hat OpenShift 集群。 所有 strongSwan 配置均可用于标准群集。
步骤 1:获取 strongSwan Helm chart
安装 Helm 并获取 strongSwan Helm chart 以查看可能的配置。
-
遵循指示信息 在本地机器上安装 V 3 Helm 客户机。
-
在本地 YAML 文件中保存 strongSwan Helm chart 的缺省配置设置。
helm show values iks-charts/strongswan > config.yaml
-
打开
config.yaml
文件。
步骤 2:配置基本 IPSec 设置
要控制 VPN 连接的建立,请修改以下基本 IPSec 设置。
有关每个设置的更多信息,请阅读 Helm chart 的 config.yaml
文件中提供的文档。
- 如果内部部署 VPN 隧道端点不支持
ikev2
作为初始化连接的协议,请将ipsec.keyexchange
的值更改为ikev1
。 - 将
ipsec.esp
设置为内部部署 VPN 隧道端点用于连接的 ESP 加密和认证算法的列表。- 如果
ipsec.keyexchange
设置为ikev1
,那么必须指定此设置。 - 如果
ipsec.keyexchange
设置为ikev2
,那么此设置是可选的。 - 如果将此设置保留为空,那么会将缺省 strongSwan 算法
aes128-sha1,3des-sha1
用于连接。
- 如果
- 将
ipsec.ike
设置为内部部署 VPN 隧道端点用于连接的 IKE/ISAKMP SA 加密和认证算法的列表。 算法必须明确采用格式encryption-integrity[-prf]-dhgroup
。- 如果
ipsec.keyexchange
设置为ikev1
,那么必须指定此设置。 - 如果
ipsec.keyexchange
设置为ikev2
,那么此设置是可选的。 - 如果将此设置保留为空,那么会将缺省 strongSwan 算法
aes128-sha1-modp2048,3des-sha1-modp1536
用于连接。
- 如果
- 将
local.id
的值更改为任何字符串,以便用来标识 VPN 隧道端点使用的本地 Red Hat OpenShift 集群端。 缺省值为ibm-cloud
。 某些 VPN 实现需要使用本地端点的公共 IP 地址。 - 将
remote.id
的值更改为要用于标识 VPN 隧道端点使用的远程内部部署端的任何字符串。 缺省值为on-prem
。 某些 VPN 实现需要使用远程端点的公共 IP 地址。 - 将
preshared.secret
的值更改为内部部署 VPN 隧道端点网关用于连接的预共享私钥。 此值存储在ipsec.secrets
中。 - 可选:将
remote.privateIPtoPing
设置为远程子网中作为 Helm 连接验证测试的一部分对其执行 ping 操作的任何专用 IP 地址。
步骤 3:选择入站或出站 VPN 连接
配置 strongSwan VPN 连接时,请选择 VPN 连接是入站到集群还是从集群出站。
- 入站
- 远程网络中的内部部署 VPN 端点启动 VPN 连接,集群侦听连接。
- 出站
- 集群启动 VPN 连接,远程网络中的内部部署 VPN 端点侦听连接。
要建立入站 VPN 连接,请修改以下设置。
- 验证
ipsec.auto
是否设置为add
。 - 可选:将
loadBalancerIP
设置为 strongSwan VPN 服务的可移植公共 IP 地址。 需要稳定的 IP 地址时(例如,必须指定允许哪些 IP 地址通过内部部署防火墙时),指定 IP 地址很有用。 该集群必须至少具有一个可用的公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址或 释放使用的 IP 地址。- 如果将此设置保留为空,那么将使用其中一个可用的可移植公共 IP 地址。
- 还必须配置为内部部署 VPN 端点上的集群 VPN 端点选择或分配给该端点的公共 IP 地址。
要建立出站 VPN 连接,请修改以下设置。
- 将
ipsec.auto
更改为start
。 - 将
remote.gateway
设置为远程网络中内部部署 VPN 端点的公共 IP 地址。 - 对于集群 VPN 端点的 IP 地址,选择下列其中一个选项:
-
群集专用网关的公共 IP 地址:如果您的工作节点只连接到专用 VLAN,那么出站 VPN 请求将通过专用网关路由到达互联网。 专用网关的公共 IP 地址用于 VPN 连接。
-
运行 strongSwan pod 的工作程序节点的公共 IP 地址:如果运行 strongSwan pod 的工作程序节点连接到公用 VLAN,那么该工作程序节点的公共 IP 地址将用于 VPN 连接。
- 如果删除了 strongSwan pod 并将其重新安排到集群中的其他工作程序节点上,那么 VPN 的公共 IP 地址会更改。 远程网络的内部部署 VPN 端点必须允许从任何集群工作程序节点的公共 IP 地址建立 VPN 连接。
- 如果远程 VPN 端点无法处理来自多个公共 IP 地址的 VPN 连接,请限制 strongSwan VPN pod 部署到的节点。 将
nodeSelector
设置为特定工作程序节点的 IP 地址或工作程序节点标签。 例如,值kubernetes.io/hostname: 10.232.xx.xx
允许将 VPN pod 仅部署到该工作程序节点。 值strongswan: vpn
将 VPN pod 限制为在具有该标签的任何工作程序节点上运行。 可以使用任何工作程序节点标签。 要让不同的工作节点与不同的 helm 图表部署配合使用,请使用strongswan: <release_name>
。 为实现高可用性,请至少选择两个工作程序节点。
-
strongSwan 服务的公共 IP 地址:要使用 strongSwan VPN 服务的 IP 地址来建立连接,请将
connectUsingLoadBalancerIP
设置为true
。 strongSwan 服务 IP 地址是可以在loadBalancerIP
设置中指定的可移植公共 IP 地址,也可以是自动分配给服务的可用可移植公共 IP 地址。- 如果选择使用
loadBalancerIP
设置来选择 IP 地址,那么集群必须至少具有一个可用的公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址或释放使用的 IP 地址。 - 所有群集工作节点必须位于同一个公共 VLAN 上。 否则,必须使用
nodeSelector
设置来确保 VPN pod 部署到loadBalancerIP
所在的公用 VLAN 上的工作程序节点。 - 如果
connectUsingLoadBalancerIP
设置为true
,并且ipsec.keyexchange
设置为ikev1
,那么必须将enableServiceSourceIP
设置为true
。
- 如果选择使用
-
步骤 4:通过 VPN 连接访问集群资源
确定哪些集群资源必须可由远程网络通过 VPN 连接进行访问。
-
将一个或多个集群子网的 CIDR 添加到
local.subnet
设置。 必须在内部部署 VPN 端点上配置本地子网 CIDR。 该列表可包括以下子网。- Kubernetes pod 子网 CIDR:
172.30.0.0/16
。 将启用所有集群 pod 与remote.subnet
设置中列出的远程网络子网中的任何主机之间的双向通信。 如果出于安全原因必须防止任何remote.subnet
主机访问群集 pod,请不要将 Kubernetes pod 子网添加到local.subnet
设置中。 - Kubernetes 服务子网 CIDR:
172.21.0.0/16
。 服务 IP 地址提供了一种方法,用于公开在单个 IP 后面的多个工作程序节点上部署的多个应用程序 pod。 - 如果应用程序由专用网络上的 NodePort 服务或专用 Ingress ALB 公开,请添加工作程序节点的专用子网 CIDR。 运行
ibmcloud oc worker <cluster_name>
,读取工作站私有 IP 地址的前三个八位位组。 例如,如果检索到的是10.176.48.xx
,请记下10.176.48
。 接下来,运行以下命令获取工人专用子网 CIDR,将<xxx.yyy.zz>
替换为之前获取的八位位组:ibmcloud sl subnet list | grep <xxx.yyy.zzz>
。 注:如果在新的专用子网上添加了工作程序节点,那么必须将新的专用子网 CIDR 添加到local.subnet
设置和内部部署 VPN 端点。 然后,必须重新启动 VPN 连接。 - 如果应用程序由专用网络上的 LoadBalancer 服务公开,请添加集群的由用户管理的专用子网 CIDR。 要查找这些值,请运行
ibmcloud oc cluster get --cluster <cluster_name> --show-resources
。 在 VLANs 部分中,查找 Public 值为false
的 CIDR。 注:如果ipsec.keyexchange
设置为ikev1
,那么只能指定一个子网。 但是,可以使用localSubnetNAT
设置将多个集群子网组合成单个子网。
- Kubernetes pod 子网 CIDR:
-
可选:使用
localSubnetNAT
设置重新映射集群子网。 子网的网络地址转换 (NAT) 提供了针对集群网络与内部部署远程网络之间子网冲突的变通方法。 可以使用 NAT 将集群的专用本地 IP 子网、pod 子网 (172.30.0.0/16) 或 pod 服务子网 (172.21.0.0/16) 重新映射到其他专用子网。 VPN 隧道看到的是重新映射的 IP 子网,而不是原始子网。 在通过 VPN 隧道发送包之前以及来自 VPN 隧道的包到达之后,会发生重新映射。 可以通过 VPN 来同时公开重新映射和未重新映射的子网。 要启用 NAT,可以添加整个子网,也可以添加单个 IP 地址。- 如果以
10.171.42.0/24=10.10.10.0/24
的格式添加整个子网,则 1-to-1: 内部网络子网中的所有 IP 地址都会映射到外部网络子网,反之亦然。 - 如果是添加单个 IP 地址(格式为
10.171.42.17/32=10.10.10.2/32,10.171.42.29/32=10.10.10.3/32
),那么只有这些内部 IP 地址会映射到指定的外部 IP 地址。
- 如果以
-
2.2.0 及更高版本可选 strongSwan Helm 图表:通过将
enableSingleSourceIP
设置为true
,将所有群集 IP 地址隐藏在单个 IP 地址后面。 此选项为 VPN 连接提供了其中一种最安全的配置,因为不允许远程网络向后连接到集群。- 此设置要求不管 VPN 连接是从集群还是从远程网络建立的,通过 VPN 连接传递的所有数据流都必须为出站。
- 如果将 strongSwan 安装到单专区集群中,那么必须将
local.subnet
设置为唯一 IP 地址作为 /32 子网。 如果将 strongSwan 安装在多专区集群中,那么可以将local.subnet
设置为%zoneSubnet
变量,并使用local.zoneSubnet
为集群的每个专区指定一个 IP 地址作为 /32 子网。
-
对于 V2.2.0 和更高版本的 strongSwan Helm chart 为可选:通过使用
localNonClusterSubnet
设置,允许 strongSwan 服务将来自远程网络的入局请求路由到存在于集群外部的服务。- 非集群服务必须存在于同一专用网络上,或存在于工作程序节点可访问的专用网络上。
- 非集群工作节点不能通过 VPN 连接向远程网络发起流量,但非集群节点可以成为远程网络传入请求的目标。
- 必须在
local.subnet
设置中列出非集群子网的 CIDR。
步骤 5:通过 VPN 连接访问远程网络资源
确定哪些远程网络资源必须可由集群通过 VPN 连接进行访问。
- 将一个或多个内部部署专用子网的 CIDR 添加到
remote.subnet
设置。 注:如果ipsec.keyexchange
设置为ikev1
,那么只能指定一个子网。 - 对于 V2.2.0 和更高版本的 strongSwan Helm chart 为可选:使用
remoteSubnetNAT
设置重新映射远程网络子网。 子网的网络地址转换 (NAT) 提供了针对集群网络与内部部署远程网络之间子网冲突的变通方法。 可以使用 NAT 将远程网络的 IP 子网重新映射到其他专用子网。 在通过 VPN 隧道发送包之前,会发生重新映射。 集群中的 pod 看到的是重新映射的 IP 子网,而不是原始子网。 在 pod 通过 VPN 隧道发送数据之前,重新映射的 IP 子网将切换回远程网络正在使用的实际子网。 可以通过 VPN 来同时公开重新映射和未重新映射的子网。
步骤 6(可选):通过 Slack Webhook 集成启用监视
要监视 strongSwan VPN 的状态,您可以设置 Webhook 以自动向 Slack 通道发布 VPN 连接消息。
-
登录到 Slack 工作空间。
-
单击请求安装。 如果此应用程序未列在 Slack 设置中,请联系 Slack 工作空间所有者。
-
安装请求得到核准后,请单击添加配置。
-
选择 Slack 通道或创建新通道来接收 VPN 消息。
-
复制生成的 Webhook URL。 URL 格式类似于以下内容:
https://hooks.slack.com/services/A1AA11A1A/AAA1AAA1A/a1aaaaAAAaAaAAAaaaaaAaAA
-
要验证是否已安装 Slack Webhook,请通过运行以下命令向 Webhook URL 发送测试消息:
curl -X POST -H 'Content-type: application/json' -d '{"text":"VPN test message"}' <webhook_URL>
-
转至选择的 Slack 通道来验证测试消息是否成功。
-
在 Helm chart 的
config.yaml
文件中,配置 Webhook 以监视 VPN 连接。- 将
monitoring.enable
更改为true
。 - 将专用 IP 地址或要确保可通过 VPN 连接访问的远程子网中的 HTTP 端点添加到
monitoring.privateIPs
或monitoring.httpEndpoints
。 例如,可以将remote.privateIPtoPing
设置中的 IP 添加到monitoring.privateIPs
。 - 将 Webhook URL 添加到
monitoring.slackWebhook
。 - 根据需要更改其他可选
monitoring
设置。
- 将
步骤 7:部署 Helm chart
使用您先前选择的配置在集群中部署 strongSwan Helm chart。
-
如果需要配置更高级的设置,请遵循为 Helm chart 中的每个设置提供的文档。
-
保存更新的
config.yaml
文件。 -
使用更新的
config.yaml
文件将 Helm chart 安装到集群。如果在单个集群中有多个 VPN 部署,那么可以通过选择比
vpn
描述性更强的发行版名称,以避免命名冲突并区分部署。 为了避免截断发行版名称,请将发行版名称限制为不超过 35 个字符。helm install vpn iks-charts/strongswan -f config.yaml
-
检查 chart 部署状态。 当图表准备就绪时,输出附近的 STATUS 字段的值为
DEPLOYED
。helm status vpn
-
部署图表后,验证是否使用了
config.yaml
文件中更新的设置。helm get values vpn
仅支持过去 6 个月发布的 strongSwan Helm Chart 版本。 确保持续 升级 strongSwan Helm chart 以获取最新功能和安全修订。
测试并验证 strongSwan VPN 连接
部署 Helm chart 后,请测试 VPN 连接。
-
如果内部部署网关上的 VPN 处于不活动状态,请启动 VPN。
-
设置
STRONGSWAN_POD
环境变量。export STRONGSWAN_POD=$(oc get pod -l app=strongswan,release=vpn -o jsonpath='{ .items[0].metadata.name }')
-
检查 VPN 的状态。 状态
ESTABLISHED
表示 VPN 连接成功。oc exec $STRONGSWAN_POD -- sudo ipsec status
示例输出
Security Associations (1 up, 0 connecting): k8s-conn[1]: ESTABLISHED 17 minutes ago, 172.30.xxx.xxx[ibm-cloud]...192.xxx.xxx.xxx[on-premises] k8s-conn{2}: INSTALLED, TUNNEL, reqid 12, ESP in UDP SPIs: c78cb6b1_i c5d0d1c3_o k8s-conn{2}: 172.21.0.0/16 172.30.0.0/16 === 10.91.152.xxx/26
-
尝试使用 strongSwan Helm chart 建立 VPN 连接时,很有可能 VPN 阶段状态一开始不是
ESTABLISHED
。 在连接成功之前,您可能需要多次检查内部 VPN 端点设置并更改配置文件。- run
helm uninstall <release_name> -n <namespace>
- 修正配置文件中的错误值。
- run
helm install vpn iks-charts/strongswan -f config.yaml
您还可以在下一步中进行更多检查。
- run
-
如果 VPN pod 处于
ERROR
状态或继续崩溃并重新启动,那么可能是因为在图表的配置映射中对ipsec.conf
设置的参数验证问题。- 通过运行
oc logs $STRONGSWAN_POD
来检查 strongSwan pod 日志中是否存在任何验证错误。 - 如果存在验证错误,运行
helm uninstall <release_name> -n <namespace>
- 修正配置文件中的错误值。
- run
helm install vpn iks-charts/strongswan -f config.yaml
- 通过运行
-
-
您可以运行 strongSwan 图表定义中的五个 Helm 测试,进一步测试 VPN 的连接性。
helm test vpn
- 如果所有测试都通过,则 strongSwan VPN 连接已成功建立。
- 如果任何测试失败,请继续执行下一步。
-
通过查看测试 pod 的日志来查看失败测试的输出。
oc logs <test_program>
有些测试要求是 VPN 配置中的可选设置。 如果某些测试失败,失败结果可能是可以接受的,这取决于您是否指定了这些可选设置。 有关每个测试的信息以及测试可能失败的原因,请参阅下表。
vpn-strongswan-check-config
- 验证从
config.yaml
文件生成的ipsec.conf
文件的语法。 由于config.yaml
文件中的值不正确,该测试可能会失败。 vpn-strongswan-check-state
- 检查 VPN 连接的状态是否为
ESTABLISHED
。 由于以下原因,该测试可能会失败。config.yaml
文件中的值与内部 VPN 端点设置之间的差异。- 如果群集处于“监听”模式(
ipsec.auto
设置为add
),则不会在本地端建立连接。
vpn-strongswan-ping-remote-gw
- Ping 在
config.yaml
文件中配置的remote.gateway
公共 IP 地址。 如果 VPN 连接处于ESTABLISHED
状态,则可以忽略此测试结果。 如果 VPN 连接没有ESTABLISHED
状态,则此测试可能会失败,原因如下。- 未指定内部部署 VPN 网关 IP 地址。 如果
ipsec.auto
设置为start
,则需要remote.gateway
IP 地址。 - 防火墙阻塞了 ICMP (ping) 包。
- 未指定内部部署 VPN 网关 IP 地址。 如果
vpn-strongswan-ping-remote-ip-1
- 从群集中的 VPN pod Ping 企业内部 VPN 网关的
remote.privateIPtoPing
专用 IP 地址。 此测试可能由于以下原因而失败。 \n -您未指定remote.privateIPtoPing
IP 地址。 如果您有意未指定 IP 地址,那么可接受此故障。 \n -您未在local.subnet
列表中指定集群 pod 子网 CIDR172.30.0.0/16
。 vpn-strongswan-ping-remote-ip-2
- 从群集中的工作节点 Ping 企业内部 VPN 网关的
remote.privateIPtoPing
专用 IP 地址。 此测试可能由于以下原因而失败。 \n -您未指定remote.privateIPtoPing
IP 地址。 如果您有意未指定 IP 地址,那么可接受此故障。 \n -您未在local.subnet
列表中指定集群工作程序节点专用子网 CIDR。|
-
删除当前 Helm chart。
helm uninstall vpn -n <namespace>
-
打开
config.yaml
文件并修正不正确的值。 -
保存更新的
config.yaml
文件。 -
使用更新的
config.yaml
文件将 Helm chart 安装到集群。 更新的属性会存储在 chart 的配置映射中。helm install vpn iks-charts/strongswan -f config.yaml
-
检查 chart 部署状态。 图表就绪后,输出中的 STATUS 字段值为
DEPLOYED
。
helm status vpn
- 部署图表后,验证是否使用了
config.yaml
文件中更新的设置。
helm get values vpn
- 清除当前测试 pod。
oc get pods -a -l app=strongswan-test
oc delete pods -l app=strongswan-test
- 重新运行测试。
helm test vpn
通过名称空间或工作程序节点限制 strongSwan VPN 流量
如果您有单租户集群,或者如果有多租户集群,其中的集群资源在租户之间共享,那么可以将每个 strongSwan 部署的 VPN 流量限制为特定名称空间中的 pod。 如果多租户集群中的集群资源专用于租户,那么可以将每个 strongSwan 部署的 VPN 流量限制为每个租户专用的工作程序节点。
通过名称空间限制 strongSwan VPN 流量
您有单租户或多租户集群时,可以将 VPN 流量限制为仅特定名称空间中的 pod。
例如,假设您希望仅特定名称空间 my-secure-namespace
中的 pod 可通过 VPN 发送和接收数据。 您不希望其他命名空间(如 kube-system
、ibm-system
或 default
)中的 pod 访问您的内部网络。 要将 VPN 流量限制为仅 my-secure-namespace
,可以创建 Calico 全局网络策略。
使用此解决方案之前,请查看以下注意事项和限制。
-
您无需将 strongSwan Helm 图表部署到指定的命名空间。 strongSwan VPN pod 和路径守护程序集可以部署到
kube-system
或其他任何名称空间中。 如果 strongSwan VPN 未部署到指定的名称空间中,那么vpn-strongswan-ping-remote-ip-1
Helm 测试会失败。 这是预期故障,可以接受。 测试会通过不位于对远程子网具有直接访问权的名称空间中的 pod,对内部部署 VPN 网关的remote.privateIPtoPing
专用 IP 地址执行 ping 操作。 但是,VPN pod 仍能够将流量转发到具有到远程子网的路径的名称空间中的 pod,并且流量仍可正常流动。 VPN 状态仍为ESTABLISHED
,并且指定名称空间中的 pod 可以通过 VPN 进行连接。 -
以下步骤中的 Calico 全局网络策略不会阻止使用主机网络的 Kubernetes pod 通过 VPN 发送和接收数据。 pod 配置为使用主机联网,在该 pod 中运行的应用程序可以侦听其所在的工作程序节点的网络接口。 这些主机联网 pod 可以在任何名称空间中存在。 要确定哪些 pod 具有主机联网功能,请运行
oc get pods --all-namespaces -o wide
并查找任何没有172.30.0.0/16
pod IP 地址的 pod。 如果要阻止主机联网 pod 通过 VPN 发送和接收数据,那么可以在values.yaml
部署文件中设置以下选项:local.subnet: 172.30.0.0/16
和enablePodSNAT: false
。 这些配置设置可让所有 Kubernetes pod 通过 VPN 连接访问远程网络。 但是,只有位于指定安全名称空间中的 pod 可通过 VPN 进行访问。
准备工作
将 VPN 流量限制在特定命名空间内、
-
创建名为
allow-non-vpn-outbound.yaml
的 Calico 全局网络策略。 此策略允许所有名称空间继续将出站流量发送到所有目标,但 strongSwan VPN 访问的远程子网除外。 将<remote.subnet>
替换为在 Helmvalues.yaml
配置文件中指定的remote.subnet
。 要指定多个远程子网,请参阅 Calico 文档。apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: allow-non-vpn-outbound spec: selector: has(projectcalico.org/namespace) egress: - action: Allow destination: notNets: - <remote.subnet> order: 900 types: - Egress
-
应用该策略。
calicoctl apply -f allow-non-vpn-outbound.yaml --config=filepath/calicoctl.cfg
-
创建另一个名为
allow-vpn-from-namespace.yaml
的 Calico 全局网络策略。 此策略仅允许指定名称空间将出站流量发送到 strongSwan VPN访问的远程子网。 将<namespace>
替换为可访问 VPN 的命名空间,将<remote.subnet>
替换为在 Helmvalues.yaml
配置文件中指定的remote.subnet
。 要指定多个命名空间或远程子网,请参阅 Calico 文档。apiVersion: projectcalico.org/v3 kind: GlobalNetworkPolicy metadata: name: allow-vpn-from-namespace spec: selector: projectcalico.org/namespace == "<namespace>" egress: - action: Allow destination: nets: - <remote.subnet> order: 900 types: - Egress
-
应用该策略。
calicoctl apply -f allow-vpn-from-namespace.yaml --config=filepath/calicoctl.cfg
-
验证是否在集群中创建了全局网络策略。
calicoctl get GlobalNetworkPolicy -o wide --config=filepath/calicoctl.cfg
通过工作程序节点限制 strongSwan VPN 流量
在多租户集群中具有多个 strongSwan VPN 部署时,可以将每个部署的 VPN 流量限制为专用于每个租户的特定工作程序节点。
部署 strongSwan Helm chart 时,会创建 strongSwan VPN 部署。 strongSwan VPN pod 会部署到任何无污点工作程序节点。 此外,还会创建 Kubernetes 守护程序集。 此守护程序集会将集群中所有无污点工作程序节点上的路径自动配置为连接到每个远程子网。 在内部部署网络中,strongSwan VPN pod 使用工作程序节点上的路径将请求转发到远程子网。
除非在 tolerations
文件的 value.yaml
设置中指定了污点,否则不会在有污点的节点上配置路径。 通过污染工作程序节点,可以防止在这些工作程序上配置任何 VPN 路径。 然后,可以仅针对确实希望在有污点工作程序上允许的 VPN 部署,在 tolerations
设置中指定污点。 这样,用于一个租户的 Helm chart 部署的 strongSwan VPN 将仅使用该租户的工作程序节点上的路径来通过
VPN 连接将流量转发到远程子网。
使用此解决方案之前,请查看以下注意事项和限制。
- 缺省情况下,Kubernetes 会将应用程序 pod 置于可用的任何无污点工作程序节点上。 要确保此解决方案正常工作,每个租户必须首先确保仅将其应用程序 pod 部署到正确租户的有污点工作程序。 此外,每个有污点工作程序节点还必须具有容忍度,以允许将应用程序 pod 放置在该节点上。 有关污点和容忍度的更多信息,请参阅 Kubernetes 文档。
- 由于任一租户均无法将应用程序 pod 置于共享的无污点节点上,因此集群资源可能未以最佳方式进行利用。
以下用于通过工作程序节点限制 strongSwan VPN 流量的步骤使用此示例方案:假设您有一个多租户 Red Hat OpenShift on IBM Cloud 集群,该集群有六个工作程序节点。 集群支持租户 A 和租户 B。 您可以通过以下方式感染工作程序节点。
- 污染了两个工作程序节点,以便仅将租户 A pod 安排在这两个工作程序上。
- 污染了两个工作程序节点,以便仅将租户 B pod 安排在这两个工作程序上。
- 有两个工作程序节点未污染,因为至少需要 2 个工作程序节点来运行 strongSwan VPN pod 和负载均衡器 IP。
限制 VPN 流量到每个租户的污点节点。
-
在此示例中,要限制 VPN 流量只能用于租户 A 的工人,可在租户 A 的
values.yaml
文件中指定以下toleration
strongSwan Helm 图表。tolerations: - key: dedicated operator: "Equal" value: "tenantA" effect: "NoSchedule"
这种容忍度允许路由守护进程集在两个有
dedicated="tenantA"
污点的工作节点和两个未受污染的工作节点上运行。 此部署的 strongSwan VPN 会在两个无污点工作程序节点上运行。 -
在此示例中,要限制 VPN 流量仅用于租户 B 的工人,可在
values.yaml
文件中为租户 B 指定以下toleration
strongSwan Helm 图表。tolerations: - key: dedicated operator: "Equal" value: "tenantB" effect: "NoSchedule"
这种容忍度允许路由守护进程集在两个有
dedicated="tenantB"
污点的工作节点和两个未受污染的工作节点上运行。 此部署的 strongSwan VPN 同样会在两个无污点工作程序节点上运行。
升级或禁用 strongSwan Helm chart
确保持续升级 strongSwan Helm Chart 以获取最新功能和安全修订。
查看 strongSwan Helm Chart 的受支持版本。 通常,图表版本会在其发布日期之后 6 个月变为不推荐使用。
- 支持的: 2.7.9,2.7.8,2.7.7,2.7.6,2.7.5,2.7.4,2.7.3,2.7.2
- 不推荐使用: 2.7.1,2.7.0,2.6.9,2.6.8,2.6.7
- 不受支持: 2.6.6 和更低版本
对于每个 strongSwan Helm Chart 版本的发布日期和更改日志,请运行 helm show readme iks-charts/strongswan
并查找 Version History
部分。
要将 strongSwan Helm Chart 升级到最新版本,请使用 helm upgrade
命令。
helm upgrade -f config.yaml <release_name> iks-charts/strongswan
可以通过删除 Helm chart 来禁用 VPN 连接。
helm uninstall <release_name> -n <namespace>
使用 Virtual Router Appliance
Virtual Router Appliance (VRA) 为 x86 裸机服务器提供最新的 Vyatta 5600 操作系统。 可以使用 VRA 作为 VPN 网关来安全地连接到内部部署网络。
所有进出集群 VLAN 的公用和专用网络流量都将通过 VRA 进行路由。 可以使用 VRA 作为 VPN 端点,以在 IBM Cloud 基础架构中的服务器和内部部署资源之间创建加密的 IPSec 隧道。 例如,下图显示了 Red Hat OpenShift on IBM Cloud 中工作节点上的应用程序如何通过专用 VLAN 上的 VRA VPN 连接与内部服务器通信:
-
集群中的应用程序
myapp2
接收来自 Ingress 或 LoadBalancer 服务的请求,并且需要安全地连接到内部部署网络中的数据。 -
因为
myapp2
位于仅在专用 VLAN 上的工作程序节点上,所以 VRA 充当工作程序节点与内部部署网络之间的安全连接。 VRA 使用目标 IP 地址来确定将哪些网络包发送到内部部署网络。 -
该请求已加密,并通过 VPN 隧道发送到内部部署数据中心。
-
入局请求通过内部部署防火墙传递,并传递到将在其中进行解密的 VPN 隧道端点(路由器)。
-
VPN 隧道端点 (路由器) 根据步骤 2 中指定的目标 IP 地址,将请求转发到本地服务器或大型机。 通过同一进程通过 VPN 连接将必需的数据发送回
myapp2
。
要设置 Virtual Router Appliance、
-
要使用 VRA 来启用 VPN 连接,请在 VRA 上配置 VRRP。
如果您有现有路由器设备,然后添加了集群,那么不会在该路由器设备上配置为集群订购的新可移植子网。 要使用网络服务,您必须通过 启用 VLAN 生成或 VRF 来启用同一 VLAN 上的子网之间的路由。