当前位置: 首页 > 知识库问答 >
问题:

Nginx real_ip_头通过GCE入口?

谷梁翰飞
2023-03-14

我的目标是通过GCE入口过滤nginx提供服务的Kubernetes引擎上部署的angular应用程序的IP地址的访问。

但是在我的nginx上remote_addr不对。

$LB_IP是此处定义的IP:kubernetes。io/入口。全局静态ip名称:app angular

我在nginx上使用set_real_ip_from来设置X-Forwarded-For的ip

set_real_ip_from $LB_IP;
real_ip_header X-Forwarded-For;

原始ip在X-Forwarded-For标头中,正如google文档中预期的那样:https://cloud.google.com/compute/docs/load-balancing/http/#components

我可以看到X-Forwarded-For包含$CLIENT_IP,但远程地址不正确,顺便说一下,我的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;英特尔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.cssHTTP/1.1"200 35908"超文本传输协议://MY_URL/home""Mozilla/5.0(Macintosh; Intel Mac OS X10_13_3)AppleWebKit/537.36(KHTML, like Gecko)<--plhd--3/64.0.3282.140Safari /537.36"$CLIENT_IP,$LB_IP"

我的入口配置:

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个答案

栾越
2023-03-14

我们正在nginx-ingres前面使用一个httpgclb-ingres。为了让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信任来自谷歌基础设施的X-Forwarded-For

堵彬彬
2023-03-14

您提供的链接专门针对GCP负载平衡器。对于NGNIX负载均衡器,您应该考虑将外部业务策略注解添加到NoDePoT服务中,以保持客户端IP。

我还发现了一个类似的问题,可追溯到2017年年中,这表明某些版本的nginx控制器存在问题,请确保您正在使用的映像没有此问题。

最后,您可能需要在配置ConfigMap中添加use-proxy-协议:true,因为您使用的入口充当使用代理的HTTP(S)负载均衡器。

李和裕
2023-03-14

它们是两种解决方案(感谢gcbirzan帮助我解决GCP松弛问题):

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

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

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) 使用以下内容更新我的后端配置:

外部流量策略:本地

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将被设置为客户端请求的负载平衡器IP和google Infra IP:130.211。0.0/22,35.191.0.0/16

别忘了真正的爱;

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;
  }

}
 类似资料:
  • 我在GCP中配置了Kubernetes集群,如下所示, 进入。亚马尔 应用程序。亚马尔 默认后端。亚马尔 我的健康检查很好,负载平衡器已经启动并运行。我也可以点击默认后端。但是当我试着打的时候, 我在404状态码的postman中发现以下错误, 但是API在服务中可用,当我将服务从NodePort切换到LoadBalancer时,我可以使用LoadBalancer IP访问API。有人能帮我解决这

  • GLBC GLBC is a GCE L7 load balancer controller that manages external loadbalancers configured through the Kubernetes Ingress API. Overview See here for high-level concepts on Ingress in Kubernetes. Fo

  • 我有一个服务: 和一个入口路径: 但保存入口返回: 同步期间出错:评估入口规范时出错:服务“default/ExternalName”类型为“ExternalName”,应为“NodePort”或“LoadBalancer” GCE入口应支持外部名称服务(或者至少没有易于查找的文档表明存在其他错误),并且该错误很难追踪。

  • 问题内容: 当前,在Sass文件中,我们具有以下内容: 这很不好,因为我们实际上不确定路径:可能是,因为npm是如何安装东西的。 在Sass中,有没有一种方法可以搜索直到找到node_modules?甚至是通过npm包含Sass的正确方法? 问题答案: 如果您在2017年寻找方便的答案并使用Webpack,这是我发现的最简单的方法。 假设您的模块路径如下: 然后,您可以在主要的scss文件中使用:

  • 当通过java将列名写入CSV文件时,列中两个单词之间的空格将显示为双引号。。。 例如,测试数据[0][36]=“True Accept”;在csv文件中显示为True“Accept”。。 有没有办法解决这个问题? 代码如下: 编辑:这是解决方案: CSVWriter writer=new CSVWriter(new FileWriter(“list\u of_churers.csv”)、'、'、

  • 我想从我的脚本中实现一个自定义的nginx缓存控制方法,通过使用自定义标头:"Do-Cache"。我用在nginx的超文本传输协议块: 在nginx的服务器块中: 因此,对于Do-Cache: Public,nginx应该缓存响应。否则不会。 但这种配置不起作用。通过在日志中调试,和的值是正确的,直到它们在nginx的服务器块中使用为止。如果在服务器块中使用它们(,或简单的),则变量获得“1”值,