IBM Cloud Docs
设置传统 VPN 连接

设置传统 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/16172.18.0.0/16172.19.0.0/16172.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 连接与内部服务器通信。

通过 strongSwan VPN 服务在集群与内部部署数据中心之间的流量流。
通过 strongSwan VPN 服务的流量

  1. 集群中的应用程序 myapp 接收来自 Ingress 或 LoadBalancer 服务的请求,并且需要安全地连接到内部部署网络中的数据。

  2. 对内部部署数据中心的请求将转发到 IPSec strongSwan VPN pod。 目标 IP 地址用于确定将哪些网络包发送到 IPSec strongSwan VPN pod。

  3. 该请求已加密,并通过 VPN 隧道发送到内部部署数据中心。

  4. 入局请求通过内部部署防火墙传递,并传递到将在其中进行解密的 VPN 隧道端点(路由器)。

  5. 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 文件中具有 rightidipsec.conf 等设置。 如果您有这些设置,请检查是否必须将 leftid 设置为 VPN IPSec 隧道的 IP 地址。
  • 如果连接是从远程网络到集群的入站连接,请检查远程 VPN 端点是否可以在一个专区中的负载均衡器发生故障时,与其他 IP 地址重新建立 VPN 连接。

要开始在多专区集群中使用 strongSwan,请选择下列其中一个选项。

  • 如果可以使用出站 VPN 连接,那么可以选择仅配置一个 strongSwan VPN 部署。 请参阅从多专区集群配置一个出站 VPN 连接
  • 如果需要入站 VPN 连接,那么根据远程 VPN 端点是否可以配置为在检测到中断时与其他公共负载均衡器 IP 重新建立 VPN 连接,您可以使用的配置设置有所不同。

请尝试将环境设置为针对多专区集群的出站或入站 VPN 连接仅需要一个 strongSwan VPN 部署。 如果必须在每个专区中设置单独的 strongSwan VPN,请确保计划如何管理这一增加的复杂性和提高的资源使用量。

从多专区集群配置一个出站 VPN 连接

要在多专区集群中配置 strongSwan VPN 服务,最简单的解决方案是使用可在集群中所有可用性专区的不同工作程序节点之间切换的单个出站 VPN 连接。

VPN 连接是来自多专区集群的出站连接时,只需要一个 strongSwan 部署。 如果某个工作程序节点已被除去或发生中断,kubelet 会将 VPN pod 重新安排到新的工作程序节点上。 如果某个可用性专区发生中断,kubelet 会将 VPN pod 重新安排到其他专区中的新工作程序节点上。

  1. 配置一个 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 子网。
  2. 在远程网络防火墙中,允许来自 zoneLoadBalancer 设置中列出的公共 IP 地址的入局 IPSec VPN 连接。

  3. 配置远程 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。

  1. 配置一个 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 地址。
  2. 在远程网络防火墙中,允许连至 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 连接。

  1. 针对每个专区配置 strongSwan VPN Helm chart。 执行该部分中的步骤时,请确保指定以下设置:

    • loadBalancerIP:指定在其中部署此 strongSwan 服务的专区中的可用公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址释放使用的 IP 地址
    • zoneSelector:指定要在其中安排 VPN pod 的专区。
    • 可能需要其他设置,例如 zoneSpecificRoutesremoteSubnetNATlocalSubnetNATenableSingleSourceIP,具体取决于哪些资源必须可通过 VPN 进行访问。 请参阅下一步以了解更多详细信息。
  2. 在 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 必须访问远程本地网络上的服务,而远程本地网络中的应用程序必须访问集群中的服务,请配置第二个项目符号点中列出的 localSubnetNATremoteSubnetNAT 设置。 请注意,如果集群中的 pod 向远程内部部署网络发起请求,那么必须向 pod 添加逻辑,以便其可以选择要用于访问远程内部部署网络上的服务的 VPN 连接。
  3. 配置远程 VPN 端点软件,以与每个专区中的负载均衡器 IP 建立单独的 VPN 连接。

配置 strongSwan Helm chart

安装 strongSwan Helm chart 之前,您必须决定 strongSwan 配置。

准备工作

步骤 1:获取 strongSwan Helm chart

安装 Helm 并获取 strongSwan Helm chart 以查看可能的配置。

  1. 遵循指示信息 在本地机器上安装 V 3 Helm 客户机。

  2. 在本地 YAML 文件中保存 strongSwan Helm chart 的缺省配置设置。

    helm show values iks-charts/strongswan > config.yaml
    
  3. 打开 config.yaml 文件。

步骤 2:配置基本 IPSec 设置

要控制 VPN 连接的建立,请修改以下基本 IPSec 设置。

有关每个设置的更多信息,请阅读 Helm chart 的 config.yaml 文件中提供的文档。

  1. 如果内部部署 VPN 隧道端点不支持 ikev2 作为初始化连接的协议,请将 ipsec.keyexchange 的值更改为 ikev1
  2. ipsec.esp 设置为内部部署 VPN 隧道端点用于连接的 ESP 加密和认证算法的列表。
    • 如果 ipsec.keyexchange 设置为 ikev1,那么必须指定此设置。
    • 如果 ipsec.keyexchange 设置为 ikev2,那么此设置是可选的。
    • 如果将此设置保留为空,那么会将缺省 strongSwan 算法 aes128-sha1,3des-sha1 用于连接。
  3. ipsec.ike 设置为内部部署 VPN 隧道端点用于连接的 IKE/ISAKMP SA 加密和认证算法的列表。 算法必须明确采用格式 encryption-integrity[-prf]-dhgroup
    • 如果 ipsec.keyexchange 设置为 ikev1,那么必须指定此设置。
    • 如果 ipsec.keyexchange 设置为 ikev2,那么此设置是可选的。
    • 如果将此设置保留为空,那么会将缺省 strongSwan 算法 aes128-sha1-modp2048,3des-sha1-modp1536 用于连接。
  4. local.id 的值更改为任何字符串,以便用来标识 VPN 隧道端点使用的本地 Red Hat OpenShift 集群端。 缺省值为 ibm-cloud。 某些 VPN 实现需要使用本地端点的公共 IP 地址。
  5. remote.id 的值更改为要用于标识 VPN 隧道端点使用的远程内部部署端的任何字符串。 缺省值为 on-prem。 某些 VPN 实现需要使用远程端点的公共 IP 地址。
  6. preshared.secret 的值更改为内部部署 VPN 隧道端点网关用于连接的预共享私钥。 此值存储在 ipsec.secrets 中。
  7. 可选:将 remote.privateIPtoPing 设置为远程子网中作为 Helm 连接验证测试的一部分对其执行 ping 操作的任何专用 IP 地址。

步骤 3:选择入站或出站 VPN 连接

配置 strongSwan VPN 连接时,请选择 VPN 连接是入站到集群还是从集群出站。

入站
远程网络中的内部部署 VPN 端点启动 VPN 连接,集群侦听连接。
出站
集群启动 VPN 连接,远程网络中的内部部署 VPN 端点侦听连接。

要建立入站 VPN 连接,请修改以下设置。

  1. 验证 ipsec.auto 是否设置为 add
  2. 可选:将 loadBalancerIP 设置为 strongSwan VPN 服务的可移植公共 IP 地址。 需要稳定的 IP 地址时(例如,必须指定允许哪些 IP 地址通过内部部署防火墙时),指定 IP 地址很有用。 该集群必须至少具有一个可用的公共负载均衡器 IP 地址。 可以检查以确定可用的公共 IP 地址释放使用的 IP 地址
    • 如果将此设置保留为空,那么将使用其中一个可用的可移植公共 IP 地址。
    • 还必须配置为内部部署 VPN 端点上的集群 VPN 端点选择或分配给该端点的公共 IP 地址。

要建立出站 VPN 连接,请修改以下设置。

  1. ipsec.auto 更改为 start
  2. remote.gateway 设置为远程网络中内部部署 VPN 端点的公共 IP 地址。
  3. 对于集群 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 连接进行访问。

  1. 将一个或多个集群子网的 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 设置将多个集群子网组合成单个子网。
  2. 可选:使用 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 地址。
  3. 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 子网。
  4. 对于 V2.2.0 和更高版本的 strongSwan Helm chart 为可选:通过使用 localNonClusterSubnet 设置,允许 strongSwan 服务将来自远程网络的入局请求路由到存在于集群外部的服务。

    • 非集群服务必须存在于同一专用网络上,或存在于工作程序节点可访问的专用网络上。
    • 非集群工作节点不能通过 VPN 连接向远程网络发起流量,但非集群节点可以成为远程网络传入请求的目标。
    • 必须在 local.subnet 设置中列出非集群子网的 CIDR。

步骤 5:通过 VPN 连接访问远程网络资源

确定哪些远程网络资源必须可由集群通过 VPN 连接进行访问。

  1. 将一个或多个内部部署专用子网的 CIDR 添加到 remote.subnet 设置。 :如果 ipsec.keyexchange 设置为 ikev1,那么只能指定一个子网。
  2. 对于 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 连接消息。

  1. 登录到 Slack 工作空间。

  2. 转到 " Incoming WebHooks "应用程序页面

  3. 单击请求安装。 如果此应用程序未列在 Slack 设置中,请联系 Slack 工作空间所有者。

  4. 安装请求得到核准后,请单击添加配置

  5. 选择 Slack 通道或创建新通道来接收 VPN 消息。

  6. 复制生成的 Webhook URL。 URL 格式类似于以下内容:

    https://hooks.slack.com/services/A1AA11A1A/AAA1AAA1A/a1aaaaAAAaAaAAAaaaaaAaAA
    
  7. 要验证是否已安装 Slack Webhook,请通过运行以下命令向 Webhook URL 发送测试消息:

    curl -X POST -H 'Content-type: application/json' -d '{"text":"VPN test message"}' <webhook_URL>
    
  8. 转至选择的 Slack 通道来验证测试消息是否成功。

  9. 在 Helm chart 的 config.yaml 文件中,配置 Webhook 以监视 VPN 连接。

    1. monitoring.enable 更改为 true
    2. 将专用 IP 地址或要确保可通过 VPN 连接访问的远程子网中的 HTTP 端点添加到 monitoring.privateIPsmonitoring.httpEndpoints。 例如,可以将 remote.privateIPtoPing 设置中的 IP 添加到 monitoring.privateIPs
    3. 将 Webhook URL 添加到 monitoring.slackWebhook
    4. 根据需要更改其他可选 monitoring 设置。

步骤 7:部署 Helm chart

使用您先前选择的配置在集群中部署 strongSwan Helm chart。

  1. 如果需要配置更高级的设置,请遵循为 Helm chart 中的每个设置提供的文档。

  2. 保存更新的 config.yaml 文件。

  3. 使用更新的 config.yaml 文件将 Helm chart 安装到集群。

    如果在单个集群中有多个 VPN 部署,那么可以通过选择比 vpn 描述性更强的发行版名称,以避免命名冲突并区分部署。 为了避免截断发行版名称,请将发行版名称限制为不超过 35 个字符。

    helm install vpn iks-charts/strongswan -f config.yaml
    
  4. 检查 chart 部署状态。 当图表准备就绪时,输出附近的 STATUS 字段的值为 DEPLOYED

    helm status vpn
    
  5. 部署图表后,验证是否使用了 config.yaml 文件中更新的设置。

    helm get values vpn
    

仅支持过去 6 个月发布的 strongSwan Helm Chart 版本。 确保持续 升级 strongSwan Helm chart 以获取最新功能和安全修订。

测试并验证 strongSwan VPN 连接

部署 Helm chart 后,请测试 VPN 连接。

  1. 如果内部部署网关上的 VPN 处于不活动状态,请启动 VPN。

  2. 设置 STRONGSWAN_POD 环境变量。

    export STRONGSWAN_POD=$(oc get pod -l app=strongswan,release=vpn -o jsonpath='{ .items[0].metadata.name }')
    
  3. 检查 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 端点设置并更改配置文件。

      1. run helm uninstall <release_name> -n <namespace>
      2. 修正配置文件中的错误值。
      3. run helm install vpn iks-charts/strongswan -f config.yaml

      您还可以在下一步中进行更多检查。

    • 如果 VPN pod 处于 ERROR 状态或继续崩溃并重新启动,那么可能是因为在图表的配置映射中对 ipsec.conf 设置的参数验证问题。

      1. 通过运行 oc logs $STRONGSWAN_POD 来检查 strongSwan pod 日志中是否存在任何验证错误。
      2. 如果存在验证错误,运行 helm uninstall <release_name> -n <namespace>
      3. 修正配置文件中的错误值。
      4. run helm install vpn iks-charts/strongswan -f config.yaml
  4. 您可以运行 strongSwan 图表定义中的五个 Helm 测试,进一步测试 VPN 的连接性。

    helm test vpn
    
    • 如果所有测试都通过,则 strongSwan VPN 连接已成功建立。
    • 如果任何测试失败,请继续执行下一步。
  5. 通过查看测试 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-strongswan-ping-remote-ip-1
    从群集中的 VPN pod Ping 企业内部 VPN 网关的 remote.privateIPtoPing 专用 IP 地址。 此测试可能由于以下原因而失败。 \n -您未指定 remote.privateIPtoPing IP 地址。 如果您有意未指定 IP 地址,那么可接受此故障。 \n -您未在 local.subnet 列表中指定集群 pod 子网 CIDR 172.30.0.0/16
    vpn-strongswan-ping-remote-ip-2
    从群集中的工作节点 Ping 企业内部 VPN 网关的 remote.privateIPtoPing 专用 IP 地址。 此测试可能由于以下原因而失败。 \n -您未指定 remote.privateIPtoPing IP 地址。 如果您有意未指定 IP 地址,那么可接受此故障。 \n -您未在 local.subnet 列表中指定集群工作程序节点专用子网 CIDR。|
  6. 删除当前 Helm chart。

    helm uninstall vpn -n <namespace>
    
  7. 打开 config.yaml 文件并修正不正确的值。

  8. 保存更新的 config.yaml 文件。

  9. 使用更新的 config.yaml 文件将 Helm chart 安装到集群。 更新的属性会存储在 chart 的配置映射中。

    helm install vpn iks-charts/strongswan -f config.yaml
    
  10. 检查 chart 部署状态。 图表就绪后,输出中的 STATUS 字段值为 DEPLOYED

helm status vpn
  1. 部署图表后,验证是否使用了 config.yaml 文件中更新的设置。
helm get values vpn
  1. 清除当前测试 pod。
oc get pods -a -l app=strongswan-test
oc delete pods -l app=strongswan-test
  1. 重新运行测试。
helm test vpn

通过名称空间或工作程序节点限制 strongSwan VPN 流量

如果您有单租户集群,或者如果有多租户集群,其中的集群资源在租户之间共享,那么可以将每个 strongSwan 部署的 VPN 流量限制为特定名称空间中的 pod。 如果多租户集群中的集群资源专用于租户,那么可以将每个 strongSwan 部署的 VPN 流量限制为每个租户专用的工作程序节点

通过名称空间限制 strongSwan VPN 流量

您有单租户或多租户集群时,可以将 VPN 流量限制为仅特定名称空间中的 pod。

例如,假设您希望仅特定名称空间 my-secure-namespace 中的 pod 可通过 VPN 发送和接收数据。 您不希望其他命名空间(如 kube-systemibm-systemdefault )中的 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/16enablePodSNAT: false。 这些配置设置可让所有 Kubernetes pod 通过 VPN 连接访问远程网络。 但是,只有位于指定安全名称空间中的 pod 可通过 VPN 进行访问。

准备工作

将 VPN 流量限制在特定命名空间内、

  1. 创建名为 allow-non-vpn-outbound.yaml 的 Calico 全局网络策略。 此策略允许所有名称空间继续将出站流量发送到所有目标,但 strongSwan VPN 访问的远程子网除外。 将 <remote.subnet> 替换为在 Helm values.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
    
  2. 应用该策略。

    calicoctl apply -f allow-non-vpn-outbound.yaml --config=filepath/calicoctl.cfg
    
  3. 创建另一个名为 allow-vpn-from-namespace.yaml 的 Calico 全局网络策略。 此策略仅允许指定名称空间将出站流量发送到 strongSwan VPN访问的远程子网。 将 <namespace> 替换为可访问 VPN 的命名空间,将 <remote.subnet> 替换为在 Helm values.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
    
  4. 应用该策略。

    calicoctl apply -f allow-vpn-from-namespace.yaml --config=filepath/calicoctl.cfg
    
  5. 验证是否在集群中创建了全局网络策略。

    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 流量到每个租户的污点节点。

  1. 在此示例中,要限制 VPN 流量只能用于租户 A 的工人,可在租户 A 的 values.yaml 文件中指定以下 toleration strongSwan Helm 图表。

    tolerations:
        - key: dedicated
    operator: "Equal"
    value: "tenantA"
    effect: "NoSchedule"
    

    这种容忍度允许路由守护进程集在两个有 dedicated="tenantA" 污点的工作节点和两个未受污染的工作节点上运行。 此部署的 strongSwan VPN 会在两个无污点工作程序节点上运行。

  2. 在此示例中,要限制 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 连接与内部服务器通信:

使用负载均衡器在 Red Hat OpenShift on IBM Cloud 中公开应用程序。
使用负载平衡器在 Red Hat OpenShift on IBM Cloud 中公开应用程序

  1. 集群中的应用程序 myapp2 接收来自 Ingress 或 LoadBalancer 服务的请求,并且需要安全地连接到内部部署网络中的数据。

  2. 因为 myapp2 位于仅在专用 VLAN 上的工作程序节点上,所以 VRA 充当工作程序节点与内部部署网络之间的安全连接。 VRA 使用目标 IP 地址来确定将哪些网络包发送到内部部署网络。

  3. 该请求已加密,并通过 VPN 隧道发送到内部部署数据中心。

  4. 入局请求通过内部部署防火墙传递,并传递到将在其中进行解密的 VPN 隧道端点(路由器)。

  5. VPN 隧道端点 (路由器) 根据步骤 2 中指定的目标 IP 地址,将请求转发到本地服务器或大型机。 通过同一进程通过 VPN 连接将必需的数据发送回 myapp2

要设置 Virtual Router Appliance、

  1. 订购 VRA

  2. 在 VRA 上配置专用 VLAN

  3. 要使用 VRA 来启用 VPN 连接,请在 VRA 上配置 VRRP

如果您有现有路由器设备,然后添加了集群,那么不会在该路由器设备上配置为集群订购的新可移植子网。 要使用网络服务,您必须通过 启用 VLAN 生成或 VRF 来启用同一 VLAN 上的子网之间的路由。