将 ipv4 路由到 ipv6 作为克服不拥有 ipv4 块以实现本地 k8s 负载平衡的机制(无 aws/gcp)

将 ipv4 路由到 ipv6 作为克服不拥有 ipv4 块以实现本地 k8s 负载平衡的机制(无 aws/gcp)

这是不是关于隧道的问题,尽管这可能是解决方案的一部分。

对于公共云提供商来说,请求负载均衡器很简单,因为提供商拥有大量 A/B/C 类公共 IPv4 地址块。但是,虽然拥有 IPv6 地址块很简单,但发布负载均衡器地址却并非易事,因为您不能假设传入流量支持 IPv6。如何弥补这一差距?

尝试实现:给定有限的 ipv4 公共地址 (4),而是生成第 7 层 http 负载均衡器 A 记录,这些记录映射到 ipv4 地址。然后这些 ip4 地址路由到集群内的 ipv6 集群地址。也许这里需要 SNI?

约束:不能假设 Ingres 流量支持 ipv6,因此(如果可能的话)需要 SNAT 来重写 ipv6 -> ipv6 并返回(这可能吗?)、iptables 和 conntrack 进行连接跟踪?

E.g ingress
Load balancer A records   Public ipv4 address  <mapping (not tunnelling)>  Public ipv6 address range  
lb[1-n].example.com  ------>  192.0.2.0/24         ---->   2001:DB8::/32
E.g. egress
ipv6 address range        Public ipv4 address
2001:DB8::/32             ----->  192.0.2.0/24        ----> source ip ipv4 or ipv6

https://sookocheff.com/post/kubernetes/understanding-kubernetes-networking-model/ https://kubernetes.io/docs/concepts/services-networking/dual-stack/网络过滤器https://metallb.universe.tf/ https://linux.die.net/man/8/ip6tables https://community.hetzner.com/tutorials/install-kubernetes-cluster

答案1

在知名端口上运行服务时,IP 元组的服务器部分基本不变。例如,广受欢迎的 443/tcp 上的 https。第 4 层负载均衡器需要为每个服务提供一个 IP 地址,而 IPv4 耗尽后,这不切实际。

基于名称的虚拟主机可以解决问题。可能是 http 主机头或 SNI。

不,不需要 SNAT。

基于代理的负载均衡器应该能够终止 IP 连接并建立新连接,可能使用不同的地址系列。例如, a.example.net和都b.example.net具有负载均衡器的 A 记录203.0.113.69。虚拟主机 A 的后端可能是 ,2001:db8:26:74::a而 B 的后端是2001:db8:26:83::b。如果所有流量都通过负载均衡器,则后端不需要 IPv4 地址。

或者,可以在第 4 层让 v4 和 v6 相互通信,而无需应用程序代理或状态防火墙。SIIT 是一种无国籍的翻译方式。但是,这并不能解决许多服务需要多个 v4 地址的问题,您的一个 IPv4 将在后端映射到一个 IPv6。因此,这很可能不会取代应用层虚拟主机。如果您只想在数据中心使用 v6 并仅在需要时提供 v4,这仍然很有用。

这些代理或转换实际上都不是路由。IPv4 和 IPv6 是不同的协议,它们不能不加修改地进行转发。

真正弥合差距的是端到端的 v6。互联网的大部分领域尚未实现这一目标。

相关内容