干货:不同场景容器内获取客户端源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的方法的更多相关文章
- F5 IIS Log获取客户端源IP
1.配置F5启用X-Forwarded-For方法: 1:Local Traffic-Profiles-Http-改"Insert XForwarded For"为Enable 2 ...
- Istio 中实现客户端源 IP 的保持
作者 尹烨,腾讯专家工程师, 腾讯云 TCM 产品负责人.在 K8s.Service Mesh 等方面有多年的实践经验. 导语 对于很多后端服务业务,我们都希望得到客户端源 IP.云上的负载均衡器,比 ...
- 干货:Java正确获取客户端真实IP方法整理
在JSP里,获取客户端的IP地址的方法是:request.getRemoteAddr(),这种方法在大部分情况下都是有效的.但是在通过了Apache,Squid等反向代理软件就不能获取到客户端的真实I ...
- 服务端如何获取客户端请求IP地址
服务端获取客户端请求IP地址,常见的包括:x-forwarded-for.client-ip等请求头,以及remote_addr参数. 一.remote_addr.x-forwarded-for.cl ...
- 【Nginx】如何获取客户端真实IP、域名、协议、端口?看这一篇就够了!
写在前面 Nginx最为最受欢迎的反向代理和负载均衡服务器,被广泛的应用于互联网项目中.这不仅仅是因为Nginx本身比较轻量,更多的是得益于Nginx的高性能特性,以及支持插件化开发,为此,很多开发者 ...
- Kubernets中获取客户端真实IP总结
1. 导言 绝大多数业务场景都是需要知道客户端IP的 在k8s中运行的业务项目,如何获取到客户端真实IP? 本文总结了通行的2种方式 要答案的直接看方式一.方式二和总结 SEO 关键字 nginx i ...
- 获取客户端的IP地址
/// <summary> /// 获取客户端的IP地址 /// </summary> /// <returns></returns> public s ...
- Java Web 获取客户端真实IP
Java Web 获取客户端真实IP 发生的场景:服务器端接收客户端请求的时候,一般需要进行签名验证,客户端IP限定等情况,在进行客户端IP限定的时候,需要首先获取该真实的IP.一般分为两种情况: 方 ...
- java nginx等代理或网关转发请求后获取客户端的ip地址,原理
在没有网关或者反向代理软件情况下,java里获取客户端ip地址的方法是request.getRemoteAddr() 先解释下http协议和TCP协议: 网页默认是进行http连接了,http协议即超 ...
随机推荐
- SPP、ASPP、RFB、CBAM
SPP:ASPP:将pooling 改为了 空洞卷积RFB:不同大小的卷积核和空洞卷积进行组合,认为大的卷积应该有更大的感受野. CBAM:空间和通道的注意力机制 SPP: Spatial Pyram ...
- Django中的ORM如何通过数据库中的表格信息自动化生成Model 模型类?
Inspectdb Django项目通过绑定的数据库中的相应表格直接自动化生成Model 模型类 python manage.py inspectdb Django 中的 ORM 可以实现对象关系映射 ...
- Win10系统Jmeter+maven+Jenkins接口自动化环境搭建(一)
Jmeter+maven+Jenkins实现接口自动化,需要使用idea或eclipse配置maven项目,这里我使用的是idea.具体步骤如下: 1.安装jmeter+jdk jmeter安装之前需 ...
- 精讲RestTemplate第8篇-请求失败自动重试机制
本文是精讲RestTemplate第8篇,前篇的blog访问地址如下: 精讲RestTemplate第1篇-在Spring或非Spring环境下如何使用 精讲RestTemplate第2篇-多种底层H ...
- sql server 查询表字段的说明备注信息
SELECT 表名 = case when a.colorder= then d.name else '' end, 表说明 = case when a.colorder= then isnull(f ...
- Maccms 后门分析
(该文参考网络他人资料,仅为学习,不许用于非法用途) 一.环境 攻击者 : Kali Linux 被攻击者 :Windows Maccms 网站基于php+mysql 的系统,易用性.功能良好等优点 ...
- 【Eclipse+PyDev】使用Python的IDE安装及配置详解
转的文章 https://blog.csdn.net/jkwwwwwwwwww/article/details/51338230 https://blog.csdn.net/Jkwwwwwwwwww/ ...
- C/C++经典面试题1,const关键字用法总结
本文主要说明了const关键字的作用,包括了用于对数组,指针与类相关的修饰方法,作为笔记总结使用.若有错误与不足,欢迎指正. const关键字 用于修饰一个常类型,常类型的变量或对象的值无法被改变,即 ...
- java安全编码指南之:基础篇
目录 简介 java平台本身的安全性 安全第一,不要写聪明的代码 在代码设计之初就考虑安全性 避免重复的代码 限制权限 构建可信边界 封装 写文档 简介 作为一个程序员,只是写出好用的代码是不够的,我 ...
- Mysql 5.6创建新用户并授权指定数据库相应权限
一.环境 Centos 6.9 Mysql 5.6.40 二.步骤 1.使用root用户登陆mysql mysql -uroot -p 输入密码: 2.创建新用户 CREATE USER 'user' ...