客户端真实源IP地址可以用于分析网站流量和用户行为。通过分析来源IP地址,可以了解用户的地理位置、浏览器偏好和其他用户行为指标。这些数据可以用于优化网站设计、定位目标受众和改善用户体验。
在容器化场景下,客户端和容器服务端之间可能存在多种代理服务器,外部请求在经过多次转发后,容器中服务无法获取到客户端真实源IP。
场景介绍
不同请求类型,获取客户端真实IP说明如下:
类型 |
说明 |
---|---|
HTTP/HTTPS请求 | 通过在ELB监听器开启X-Forwarded-For,业务应用可以通过X-Forwarded-For头部提取到源地址,从而获得客户端真实IP。 |
TCP请求 | 通过在后端主机配置TOA插件获取客户端的真实源IP地址。TOA是操作系统的内核模块,需要在ELB后端主机中安装TOA插件,以实现后端主机可获取客户端真实源IP地址的目的。 |
对于HTTP/HTTPS请求,具体实现分为以下两类:
服务类型 |
说明 |
---|---|
负载均衡 | ELB访问方式,是通过弹性负载均衡ELB产品来实现负载均衡。通过创建LoadBalancer SVC时,指定注解方式开启X-Forwarded-For。当通过ELB访问工作负载时,可以通过X-Forwarded-For头部提取到源地址。 |
节点端口(NodePort) | NodePort访问方式,是将容器端口映射到节点端口,实现获取客户端源IP有以下方式: 当配置SVC外部流量策略为Local时,表示请求不经过转发,可以获取客户端源ip; 当配置SVC外部流量策略为Cluster时,需要通过手动创建监听器及后端主机组,开启X-Forwarded-For实现。 |
前提条件
已创建工作负载,确认容器内服务端口
已创建负载均衡器,可参考:创建负载均衡器
集群组件ccse-cloud-controller-manager(命名空间kube-system下)版本需大于等于v1.0.4,版本可通过查看组件使用的镜像确认
HTTP/HTTPS请求获取客户端真实源IP地址
负载均衡SVC
SVC创建
- 登录“云容器引擎”管理控制台;
- 在集群列表页点击进入指定集群;
- 进入主菜单**“网络”-“服务”,点击”创建服务“**,进入创建页,进行以下配置:
配置项 |
说明 |
---|---|
类型 | 选择"负载均衡" |
负载均衡 | 选择已建负载均衡器名称 |
注解 | 1、点击“添加注解” 2、注解类型选择“天翼云注解”,注解名称选择“service.beta.kubernetes.io/ctyun-loadbalancer-xforwardedfor”,值为“true”,点击“添加” 3、注解类型选择“天翼云注解”,注解名称选择“service.beta.kubernetes.io/ctyun-loadbalancer-protocol-port”,值为“{PORTOCOL}:{PORT}”,点击“添加” 4、如果是https监听,需要添加指定https证书的注解,注解类型选择“天翼云注解”,注册名称选择“service.beta.kubernetes.io/ctyun-loadbalancer-ssl-cert”,值为https证书的id,点击添加 |
端口映射 | 1、填入正确的工作负载容器内端口 2、服务端口填入上一步注解中定义的监听器端口,比如这里配置为88 |
工作负载绑定 | 选择需要获取客户端真实ip的工作负载类型、名称 |
说明{PROTOCOL}:{PORT}中,PROTOCOL为监听协议,值为http或https;PORT为负载均衡监听器端口,填入一个当前负载均衡器可用端口,比如http:88;https证书的id可从天翼云负载均衡控制台证书列表中获取
-
配置完成后,点击“提交”
-
负载均衡SVC创建完成后,到负载均衡控制台,选择指定负载均衡器,查看详情如下:
说明 | |
---|---|
监听器 | 监听器会新增一条HTTP_88的记录,并已开启“通过X-Forwarded-For获取客户端IP” |
后端主机组 | 后端主机组新增关联监听器HTTP_88的记录 |
访问验证
以工作负载为nginx为例:
- 进入负载详情,查看pod日志,打开自动刷新;
- 本地请求访问工作负载,比如http://117.88..:88/
- 查看pod日志,从nginx access.log可以看到请求记录,下面124.127.58.**即为本机ip地址,可获取客户端真实ip
192.168.0.17 - - [08/Apr/2024:06:30:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" "124.127.58.**"
节点端口(NodePort)SVC
当选择服务类型为“节点端口”,即NodePort类型SVC,有以下两种获取客户端源IP方式:
- 配置SVC外部流量策略,即Service的spec.externalTrafficPolicy,配置为Local。
该方式下外部请求就只会被代理到本地 endpoints 而不会被转发到其它节点,这样就保留了原来的IP 地址。 - 该模式下客户端只能访问pod所在的node节点,无法使用其他node节点访问服务。
- 配置SVC外部流量策略仍为Cluster,创建SVC之后,需要在负载均衡器中手动创建监听器及后端主机组,后端主机组配置为容器节点及端口。
注意cubecni不支持外部流量策略为Local模式
说明该模式下客户端只能访问pod所在的node节点,无法使用其他node节点访问服务
方式一:外部流量策略为Local
创建服务时,选择类型为“节点端口”,外部流量策略为Local:
创建完成后,通过http://{NodeIP}:32767请求工作负载,从nginx access.log可以看到请求记录,下面192.168.0.6即为内网ip地址,可获取客户端真实ip:
192.168.0.6 - - [08/Apr/2024:07:31:25 +0000] "GET / HTTP/1.1" 200 615 "-" "curl/7.79.1" "-"
方式二:外部流量策略为Cluster、手动配置负载均衡
1、创建服务时,选择类型为“节点端口”,外部流量策略为Cluster:
2、进入“负载均衡”控制台,创建负载均衡器或者选择已有负载均衡实例,进行以下操作:
- 点击“添加监听器”,选择协议端口为HTTP类型,填入端口号;打开下方“获取客户端IP”开关:
- 点击进入下一步,这里定义后端主机组名称:
- 配置完成,点击“创建”;
- 进入上一步创建的后端主机组,点击“添加主机”,选择主机为容器集群节点:
- 点击“下一步”,配置主机端口为步骤1中SVC配置端口,配置权重:
- 点击“确定”,完成主机添加。
3、访问验证
-
本地请求访问工作负载,比如http://117.88..:8088/
-
查看pod日志,从nginx access.log可以看到请求记录,下面124.127.58.**即为本机ip地址,可获取客户端真实ip:
192.168.0.17 - - [08/Apr/2024:07:30:14 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36" "124.127.58.**"
TCP请求获取客户端真实源IP地址
针对TCP请求,可以通过在后端主机配置TOA插件获取客户端的真实源IP地址,详情可参见:TCP请求获取客户端真实源IP地址