Сохранение клиентского IP-адреса с использованием Istio и сопроводительного файла Envoy с custon nginx в качестве балансировщика нагрузки

Моя установка - это обычный Nginx (не ingress-nginx) в качестве балансировщика нагрузки, и этот балансировщик нагрузки указывает на службу, которая действует как шлюз API. Проблема в том, что теперь, когда я реализую Istio, прокси-сервер посланника, который подключается к моему nginx, удаляет IP-адреса моих клиентов, поэтому я не могу использовать белый список IP-адресов в файле конфигурации Nginx, например:

allow xxx.xxx.xxx.xxx;
deny all;

Потому что мой Nginx получает 127.0.0.1 от коляски Envoy.

Как я могу сказать Envoy, чтобы он отправил моему Nginx настоящий IP-адрес? или как я могу обрабатывать белый список IP-адресов с помощью Istio, без использования входящего компонента?


person codiaf    schedule 27.08.2019    source источник
comment
есть соответствующее обсуждение на github github.com/envoyproxy/envoy/issues/2659 и github.com/envoyproxy/envoy/issues/4128   -  person A_Suh    schedule 06.09.2019
comment
Вы пытались установить SocketOption в начальной загрузке envoy, как описано здесь github.com/envoyproxy/ посланник / issues / 2659 # issuecomment-420487228?   -  person A_Suh    schedule 26.09.2019


Ответы (1)


Например, если вы определили Сервис, Шлюз и VirtualService, как показано ниже. Я предполагаю, что вы используете контроллер istio по умолчанию вместо nginx, как вы сказали, что вы используете простой контроллер nginx, а не nginx ingress:

---
kind: Service
apiVersion: v1
metadata:
  name: api
  labels:
    app: api
spec:
  selector:
    app: api
  ports:
    - port: 5000
      protocol: TCP
      targetPort: 5000
      name: http
---
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: api-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 443
      name: https
      protocol: HTTPS
    tls:
      mode: SIMPLE
      serverCertificate: /etc/istio/ingressgateway-certs/tls.crt
      privateKey: /etc/istio/ingressgateway-certs/tls.key
    hosts:
    - "primeratest.redacted.co"
  - port:
      number: 80
      name: http
      protocol: HTTP
    tls:
      httpsRedirect: true
    hosts:
    - "primeratest.redacted.co"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: api
spec:
  hosts:
  - "primeratest.redacted.co"
  gateways:
  - api-gateway
  http:
  - match:
    - uri:
        prefix: /
    route:
    - destination:
        host: api
        port:
          number: 5000

Это сработает, если вы добавите externalTrafficPolicy: Local к службе istio-ingressgateway, а затем в конфигурации nginx добавите заголовок с $ http_x_forwarded_for.

Установка externalTrafficPolicy: Local в службе входящего шлюза приведет к прохождению реального клиентского IP. Envoy не поддерживает фильтрацию x-forwarded-for, ее необходимо добавить.

Фильтрация на основе IP обсуждается здесь также в качестве возможного исправления: filtering-forwarder.

Полезная документация: белый-черный список.

Полезная статья: белые списки.

person Malgorzata    schedule 28.08.2019
comment
Извините, нет, я имел в виду, что я не использую какой-либо из шлюзов istio (nginx или ingressgateway), у меня просто обычный nginx в качестве балансировщика нагрузки, и мои запросы затем перенаправляются на API-шлюз, который распределяет различные службы внутри кластера. , и проблема теперь связана с тем, что сопроводительный файл Envoy, введенный в мой Nginx, удаляет мой реальный IP-адрес из запросов и помещает 127.0.0.1 для моего Nginx, поэтому я больше не могу вносить в белый список - person codiaf; 28.08.2019