干货:不同场景容器内获取客户端源IP的方法
摘要:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢?
k8s已经成为当今容器化的标准,人们在享受容器带来的高效与便利的同时,也遇到一些烦恼:客户端和容器服务器之间可能存在多种不同形式的代理服务器,那容器中如何获取到客户端真实的源ip呢?下面我们就几种场景类型如何能获取到源ip进行讨论。
原理介绍:
四层转发:
Nodeport:nodeport访问方式,是将容器端口映射到节点端口,如果“服务亲和”选择“集群级别”需要经过一次服务转发,无法实现获取客户端源ip,而“节点模式”不经过转发,可以获取客户端源ip。
ELB:ELB访问方式,是通过华为云ELB产品来实现负载均衡,“服务亲和”也是需要选择“节点级别”,其中“共享型”ELB需要在节点安装TOA插件,而“独享型”ELB默认透传源ip,不需要安装TOA插件。
七层转发:
Ingress:应用在七层访问时,客户端源ip默认保存在HTTP头部的“X-Forwarded-For”字段,无需做其他操作。
具体操作:
一、负载均衡 ( LoadBalancer )
负载均衡( LoadBalancer )的Service模式下,支持容器中获取源IP需要满足以下前提条件:
1. 服务亲和选择“节点级别”而不是“集群级别”。
2. 在pod所在的节点安装TOA插件。(“独享型”ELB无需进行以下操作)
安装TOA插件步骤如下:
1) 准备编译环境:
执行如下命令,安装gcc编译器。
]# yum install gcc
执行如下命令,安装make工具。
]# yum install make
2)编译内核模块
a) 下载TOA内核模块源代码。
]# wget https://github.com/Huawei/TCP_option_address/archive/master.zip b) 执行如下命令,进入源码目录,编译模块。
]# unzip master.zip
]# cd TCP_option_address-master/src/
]# make
编译过程未提示warning或者error,说明编译成功,检查当前目录下是否已经生成toa.ko文件。
说明:如果报错提示“config_retpoline=y but not supported by the compiler, Compiler update recommended”,表明gcc版本过老,建议将gcc升级为较新版本。
3)加载内核模块
执行如下命令,加载内核模块。
]# insmod toa.ko
执行如下命令,验证模块加载情况,查看内核输出信息。
]# dmesg | grep TOA
若提示信息包含“TOA: toa loaded”,说明内核模块加载成功。
4) 自动加载内核模块
为了使TOA内核模块在系统启动时生效,可以将加载TOA内核模块的命令加到客户的启动脚本中。
在“/etc/sysconfig/modules/”目录下新建toa.modules文件。该文件包含了TOA内核模块的加载脚本,请参考如下示例:
#!/bin/sh
/sbin/modinfo -F filename /root/toa/toa.ko > /dev/null 2>&1
if [ $? -eq 0 ]; then
/sbin/insmod /root/TCP_option_address-master/src/toa.ko
fi
注意:其中“/root/TCP_option_address-master/src/toa.ko”为TOA内核模块文件的路径,客户需要将其替换为自己编译的TOA内核模块路径。
执行以下命令,为toa.modules启动脚本添加可执行权限。
]# chmod +x /etc/sysconfig/modules/toa.modules
这种情况下可以从四层负载均衡上获取到客户端的源IP(可以通过netstat查看)。
测试要点:这种情况下可以使用netstat看到客户端连接到POD的IP地址。
二、节点访问 ( NodePort )
节点访问(NodePort)类型的Service的服务亲和选择“节点级别”而不是“集群级别”,即Service的 spec.externalTrafficPolicy 需要设置为 Local。
图1 服务亲和选择节点级别
三、七层负载均衡(Ingress)
七层负载均衡的模式下,不能在四层负载均衡上获取客户端IP(不能通过netstat查看客户端IP),需要对应用服务器进行配置,然后通过七层负载均衡的http头中的x-forward-for获取。
真实的来访者IP会被负载均衡放在HTTP头部的X-Forwarded-For字段,格式如下:
X-Forwarded-For: 来访者真实IP, 代理服务器1-IP, 代理服务器2-IP, ...
测试要点:从容器中获取http请求头”x-forward-for”,获取的IP为客户端的IP。
点击关注,第一时间了解华为云新鲜技术~
干货:不同场景容器内获取客户端源IP的方法相关推荐
- 获取客户端真实ip的方法
为什么需要获取客户端真实ip ip地址是按地域分布的,服务器获取到客户端ip后可以做流量统计和分析,服务器也可以针对客户端ip做一些定制化的功能,比如限流和黑白名单. 网络环境十分复杂,客户端发出的一 ...
- Java从代理服务器中获取客户端真实IP的方法
概要 一般在单机版的tomcat获取请求来源的ip,可以使用下面方式这么干,下文的request是HttpServletRequest对象. String remoteAddr = request.g ...
- java 获取docker ip_docker容器内部获取宿主机ip地址方法以及报错解决
1,在docker容器内执行以下python代码或根据需要插入到你的.py文件中: import paramiko #通过pip3 install paramiko 安装 s = paramiko.S ...
- PHP获取客户端真实IP的方法
摘要: 利用getenv获取获取用户真实ip可以获取相当可观的用户数据,不管是做大数据还是数据备份查找来源,都是不错的选择. 好处: 一个网站,获取用户是非常有必要的,你获得了ip可以干嘛?简单了说, ...
- F5 IIS Log获取客户端源IP
1.配置F5启用X-Forwarded-For方法: 1:Local Traffic-Profiles-Http-改"Insert XForwarded For"为Enable ...
- 获取客户端真实 IP
Tomcat + Nginx 反向代理获取客户端真实IP.域名.协议.端口 Nginx 反向代理后,Servlet 应用通过 request.getRemoteAddr() 取到的 IP 是 Ngin ...
- python获取客户端ip_各种脚本语言获取客户端真实IP的方法
各种语言获取客户端真是ip的方法 1.PHP脚本获取客户端真实ip的方法 整体思路:需要依次检查HTTP_CLIENT_IP.HTTP_X_FORWARDED_FOR.REMOTE_ADDR这三个是否 ...
- 带你玩转kubernetes-k8s(第14篇:k8s-深入掌握Pod-在容器内获取Pod信息)
哈喽~大家好!昨天我们讲解了ConfigMap的使用,今天我来继续深入的讨论Pod的概念及其用法. 现在我们进入正题. Downward API 我们知道,每个Pod在被成功创建出来之后,都会被系统分 ...
- 干货:Java正确获取客户端真实IP方法整理
image 在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客 ...
最新文章
- 合工大的计算机专业好不好,合肥工业大学计算机好,还是西电的好?差距有多大?...
- mysql查看存储过程工作记录20130711
- shell-sed命令详解(转)
- linux操作系统的特点包括什么,什么是Linux操作系统?有哪些主要特点?
- POJ 1459 -- Power Network(最大流, 建图)
- 《设计师要懂心理学》-第四章-人如何思考
- 新版本xx Chrome等主流浏览器将不再允许关闭点击跟踪
- iOS回顾笔记( 01 )-- XIB和纯代码创建应用的对比
- SharePoint 2013 基于表单 Membership 的身份验证
- zblog php伪静态,zblogphp如何设置伪静态
- Python2 倒计时,还不快来掌握 Python3 酷炫的新特性? | 原力计划
- OC 内存管理之手动内存管理MRC
- cad导出pdf_CAD手机看图软件中怎么将CAD图纸转为PDF/图片格式?
- 8个免费和最佳开源视频流服务器软件
- GPU VS FPGA对比
- 求证三角形中r/R=4sinA/2sinB/2sinC/2=cosA+cosB+cosC-1
- 如何查看iOS版本?
- 笔记:使用CSS实现箭头图标
- KafKa 开启 SASL 验证
- 布谷鸟哈希函数的参数_Cuckoo Hash 布谷鸟哈希
热门文章
- es6 Object.getOwnPropertyDescriptors()
- oracle raw类型 索引,为什么RAW数据类型可以建立索引,但是不走索引
- Java是有法_Java基础语法
- java学习是什么_学习JAVA有什么作用?
- java中常见的编译错误的是_编译时JAVA最常见的错误有哪些
- Oracle修改表存储参数,Oracle存储结构之参数文件
- php xml getattribute,PHP XMLReader getAttribute()用法及代码示例
- Batch批量替换hosts
- 5,线程池,进程池,协程,IO模型
- mac terminal update management pack