上云无忧 > 文档中心 > 腾讯云容器服务实战教程 - 在 TKE 中获取客户端真实源 IP
容器服务 TKE
腾讯云容器服务实战教程 - 在 TKE 中获取客户端真实源 IP

文档简介:
应用场景: 当需明确服务请求来源以满足业务需求时,则需后端服务能够准确获取请求客户端的真实源 IP。例如以下场景: 具有对服务请求的来源进行审计的需求,例如异地登录告警。 具有针对安全攻击或安全事件溯源的需求,例如 APT 攻击及 DDoS 攻击等。
*此产品及展示信息均由腾讯云官方提供。免费试用 咨询热线:400-826-7010,为您提供专业的售前咨询,让您快速了解云产品,助您轻松上云! 微信咨询
  免费试用、价格特惠
说明
本文适用于腾讯云容器服务(Tencent Kubernetes Engine ,TKE),以下简称 TKE。

应用场景

当需明确服务请求来源以满足业务需求时,则需后端服务能够准确获取请求客户端的真实源 IP。例如以下场景:
具有对服务请求的来源进行审计的需求,例如异地登录告警。
具有针对安全攻击或安全事件溯源的需求,例如 APT 攻击及 DDoS 攻击等。
业务场景具有数据分析的需求,例如业务请求区域统计。
其他需获取客户端地址的需求。

实现方法

在 TKE 中默认的外部负载均衡器为 腾讯云负载均衡 作为服务流量的访问首入口,腾讯云负载均衡器会将请求流量负载转发到 Kubernetes 工作节点的 Kubernetes Service(默认)。此负载均衡过程会保留客户端真实源 IP(透传转发),但在 Kubernetes Service 转发场景下,无论使用 iptables 或 ipvs 的负载均衡转发模式,转发时都会对数据包做 SNAT,即不会保留客户端真实源 IP。在 TKE 使用场景下,本文提供以下四种方式获取客户端真实源 IP,请参考本文按需选择适用方式。

通过 Service 资源的配置选项保留客户端源 IP

该方式优缺点分析如下:
优点:只需修改 Kubernetes Service 资源配置即可。
缺点:会存在潜在的 Pods(Endpoints)流量负载不均衡风险。
如需启用保留客户端 IP 功能,可在 Service 资源中配置字段 Service.spec.externalTrafficPolicy。该字段表示服务是否希望将外部流量路由到节点本地或集群范围的 Pods。有两个选项值:Cluster(默认)和 Local 方式。如下图所示:

Cluster:表示隐藏客户端源 IP,LoadBalancer 和 NodePort 类型服务流量可能会被转发到其他节点的 Pods。
Local:表示保留客户端源 IP 并避免 LoadBalancer 和 NodePort 类型的服务流量转发到其他节点的 Pods,详情请参考 Kubernetes 设置外部负载均衡器说明。相关 YAML 配置示例如下:
		
apiVersion: v1
kind: Service
metadata:
name: example-Service
spec:
selector:
app: example-Service
ports:
- port: 8765
targetPort: 9376
externalTrafficPolicy: Local
type: LoadBalancer

通过 TKE 原生 CLB 直通 Pod 转发模式获取

该方式优缺点分析如下:
优点:为 TKE 原生支持的功能特性,只需在控制台参考对应文档配置即可。
缺点:会有一些使用限制,具体参考下面给出的文档链接。
使用 TKE 原生支持的 CLB 直通 Pod 的转发功能(CLB 透传转发,并绕过 Kubernetes Service 流量转发),后端 Pods 收到的请求的源 IP 即为客户端真实源 IP,此方式适用于四层及七层服务的转发场景。转发原理如下图:

详细介绍和配置请参见 使用 LoadBalancer 直连 Pod 模式 Service

通过 HTTP Header 获取

该方式优缺点分析如下:
优点:在七层(HTTP/HTTPS)流量转发场景下推荐选择该方式,可通过 Web 服务代理的配置或后端应用代码直接获取 HTTP Header 中的字段,即可拿到客户端真实源 IP,非常简单高效。
缺点:仅适用于七层(HTTP/HTTPS)流量转发场景,不适用于四层转发场景。
在七层(HTTP/HTTPS)服务转发场景下,可以通过获取 HTTP Header 中 X-Forwarded-ForX-Real-IP 字段的值来获取客户端真实源 IP。TKE 中有两种场景使用方式,原理介绍图如下所示:

场景一:使用 TKE Ingress 获取真实源 IP

腾讯云负载均衡器(CLB 七层) 默认会将客户端真实源 IP 放至 HTTP Header 的 X-Forwarded-ForX-Real-IP 字段。当服务流量在经过 Service 四层转发后会保留上述字段,后端通过 Web 服务器代理配置或应用代码方式获取到客户端真实源 IP,详情请参见 负载均衡如何获取客户端真实 IP。通过容器服务控制台 获取源 IP 步骤如下:
1. 为工作负载创建一个主机端口访问方式的 Service 资源,本文以 nginx 为例。如下图所示:

2. 为该 Service 创建一个对应的 Ingress 访问入口,本文以 test 为例。如下图所示:

3. 待配置生效后,在后端通过获取 HTTP Header 中的 X-Forwarded-ForX-Real-IP 字段值得到客户端真实源 IP。后端抓包测试结果示例如下图所示:

场景二:使用 Nginx Ingress 获取真实源 IP

Nginx Ingress 服务部署需要 Nginx Ingress 能直接感知客户端真实源 IP,可以采用保留客户端源 IP 的配置方式,详情请参见 Kubernetes 设置外部负载均衡器说明。或通过 CLB 直通 Pod 的方式,详情请参见 在 TKE 上使用负载均衡直通 Pod。当 Nginx Ingress 在转发请求时会通过 X-Forwarded-ForX-Real-IP 字段来记录客户端源 IP,后端可以通过此字段获得客户端真实源 IP。配置步骤如下:
1. Nginx Ingress 可以通过 TKE 应用商店、自定义 YAML 配置或使用官方(helm 安装)方式安装,原理和部署方法请参见 在 TKE 上部署 Nginx Ingress 中的部署方案1或方案3。若选择方案1部署,则需要修改 Nginx Ingress Controller Service 的 externalTrafficPolicy 字段值为 Local 。安装完成后,会在容器服务控制台 自动为 Nginx Ingress Controller 服务创建一个 CLB(四层)访问入口,如下图所示:

2. 为需转发的后端服务创建一个 Ingress 资源并配置转发规则。YAML 示例如下:
		
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx # ingressClass类为"nginx"
name: example
namespace: default
spec:
rules: # 配置服务转发规则
- http:
paths:
- backend:
serviceName: nginx
servicePort: 80
path: /
3. 待配置生效后,在后端获取 HTTP Header 中的 X-Forwarded-ForX-Real-IP 字段值得到客户端真实源 IP。后端抓包测试结果示例如下图所示:

通过 TOA 内核模块加载获取真实源 IP

该方式优缺点分析如下:
优点:对于 TCP 传输方式,在内核层面且仅对 TCP 连接的首包进行改造,几乎没有性能损耗。
缺点
需要在集群工作节点上加载 TOA 内核模块,且需在服务端通过函数调用获取携带的源 IP 及端口信息,配置使用较复杂。
对于 UDP 传输方式,会对每个数据包改造添加 option 数据(源 IP 和源端口),带来网络传输通道性能损耗。
TOA 内核模块原理和加载方式请参见 获取访问用户真实 IP 文档。

相关文档

腾讯云负载均衡器获取客户端真实 IP 介绍:如何获取客户端真实 IP
腾讯云负载均衡介绍:负载均衡 CLB
在 TKE 上部署 Nginx Ingress
TKE 网络模式介绍:GlobalRouter 附加 VPC-CNI 模式说明
在 TKE 上使用负载均衡直通 Pod
TOA 模块使用介绍:获取访问用户真实 IP
Kubernetes 设置外部负载均衡器说明:创建外部负载均衡器 Kubernetes
相似文档
  • 操作场景 Traefik 是一款优秀的反向代理工具,与 Nginx 相比,Traefik 具有以下优势: 原生支持动态配置。例如,Kubernetes 的 Ingress 资源或 IngressRoute 等 CRD 资源(Nginx 每次需重新加载完整配置,部分情况下可能会影响连接)。
  • 操作场景: 腾讯云 Kubernetes 集群实现蓝绿发布或灰度发布通常需向集群额外部署其他开源工具,例如 Nginx Ingress、Traefik 或将业务部署至服务网格 Service Mesh,利用服务网格的能力实现。这些方案均具有一定难度,若您的蓝绿发布或灰度需求不复杂,且不期望集群引入过多的组件或复杂的用法,则可参考本文利用 Kubernetes 原生的特性以及腾讯云容器服务 TKE 标准集群和 TKE Serverless 集群自带的 LB 插件实现简单的蓝绿发布和灰度发布。
  • 本文将介绍使用 Nginx Ingress 实现金丝雀发布的使用场景、用法详解及实践。 说明: 使用 Nginx Ingress 实现金丝雀发布的集群,需部署 Nginx Ingress 作为 Ingress Controller,并且对外暴露统一的流量入口。详情请参见 在 TKE 上部署 Nginx Ingress。
  • 容器服务 TKE 通过集成日志服务 CLS,提供了全套完整的产品化能力,实现 Nginx-ingress 日志采集、消费能力。更多请查看 Nginx-ingress 日志配置。若默认的日志索引不符合您的日志需求,您可以自定义日志索引,本文向您介绍如何更新 Nginx Ingress 的日志索引。
  • 使用场景: nginx-ingress 是使用 Nginx 作为反向代理和负载平衡器的 Kubernetes 的 Ingress 控制器,容器服务 TKE 提供了产品化的能力,可以直接在集群内安装和使用 Nginx-ingress。有关安装 Nginx-ingress 的详细信息,请参见 安装 Nginx-ingress 实例。
官方微信
联系客服
400-826-7010
7x24小时客服热线
分享
  • QQ好友
  • QQ空间
  • 微信
  • 微博
返回顶部