
在我们架构上有多层代理,无法获取到真实的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服务器上访问正常,其他机器上也访问失败,配置成功。
4991

被折叠的 条评论
为什么被折叠?



