通过GCE入口的Nginx real_ip_header?

时间:2018-02-07 12:36:37

标签: nginx kubernetes google-cloud-platform google-compute-engine kubernetes-ingress

我的目标是通过GCE入口过滤由nginx服务的Kubernetes Engine上部署的角度应用的IP地址访问。

但是在我的nginx上,remote_addr不对。

$ LB_IP是此处定义的IP:kubernetes.io/ingress.global-static-ip-name:app-angular

我在nginx上使用set_real_ip_from从X-Forwarded-For

设置ip
set_real_ip_from $LB_IP;
real_ip_header X-Forwarded-For;

原始IP来自Google文档中预期的X-Forwarded-For标头:https://cloud.google.com/compute/docs/load-balancing/http/#components

我可以看到X-Forwarded-For包含$ CLIENT_IP但是remote_addr不正确,顺便说一下我的IP过滤器无效。有什么想法吗?

我的nginx日志:

  

10.40.40.40 - - [07 / Feb / 2018:11:29:48 +0000]" GET /styles.bundle.css HTTP / 1.1" 200 35908" http://MY_URL/home" " Mozilla / 5.0(Macintosh; Intel Mac OS X 10_13_3)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 64.0.3282.140 Safari / 537.36" " $ CLIENT_IP,$ LB_IP"

但我想:

  

$ CLIENT_IP - - [07 / Feb / 2018:11:29:48 +0000]" GET /styles.bundle.css HTTP / 1.1" 200 35908" http://MY_URL/home" " Mozilla / 5.0(Macintosh; Intel Mac OS X 10_13_3)AppleWebKit / 537.36(KHTML,与Gecko一样)Chrome / 64.0.3282.140 Safari / 537.36" " $ CLIENT_IP,$ LB_IP"

我的Ingress配置:

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  name: ingress
  annotations:
    kubernetes.io/ingress.global-static-ip-name: app-angular
spec:
  rules:
    - host: MY_URL
      http:
        paths:
        - backend:
            serviceName: app-backend
            servicePort: 80

我的后端配置:

apiVersion: v1
kind: Service
metadata:
  name: app-backend
spec:
  type: NodePort
  selector:
    app: app-angular
  ports:
  - port: 80
    targetPort: 80

我的部署配置:

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: app-angular
spec:
  replicas: 2
  revisionHistoryLimit: 2
  template:
    metadata:
      labels:
        app: app-angular
        tier: frontend
    spec:
      containers:
      - name: app-angular
        image: gcr.io/MY_PROJECT/app-angular:MY_TAG
        imagePullPolicy: Always
        ports:
          - containerPort: 80

我的nginx配置:

server {
  listen 80;

  root /usr/share/nginx/html;

  location / {

    set_real_ip_from $LB_IP;
    real_ip_header X-Forwarded-For;

    allow 130.211.0.0/22; #Google IP
    allow $CLIENT_IP; # FILTERED IP
    allow 10.0.0.0/8; #internal network
    deny all;

    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }

}

有什么想法吗?

3 个答案:

答案 0 :(得分:0)

您提供的链接专门针对GCP负载均衡器。 至于nginx Load Balancer,您应该考虑将ExternalTrafficPolicy annotation添加到NodePort服务以保留客户端IP。

我还发现一个类似的问题可以追溯到2017年中期,这表明certain versions of the nginx controller存在问题,请确保您使用的图像仍然没有此问题。

最后,您可能需要添加use-proxy-protocol: "true" with the configuration ConfigMap,因为您使用的入口充当使用代理的HTTP(S)负载均衡器。

答案 1 :(得分:0)

我们在HTTP GCLB ingress前面使用nginx ingress。要让RealIP工作,我添加了

kind: ConfigMap
apiVersion: v1
metadata:
  name: ingress-nginx
  labels:
    k8s-addon: ingress-nginx.addons.k8s.io
data:
  ##
  ## Google Infra Blocks needed
  ##  130.211.0.0/22,35.191.0.0/16
  ##
  ## Google Cloud Load Balancer
  ##  GCLB-IP/32
  proxy-real-ip-cidr: 130.211.0.0/22,35.191.0.0/16,[YOUR-GCLB-IP]/32

这允许nginx信任来自Google基础架构的X-Forwarded-For

答案 2 :(得分:0)

他们是两个解决方案(gcbirzan帮助我解决GCP问题):

1)使用来自IP地址范围的良好IPS更新我的nginx配置:

IP地址范围可在此处找到:https://console.cloud.google.com/networking/networks/list。 您只需为区域或所有需要的区域添加set_real_ip_from即可。 不要忘记on_ip_recursive on;

server {
  listen 80;

  root /usr/share/nginx/html;

  location / {

    set_real_ip_from 10.128.0.0/20;
    ...
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    allow 130.211.0.0/22; #Google IP
    allow $CLIENT_IP; # FILTERED IP
    allow 10.0.0.0/8; #internal network
    deny all;

    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }

}

2)使用以下内容更新我的后端配置:

externalTrafficPolicy:Local

apiVersion: v1
kind: Service
metadata:
  name: app-backend
spec:
  type: NodePort
  selector:
    app: app-angular
  ports:
  - port: 80
    targetPort: 80
  externalTrafficPolicy: Local

更新nginx配置:

现在$ remote_addr中显示的IP将使用您的客户端请求和Google Infra IPS的负载均衡器IP设置:130.211.0.0/22,35.191.0.0/16

不要忘记on_ip_recursive on;

server {
  listen 80;

  root /usr/share/nginx/html;

  location / {

    set_real_ip_from $LB_IP;
    set_real_ip_from 130.211.0.0/22;
    set_real_ip_from 35.191.0.0/16;
    real_ip_header X-Forwarded-For;
    real_ip_recursive on;

    allow 130.211.0.0/22; #Google IP
    allow 35.191.0.0/16; #Google IP
    allow $CLIENT_IP; # FILTERED IP
    allow 10.0.0.0/8; #internal network
    deny all;

    index index.html index.htm;
    try_files $uri $uri/ /index.html =404;
  }

}