在不使用代理协议的情况下,无法使用 Digitalocean 上的边缘堆栈在协议 https 上捕获客户端真实 IP

问题描述 投票:0回答:2

我根据 edge stack docsdigitalocean annotations docs 对 Load Balancer 进行了一些更改以捕获真实的客户端 IP。我在负载均衡器中做了以下更改:

服务中:

service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "false"
service.beta.kubernetes.io/do-loadbalancer-protocol: http
service.beta.kubernetes.io/do-loadbalancer-tls-passthrough: "true"
service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https: "true"

在模块中:

apiVersion: getambassador.io/v3alpha1
kind: Module
metadata:
    name: ambassador
namespace: ambassador
spec:
  config:
    xff_num_trusted_hops: 1
    use_remote_address: false

在这些更改之后,我们能够在 HTTP 请求中检测到客户端 IP “xxx.xxx.xxx.xxx”,如日志中所示:

ACCESS [2022-09-13T08:43:06.434Z] "GET /v1/test/exp1 HTTP/1.1" 301 - 0 0 135 - "xxx.xxx.xxx.xxx" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" "e0c33ab9-9b8b-43a1-927b-da6c324b16b2" "xyz.example.com" "-"

但是在 HTTPS 上,我们得到的客户端 IP 为 "-":

ACCESS [2022-09-13T08:43:18.619Z] "GET /v1/test/exp1 HTTP/1.1" 200 - 0 2 102 63 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36" "de9b20c1-53bb-447b-b336-45cd532c54c2" "xyz.example.com" "xx.xxx.xxx.xxx:80"
kubernetes ssl-certificate kubernetes-helm digital-ocean clientip
2个回答
3
投票

您在 HTTPS 上使用直通时遇到问题,但根据 digital ocean docs for passthrough

SSL 直通在后端分配解密负载 服务器,但每个服务器都必须具有证书信息。你 也不能添加或修改 HTTP 标头,因此您可能会丢失客户端的 IP X-forwarded-* 中包含的地址、端口和其他信息 标题。

根据 DO 文档的建议,我们需要使用证书,这样我们就不会丢失包括 X-Forwarded-For 的 HTTP 标头信息,因此需要以下步骤来解决此问题:

  • 首先,使用此 DO API 创建证书:Create Certificate.

  • 作为回应,您将获得类似于 uuid("892071a0-bb95-49bc-8021-3afd67a210bf") 的证书 ID,保存以备后用。

  • 大使服务做了如下改动:

     service.beta.kubernetes.io/do-loadbalancer-enable-proxy-protocol: "false"
     service.beta.kubernetes.io/do-loadbalancer-protocol: http
     service.beta.kubernetes.io/do-loadbalancer-certificate-id: "<HERE COMES CERTIFICATE ID>"
     service.beta.kubernetes.io/do-loadbalancer-redirect-http-to-https: "true"
    
  • 是否进行 helm upgrade 或 kubectl apply 以反映更改。

就是这样,享受......


-2
投票

我不清楚这个注解必须应用在哪个 Kubernetes 资源上?

它是否在 LoadBalancer 类型的服务上?

© www.soinside.com 2019 - 2024. All rights reserved.