我正在尝试使用 strongswan 网关在一个 VM(子网:20.25.0.0/16)和一个 AKS 集群(子网:10.0.0.0/16 - Azure CNI)之间建立一个 IKEv2 VPN。我需要访问这个 AKS 集群后面的一些 kubernetes 服务。使用 Azure CNI,将为每个 pod 分配一个来自在创建集群时指定的 POD 子网的 IP 地址,该子网附加在每个节点的接口 eth0 中。clusterIP 类型的 kubernetes 服务已经从集群创建时指定的服务 CIDR 范围获取 IP,但该 IP 仅在集群中可用,不附加在节点的任何接口中,如 POD 子网。
要在 K8S 上运行 strongswan,除了启用 NET_ADMIN 功能外,还需要挂载内核模块(/lib/modules)。因此 VPN 隧道是使用主机(节点)接口上连接的任何网络建立的,因此我无法使用在集群创建时指定的服务 CIDR 范围建立 VPN,因为此 IP 仅在集群内通过个性化路由知道并且不附加在任何主机接口上。如果我尝试配置使用在创建集群时通知的 CIDR 服务范围的子网建立的 VPN,我会收到一条错误消息,指出在任何接口中都找不到子网。
为了解决这个问题,我意识到我可以配置一条隧道来通知具有更大范围的子网,只要我的接口中连接的子网在更广泛的通知范围内。例如,我可以配置一个 VPN 通知子网 10.0.0.0/16,但我的 pod 和节点子网(附加在 eth0 中)是 10.0.0.0/17,服务的 CIDR 范围是 10.0.128.0/17,这样所有流量 10.0.0.0/16 都通过 vpn 隧道路由。通过这种方式,作为一种解决方法,我将我的服务 CIDR 定义为 pod 和节点网络之后的网络,并使用与两者重叠的网络配置 VPN。
来自 VPN (VM) 一侧的所有 10.0.0.0/16 流量都正确路由到内部隧道。如果我尝试使用 Pod 子网 (10.0.0.0/17) 中的任何 IP 直接访问 Pod,一切正常。问题是,如果我尝试使用来自 CIDR 的服务 IP(10.0.128.0/17)访问 kubernetes 服务,则在 K8S 服务之前无法正确路由流量。我可以在 AKS 的 tcpdump 中看到请求,但它没有到达服务中。所以我的问题是,如何在strongswan上进行配置,在其中我可以访问aks kubernetes集群上的服务?
下面是strongswan的当前配置:
- PEER-1(虚拟机)
conn %default
authby="secret"
closeaction="restart"
dpdaction="restart"
dpddelay="5"
dpdtimeout="10"
esp="aes256-sha1-modp1536"
ike="aes256-sha1-modp1024"
ikelifetime="1440m"
keyexchange="ikev2"
keyingtries="1"
keylife="60m"
mobike="no"
conn PEER-1
auto=add
leftid=<LEFT-PHASE-1-IP>
left=%any
leftsubnet=20.25.0.0/16
leftfirewall=yes
leftauth=psk
rightid=<RIGHT-PHASE-1-IP>
right=<RIGHT-PHASE-1-IP>
rightsubnet=10.0.0.0/16
rightfirewall=yes
rightauth=psk
- PEER-2(AKS)
conn %default
authby="secret"
closeaction="restart"
dpdaction="restart"
dpddelay="5"
dpdtimeout="10"
esp="aes256-sha1-modp1536"
ike="aes256-sha1-modp1024"
ikelifetime="1440m"
keyexchange="ikev2"
keyingtries="1"
keylife="60m"
mobike="no"
conn PEER-2
auto=start
leftid=<LEFT-PHASE-1-IP>
left=%any
leftsubnet=10.0.0.0/16
leftfirewall=yes
leftauth=psk
rightid=<RIGHT-PHASE-1-IP>
right=<RIGHT-PHASE-1-IP>
rightsubnet=20.25.0.0/16
rightfirewall=yes
rightauth=psk