解决K8s中Ingress Nginx控制器无法获取真实客户端IP与白名单配置

在这里插入图片描述

在我们架构上有多层代理,无法获取到真实的ip,怎么解决这个问题,获取到真实CLIENT客户端的IP地址呢,在ingress-nginx控制器上配置其实也不难,加入下面三行配置即可解决:

data:
allow-snippet-annotations: ‘true’
compute-full-forwarded-for: ‘true’
forwarded-for-header: ‘X-Forwarded-For’
use-forwarded-headers: ‘true’

# kubectl -n kube-system edit configmaps ingress-nginx-controller

kind: ConfigMap
apiVersion: v1
metadata:
  name: ingress-nginx-controller
  namespace: ops
  labels:
    app.kubernetes.io/component: controller
    app.kubernetes.io/instance: ingress-nginx
    app.kubernetes.io/name: ingress-nginx
    app.kubernetes.io/part-of: ingress-nginx
    app.kubernetes.io/version: 1.7.1
data:
  allow-snippet-annotations: 'true'
  compute-full-forwarded-for: 'true'
  forwarded-for-header: 'X-Forwarded-For'
  use-forwarded-headers: 'true'

我们来看看这三行配置的详细含义:

compute-full-forwarded-for
: 将 remote address 附加到 X-Forwarded-For Header而不是替换它。当启用此选项后端应用程序负责根据自己的受信任代理列表排除并提取客户端 IP。

forwarded-for-header
: 设置用于标识客户端的原始 IP 地址的 Header 字段。默认值X-Forwarded-For
,此处由于A10带入的是自定义记录IP的Header,所以此处填入是X_FORWARDED_FOR

use-forwarded-headers
: 如果设置为True时,则将设定的X-Forwarded-*
 Header传递给后端, 当Ingress在L7 代理/负载均衡器
之后使用此选项。如果设置为 false 时,则会忽略传入的X-Forwarded-*
Header, 当 Ingress 直接暴露在互联网或者 L3/数据包的负载均衡器后面,并且不会更改数据包中的源 IP请使用此选项。

我们的负载上要nginx stream 4层代理:

nginx 需要编译增加–with-stream_realip_module模块,然后对应的server块中添加参数,proxy_protocol on; 如下图所示:

在这里插入图片描述

前面的4层代理更改好之后,ingress解析不了包,会报错 ‘400 Bad Request’,需要修改ingress cm nginx-configuration 配置 , 增加 use-proxy-protocol: “true” 。如下:

compute-full-forwarded-for: "true"
forwarded-for-header:X-Forwarded-For
use-forwarded-headers:"true"
use-proxy-protocol:"true"

nginx 7层代理需要设置如下参数:

在这里插入图片描述
在这里插入图片描述

waf、cdn等产品也要开启后端真实ip代理。

ingress白名单控制

kind: Ingress
apiVersion: networking.k8s.io/v1
metadata:
  name: digital-office-platform-server
  namespace: uat-digital
  annotations:
    kubesphere.io/creator: admin
    nginx.ingress.kubernetes.io/real-ip-header: X-Forwarded-For
    nginx.ingress.kubernetes.io/configuration-snippet: |  # 加入自定义头部,保存remote_addr信息
      proxy_set_header X-Custom-Real-IP $remote_addr;
    nginx.ingress.kubernetes.io/real-ip-recursive: 'true'
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    nginx.ingress.kubernetes.io/whitelist-source-range: 172.31.96.10/32,10.0.0.10/32 # 只允许信任IP访问,其他返回403
spec:
  ingressClassName: nginx
  rules:
    - host: tmg-digital-uat.example.com
      http:
        paths:
          - path: /platform-interface(/|$)(.*)
            pathType: Prefix
            backend:
              service:
                name: digital-office-platform-server
                port:
                  number: 80
    - host: tmg-digital-uat.example.com
      http:
        paths:
          - path: /
            pathType: ImplementationSpecific
            backend:
              service:
                name: open-web
                port:
                  number: 80

但这个时候,我们在请求头部传入伪造的XFF信息,再看结果呢

[root@uat-admin ~]# curl  -H "X-Forwarded-For: 10.0.1.201"  http://tmg-digital-uat.example.com
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx</center>
</body>
</html>

在172.31.96.10服务器上访问正常,其他机器上也访问失败,配置成功。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值