Как настроить белый список анонтаций Kubernetes Ingress Nginx только для http
Я настроил мой входной SSL поддержки:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "service"
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "x.x.x.x/xx"
nginx.ingress.kubernetes.io/ssl-redirect: "false"
spec:
tls:
- hosts:
- "example.com"
secretName: example.name
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
В моей конфигурации выше, только IP в белом списке может получить доступ к домену как для HTTP, так и для HTTPS. Но я хотел бы настроить все IP-адреса могут получить доступ https://example.com
(HTTPS) и некоторые IP-адреса в белом списке могут получить доступ без SSL - http://example.com
,
3 ответа
Я решил мою проблему, добавив больше настроек в расположение nginx (прослушив http и https), используя nginx.ingress.kubernetes.io/configuration-snippet
аннотаций.
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: "service"
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
# The configs to allow all IPs access via https and allow some IPs in
# security whitelist access via http
nginx.ingress.kubernetes.io/configuration-snippet: |
if ($https) {
set $allow_ip true;
}
if ($remote_addr ~ (x.x.x.x|y.y.y.y) {
set $allow_ip true;
}
if ($allow_ip != true) {
return 403;
}
spec:
tls:
- hosts:
- "example.com"
secretName: example.name
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
Я считаю, что на данный момент это невозможно, используя только nginx-ingress.
При настройке схемы HTTPS для Ingress он начинает прослушивать порт 443 и продолжает прослушивать порт 80.
Однако вы можете сделать это, используя локальный экземпляр Nginx в качестве внешнего балансировщика нагрузки.
Перейдите по этой ссылке для получения подробных инструкций: "Служба балансировки нагрузки Kubernetes TCP в помещении (не в облаке)"
Как еще один вариант, вы можете попробовать Istio Ingress
whitelist-source-range
аннотация всегда будет влиять на весь ресурс Ingress. Однако вы можете (не проверено!) Попробовать использовать два отдельных ресурса Ingress: один для доступа по HTTP (с белым списком источника и без tls
конфигурации) и один для HTTPS (с отключенным простым HTTP, используя kubernetes.io/ingress.allow-http
аннотация):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: service-https
annotations:
nginx.ingress.kubernetes.io/ssl-redirect: "false"
kubernetes.io/ingress.allow-http: "false"
spec:
tls:
- hosts:
- "example.com"
secretName: example.name
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80
---
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: service-http
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "x.x.x.x/xx"
spec:
rules:
- host: "example.com"
http:
paths:
- path: /
backend:
serviceName: service
servicePort: 80