负载均衡获得真实源IP的6种方法

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
简介:

获得真实IP的6种方法

当数据包从负载均衡器往后端转发时候,真实源IP可在L3、L4、L7实现,并且分别有2种方法可以获得真实IP,因此共有6种方法:

保持L3层源IP不变,根据连接次数可以分为

 ●   一次连接模式,如lvs
 ●   二次连接模式,如haproxy的透明模式

在L4层数据里,添加源IP信息,有2种模式

 ●   在4层的option字段里增加源IP信息,比如tcp option、udp option
 ●   在4层末尾和7层开头之间,增加proxy protocol信息

在L7层数据里,增加源IP信息,有2种模式

 ●   协议自带,例如HTTP的X-FORWARD-FOR

 ●  业务程序自行实现

一次连接与二次连接

一次连接:负载均衡器对数据包仅做转发,而不对后端重新发起三次握手

二次连接:和一次连接相对应,在tcp转发时候,对后端重新进行了三次握手。上面所讲的L4和L7方法的负载均衡,都是二次连接

可以通过对比源端口是否有改变来简单判断是一次连接还是二次连接,端口没改变,可以理解为一次连接,有改变就是二次连接

方法1: L3的一次连接模式

介绍:是指在网络层不对源IP做修改,直接将数据包转发给后端,当后端接收到数据的时候,源IP就是真实IP。

实现:LVS-DR、LVS-NAT、LVS-TUNNEL模式。其中LVS-TUNNEL比较特别,是在原有数据包的开头封装了IP头,当后端收到数据的时候,将封装的IP头进行解封装,获得的就是原有数据包。

优点:逻辑简单,当负载均衡器故障切换的时候,从客户端到后端的tcp连接不会中断

缺点:对网络架构有要求,比如DR模式,要求后端配VIP,并且回包要能直接回到客户机;NAT模式,要求回包经过负载均衡器;TUNNEL模式要求后端支持IPIP隧道

方法2: L3的二次连接模式

介绍:是指负载均衡器和后端重新进行三次握手,但保持数据包的源IP为真实IP。

实现:haproxy(开启tproxy透明代理模式)+ iptables(fwmark打标记)+ 策略路由这3者组合才能实现

优点:可以实现L7层(如HTTP/HTTPS)的负载均衡,而一次连接主要实现L4层的负载均衡

缺点:配置最复杂,同时要求回包经过负载均衡器

方法3: L4的toa模式

介绍:在4层的option字段里增加源IP信息,比如在tcp option里增加源IP信息(称为toa)、udp option里增加源IP信息(称为uoa)

实现:负载均衡器配置lvs-fullnat(只支持toa),iqiyi/dpvs(支持toa和uoa);后端要加载toa、uoa模块,这个模块的作用是替换了后端应用程序获取IP的系统接口的钩子

优点:对网络架构要求低

缺点:lvs-fullnat需要编译内核,且只支持rhel/centos 6的内核,另外多年未更新;iqiyi/dpvs功能强大,但需要dpdk的支持;后端都需要加载toa/uoa模块,且只支持linux系统。

方法4: L4的proxy protocol模式

介绍:在L7层开头增加proxy protocol数据(该协议是haproxy发明),目前有v1(明文)和v2(二进制)版本

实现:负载均衡器和后端同时开启proxy protocol,haproxy和nginx均支持,不过haproxy的配置颗粒度更小,另外nginx转发数据时候只支持v1

优点:对网络架构要求低,只要程序支持即可,因此理论上没有操作系统限制

缺点:目前支持proxy protocol的程序较少,且两端只能都开启或者都不开启该协议,不能一端开一端不开

方法5: L7协议自带,例如HTTP的X-FORWARD-FOR

介绍:最常见的方法,协议自带源IP信息,或者可定制插入

实现:例如HTTP协议有X-FORWARD-FOR,也可以自己将源IP插入到HTTP头部信息里

优点:对网络架构要求低,配置简便

缺点:容易被伪造

方法6: L7层业务程序自行实现

介绍:最好的方法,就是业务方自行实现

实现:业务自行实现,例如在client端插入源IP信息,带到server端

优点:对网络架构无要求,只要网络可通即可,只要安全做好,不容易被伪造

缺点:业务方要有一定开发能力

总结

如果能做到无状态,不需要真实源IP,是最好的。因为这样对底层架构没有要求,底层架构就可以做的更高级更弹性。

如果一定要获得真实源IP,推荐方案的顺序就是倒推,从L7到L3,即首选方法6,如果不行再选用方法5,以此类推到方法1。


原文发布时间为:2018-11-21
本文作者:小慢哥
本文来自云栖社区合作伙伴“ 老叶茶馆”,了解相关信息可以关注“ 老叶茶馆”。
相关实践学习
SLB负载均衡实践
本场景通过使用阿里云负载均衡 SLB 以及对负载均衡 SLB 后端服务器 ECS 的权重进行修改,快速解决服务器响应速度慢的问题
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
相关文章
|
6月前
|
负载均衡 算法
ribbon的7种负载均衡算法和替换方法
ribbon的7种负载均衡算法和替换方法
141 0
ribbon的7种负载均衡算法和替换方法
|
3月前
|
负载均衡 网络协议 算法
【揭秘】IP负载均衡背后的神秘力量:如何让网站永不宕机?揭秘四大核心技术,解锁高可用性的秘密通道!
【8月更文挑战第19天】负载均衡技术保障互联网服务的高可用性和可扩展性。它像交通指挥官般按策略分配用户请求至服务器集群,提高响应速度与系统稳定性。本文轻松介绍IP负载均衡的工作原理、算法(如轮询、最少连接数)及实现方法,通过示例展示基于四层负载均衡的设置步骤,并讨论健康检查和会话保持的重要性。负载均衡是构建高效系统的关键。
48 2
|
1月前
|
负载均衡 Kubernetes 区块链
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
随机密码生成器+阿里k8s负载均衡型服务加证书方法+移动终端设计+ico生成器等
53 1
|
2月前
|
负载均衡 Java 开发者
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
34 0
|
3月前
|
负载均衡 网络协议 中间件
IP负载均衡技术
【8月更文挑战第17天】IP负载均衡技术
57 4
|
6月前
|
负载均衡 Kubernetes 网络协议
如何在集群的负载均衡过程保留请求源IP
本文探讨了在Kubernetes (k8s)集群中如何确保服务获取到请求的源IP。通常,源IP可能会因网络地址转换(NAT)和代理服务器而丢失。为保留源IP,文章建议在代理服务器层添加HTTP头`X-REAL-IP`字段。在K8s中,通过设置`externalTrafficPolicy: Local`可保留源IP,但这会牺牲负载均衡。使用Ingress时,可通过配置Ingress Controller的`use-forwarded-headers`并调整ConfigMap来同时保留源IP和实现负载均衡。文章适用于对网络和K8s感兴趣的读者。
157 3
|
4月前
|
负载均衡 算法 Java
实现高可用和可扩展的负载均衡系统的Java方法
实现高可用和可扩展的负载均衡系统的Java方法
|
Shell Perl
获取slb日志里ip地址的shell脚本
获取slb日志里ip地址的shell脚本
89 1
|
弹性计算 负载均衡 前端开发
使用阿里云负载均衡时获取客户端真实IP的方法
使用阿里云负载均衡时获取客户端真实IP的方法
使用阿里云负载均衡时获取客户端真实IP的方法
|
存储 SQL 缓存
达梦实现高可用性的实现(failover功能/负载均衡/虚拟ip透明切换)
达梦实现高可用性的实现(failover功能/负载均衡/虚拟ip透明切换)
833 0
下一篇
无影云桌面