如何在腾讯云容器服务中获取客户端真实源IP?

时间:2021-07-15 | 标签: | 作者:Q8 | 来源:jokey网络

小提示:您能找到这篇{如何在腾讯云容器服务中获取客户端真实源IP?}绝对不是偶然,我们能帮您找到潜在客户,解决您的困扰。如果您对本页介绍的如何在腾讯云容器服务中获取客户端真实源IP?内容感兴趣,有相关需求意向欢迎拨打我们的服务热线,或留言咨询,我们将第一时间联系您!

适用范围:腾讯云容器服务(Tencent Kubernetes Engine,TKE),以下简称TKE。

为什么需要获取客户端真实源IP?

< ">当需要能感知到服务请求来源去满足一些业务需求时,就需要后端服务能准确获取到请求客户端的真实源IP,比如以下场景:

< ">1.对服务请求的来源有做审计的需求,如异地登陆告警。

< ">2.针对安全攻击或安全事件溯源需求,如APT攻击、DDoS攻击等。

< ">3.业务场景数据分析需求,如业务请求区域统计。

< ">4.其他需要获取客户端地址的需求。

在TKE使用场景下如何获取客户端真实源IP?

< ">在TKE中默认的外部负载均衡器是腾讯云负载均衡器[1],作为服务流量的访问首入口,腾讯云负载均衡器会将请求流量负载转发到Kubernetes工作节点的Kubernets Service(默认),此负载均衡过程会保留客户端真实源IP(透传转发),但在Kubernetes Service转发场景下,无论是使用iptbales还是ipvs的负载均衡转发模式,转发时都会对数据包做SNAT,即不会保留客户端真实源IP,为了能够准确的获取到客户端的真实源IP,在TKE使用场景下,主要有四种方法获取客户端真实源IP,下面将逐个展开介绍下。

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

< ">要启用保留客户端IP功能,可在Service资源中配置字段< background-color: rgb(242, 242, 242);">Service.spec.externalTrafficPolicy,此字段表示服务是否希望将外部流量路由到节点本地或集群范围的端点。有两个选项值:< background-color: rgb(242, 242, 242);">Cluster(默认)和< background-color: rgb(242, 242, 242);">Local方式,如下图所示:

< ">Cluster表示隐藏了客户端源IP,< background-color: rgb(242, 242, 242);">LoadBalancer和< background-color: rgb(242, 242, 242);">NodePort类型服务流量可能会被转发到其他节点的Pods;< background-color: rgb(242, 242, 242);">Local表示保留客户端源IP并避免< background-color: rgb(242, 242, 242);">LoadBalancer和< background-color: rgb(242, 242, 242);">NodePort类型的服务流量转发到其他节点的Pods,详情请参考kubernets设置外部负载均衡器说明[2]。相关YAML配置示例如下:

apiVersion: v1

kind: Service

metadata:

  name: example-Service

spec:

  selector:

    app: example-Service

  ports:

    - port: 8765

      targetPort: 9376

  externalTrafficPolicy: Local

  type: LoadBalancer网络营销整合推广方案

< ">优点:只需要修改Kubernets Service资源配置即可。

< ">缺点:会存在潜在的Pods(Endpoints)流量负载不均衡风险。

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

< ">使用TKE原生支持的CLB直通Pod的转发功能(CLB透传转发,并绕过Kubernetes Service流量转发),后端Pods收到的请求的源IP即是客户端真实源IP,此方式无论是在四层还是七层服务的转发场景下都适用,转发原理如下图:

< ">详细介绍和配置请参考文档TKE场景下腾讯云CLB直通Pod使用场景介绍[3]。

< ">优点:TKE原生支持的功能特性,只需在控制台按照文档配置即可。

< ">缺点:集群需要开启VPC-CNI模式网络,详情参考文档VPC-CNI模式说明[4]

三、通过HTTP Header获取

< ">在七层(HTTP/HTTPS)服务转发场景下,可以通过获取Http Header中< background-color: rgb(242, 242, 242);">X-Forwarded-危机公关中失败For和< background-color: rgb(242, 242, 242);">X-Real-IP字段的值来获取客户端真实源IP,TKE中有两种场景使用方式,原理介绍如下:

< ">在场景一中,腾讯云负载均衡器(CLB七层)默认会将客户端真实源IP放到HTTP Header的< background-color: rgb(242, 242, 242);">X-Forwarded-For和< background-color: rgb(242, 242, 242);">X-Real-IP字段,当服务流量在经过Service四层转发后会保留上述字段,后端通过WEB服务器代理配置或应用代码方式获取到客户端真实源IP,详情参考请文档网站推广软文推广负载均衡如何获取客户端真实IP-最佳实践-文档中心-腾讯云[5];

< ">在场景二中,Nginx Ingress服务部署需要Nginx Ingress能直接感知客户端真实源IP,可以采用保留客户端源IP的配置方式(详情参考kubernets设置外部负载均衡器说明[6]),或通过CLB直通Pod的方式(详情参考TKE场景下腾讯云CLB直通Pod使用场景介绍[7]),当Nginx Ingress在转发请求时会通过< background-color: rgb(242, 242, 242);">X-Forwarded-For和< background-color: rgb(242, 242, 242);">X-Real-IP字段来记录客户端源IP,后端可以通过此字段获得客户端真实源IP。

< ">下面详细介绍在TKE中两种场景的配置使用方法:

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

< ">在TKE控制台先为工作负载创建一个主机端口访问方式的Service资源,如下图:

< ">然后在控制台为Service新建一个对应的Ingress访问入口,如下图:

< ">待配置生效后,在后端通过获取HTTP Header中的< background-color: rgb(242, 242, 242);">X-Forwarded-For或< background-color: rgb(242, 242, 242);">X-Real-IP字段值得到客户端真实源IP。后端抓包测试结果示例如下:

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

< ">Nginx Ingress可以通过TKE应用商店、自定义YAML配置或使用官方(helm安装)方式安装,原理和部署方法可参考文档在TKE上部署Nginx Ingress[8]中的部署方案一或方案三,若选择方案一部署,则需要修改Nginx Ingress Controller Service的< background-color: rgb(242, 242, 242);">externalTrafficPolicy字段值为< background-color: rgb(242, 242, 242);">Local。安装完成后,会在TKE控制台自动为Nginx Ingress Controller服务创建一个CLB(四层)访问入口,如下图所示:

< ">为要转发的后端服务创建一个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: /

< ">待配置生效后,在后端获取Http Header中的X-Forwarded-For或X-Real-IP字段值得到客户端真实源IP,后端抓包测试结果示例如下:

< ">以上介绍的两种场景都可以满足获取客户端真实源IP的需求,且具有以下优点和缺点:

< ">优点:在七层(HTTP/HTTPS)流量转发场景下比较推荐,可通过WEB服务代理的配置或后端应用代码直接获取Http Header中的字段即可拿到客户端真实IP,非常简单高效。

< ">缺点:仅适用于七层(HTTP/HTTPS)流量转发场景,不适用于四层转发场景,如果是四层转发场景,请使用后面介绍的其他方式。

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

< ">TOA内核模块原理和加载方式参考全球应用加速获取访问用户真实IP-操作指南-文档中心-腾讯云[9]文档。

< ">优点:对于TCP传输方式,在内核层面且仅对TCP连接的首包进行改造,几乎没有性能损耗。

< ">缺点:

< ">需要在集群工作节点上加载TOA内核模块,且需在服务端通过函数调用获取携带的源IP、端口信息,配置使用比较麻烦。

< ">对于UDP传输方式,会对每个数据包改造添加option数据(源IP和源端口),带来网络传输通道性能损耗。

< ">< color: rgb(31, 73, 125);">总结



< ">本文主要介绍了在TKE使用场景下服务端如何获取客户端真实源IP,以满足用户相关使用场景的需求,用户可通过对比上述四几种方式的优点和缺点,选择适合实际需求场景的最佳方案。

参考资料

[1]腾讯云负载均衡器:https://cloud.tencent.com/product/clb

[2]kubernets设置外部负载均衡器说明:https://kubernetes.io/zh/docs/tasks/access-application-cluster/create-external-load-balancer/

[3]TKE场景下腾讯云CLB直通Pod使用场景介绍:https://cloud.tencent.com/document/product/457/48793

[4]VPC-CNI模式说明:https://cloud.tencent.com/document/product/457/34993

[5]负载均衡如何获取客户端真实IP-最佳实践-文档中心-腾讯云:https://cloud.tencent.com/document/product/214/3728

[6]kubernets设置外部负载均衡器说明:https://kubernetes.io/zh/docs/tasks/access-application-cluster/create-external-load-balancer/

[7]TKE场景下腾讯云CLB直通Pod使用场景介绍:https://cloud.tencent.com/document/product/457/48793

[8]在TKE上部署Nginx Ingress:https://cloud.tencent.com/document/product/457/47293

[9]全球应用加速获取访问用户真实IP-操作指南-文档中心-腾讯云:https://cloud.tencent.com/document/product/608/14426

如何在腾讯云容器服务中获取客户端真实源IP?

上一篇:TikTok Ads如何创建和管理报告
下一篇:Unity Android接入MoPub聚合广告SDK


版权声明:以上主题为“如何在腾讯云容器服务中获取客户端真实源IP?"的内容可能是本站网友自行发布,或者来至于网络。如有侵权欢迎联系我们客服QQ处理,谢谢。
相关内容
推荐内容
扫码咨询
    如何在腾讯云容器服务中获取客户端真实源IP?
    打开微信扫码或长按识别二维码

小提示:您应该对本页介绍的“如何在腾讯云容器服务中获取客户端真实源IP?”相关内容感兴趣,若您有相关需求欢迎拨打我们的服务热线或留言咨询,我们尽快与您联系沟通如何在腾讯云容器服务中获取客户端真实源IP?的相关事宜。

关键词:如何在腾讯云容器服务中

关于 | 业务 | 案例 | 免责 | 隐私
客服邮箱:sales@1330.com.cn
电话:400-021-1330 | 客服QQ:865612759
沪ICP备12034177号 | 沪公网安备31010702002418号