如何将 nginx 入口自定义端口列入白名单

Lee*_*son 5 nginx kubernetes azure-aks nginx-ingress

我在 Kubernetes 中有一个 nginx 入口,其中既有白名单(由注释处理nginx.ingress.kubernetes.io/whitelist-source-range),也有自定义端口映射(通过配置映射公开 SFTP 服务器端口 22 --tcp-services-configmap)。白名单适用于 80 和 443,但不适用于 22。如何将自定义端口列入白名单?

配置大致如下:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-ingress-controller
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  ...
    spec:
      serviceAccountName: nginx-ingress-serviceaccount
      containers:
        - name: nginx-ingress-controller
          image: quay.io/kubernetes-ingress-controller/nginx-ingress-controller:0.33.0
          args:
            - /nginx-ingress-controller
            - --configmap=$(POD_NAMESPACE)/nginx-configuration
            - --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services
            - --udp-services-configmap=$(POD_NAMESPACE)/udp-services
            - --publish-service=$(POD_NAMESPACE)/ingress-nginx
            - --annotations-prefix=nginx.ingress.kubernetes.io
          ports:
            - name: http
              containerPort: 80
            - name: https
              containerPort: 443
            - name: sftp
              containerPort: 22
        ...

kind: Ingress
metadata:
  name: {{ .controllerName }}
  annotations:
    kubernetes.io/ingress.class: nginx
    nginx.ingress.kubernetes.io/whitelist-source-range: {{ .ipAllowList }}

kind: ConfigMap
apiVersion: v1
metadata:
  name: tcp-services
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
data:
  22: "default/sftp:22"

Run Code Online (Sandbox Code Playgroud)

更新

感谢@jordanm,我发现我可以通过loadBalancerSourceRangesLoadBalancer 而不是 nginx 来限制所有端口的 IP 地址:

kind: Service
apiVersion: v1
metadata:
  name: ingress-nginx
  namespace: ingress-nginx
  labels:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
spec:
  externalTrafficPolicy: Local
  type: LoadBalancer
  loadBalancerIP: {{ .loadBalancerIp }}
  selector:
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
  ports:
    - name: http
      port: 80
      targetPort: http
    - name: https
      port: 443
      targetPort: https
    - name: sftp
      port: 22
      targetPort: sftp
  loadBalancerSourceRanges:
    {{ .ipAllowList }}
Run Code Online (Sandbox Code Playgroud)

Mal*_*ata 2

首先看一下这个问题:ip-whitelist-support

IP 未列入 TCP 服务白名单,替代方法是为 TCP 服务创建单独的防火墙,并在防火墙级别将 IP 列入白名单。

对于特定位置{{ $path }} 我们定义了 {{ if isLocationAllowed $location }}

查看官方 Ingress 文档:ingress-kubernetes

Ingress 将 HTTP 和 HTTPS 路由从集群外部公开到集群内的服务。流量路由由入口资源上定义的规则控制。

Ingress 不会公开任意端口或协议。将除 HTTP 和 HTTPS 之外的服务公开到 Internet 通常使用 Service.Type=NodePort 或 Service.Type=LoadBalancer 类型的服务。

您必须有一个 Ingress 控制器才能满足 Ingress。仅创建 Ingress 资源是没有效果的。

这种情况下Ingress资源工具ingress-controller如何处理http/https请求。在这种方法中,nginx-ingress 控制器作为软件(引入第 7 层功能/负载平衡)。

如果您对 nginx ingress tcp 支持感兴趣:

Ingress 不支持 TCP 或 UDP 服务。因此,该入口控制器使用标志 --tcp-services-configmap 和 --udp-services-configmap

请参阅:暴露 tcp-udp-服务

如果您想在使用 TCP 服务时检查更精细的配置,您应该考虑使用云提供商提供的 L4 负载平衡/防火墙设置。