В приложении не виден реальный IP клиента за балансировщиком или Cloudflare

Viewed 36

Перед ingress-nginx стоит внешний балансировщик или CDN. В X-Forwarded-For и X-Real-IP приходит адрес балансировщика, либо цепочка адресов обрезана.

1 Answers
  • L7-балансировщик или CDN. Нужен inlet LoadBalancer или HostPort. В его секции (spec.loadBalancer или spec.hostPort) задайте behindL7Proxy: true, а в acceptClientIPHeadersFrom перечислите подсети балансировщика или CDN. По умолчанию заголовкам доверяют от всех, поэтому ограничьте источники. Чтобы сохранить всю цепочку X-Forwarded-For, добавьте в spec.config параметр compute-full-forwarded-for: "true".

  • Cloudflare или другой прокси со своим заголовком. Там же задайте realIPHeader: CF-Connecting-IP; параметр работает только вместе с behindL7Proxy: true.

    spec:
      inlet: LoadBalancer
      loadBalancer:
        behindL7Proxy: true
        realIPHeader: CF-Connecting-IP
        acceptClientIPHeadersFrom:
        - <подсеть-балансировщика>
    
  • TCP-балансировщик. Включите на нём PROXY protocol и используйте inlet LoadBalancerWithProxyProtocol или HostPortWithProxyProtocol. Inlet у существующего контроллера не меняется: создайте новый IngressNginxController. Источники запросов ограничьте через acceptRequestsFrom.

  • Бесконечное перенаправление (ответ 301) при behindL7Proxy и CDN, который ходит на origin по HTTP. CDN передаёт X-Forwarded-Proto: http, и Ingress снова отправляет на HTTPS. Настройте CDN на обращение по HTTPS или отключите перенаправление на Ingress: nginx.ingress.kubernetes.io/ssl-redirect: "false".

Не задавайте server-snippet в spec.config вместе с acceptRequestsFrom: Deckhouse Platform сам использует этот ключ для ограничения доступа.

Подробнее в документации: параметр behindL7Proxy и остальные параметры IngressNginxController.