SLB+Tomcat时request.RemoteAddr无法获取正确的客户端IP的问题解决方案

本文涉及的产品
应用型负载均衡 ALB,每月750个小时 15LCU
网络型负载均衡 NLB,每月750个小时 15LCU
传统型负载均衡 CLB,每月750个小时 15LCU
简介: # 前情提要 将CAS部署到阿里云,使用SLB进行前端负载以及SSL,后端使用TOMCAT作为应用服务器。 按照常规方式部署上去之后,遇到如下问题: 1. SSL下使用redirect,自动跳转到80端口。 2. CAS无法获取到客户端的IP,Cookies校验出错,导致单点登录功能失效。

# 前情提要

将CAS部署到阿里云,使用SLB进行前端负载以及SSL,后端使用TOMCAT作为应用服务器。

按照常规方式部署上去之后,遇到如下问题:

1. SSL下使用redirect,自动跳转到80端口。

2. CAS无法获取到客户端的IP,Cookies校验出错,导致单点登录功能失效。


# 查找原因

1. TOMCAT默认情况下的redirect会是80

2. CAS的Cookies检查以及写入程序使用request.getRemoteAddr()获取到的都是SLB的IP,并非实际客户端的IP,而且SLB的IP不固定(貌似阿里的SLB是一个N多台机器的玩意,每次一个页面请求过来,每个资源的请求IP都不同),我使用的杭州的SLB,IP段在100.97.*.*这个范围。


# 解决问题

1. 设定TOMCAT的使用前端代理模式,解决TOMCAT中程序的redirect没有跳转到SSL的问题。

在server.xml中找到对外开放的Connector,我的是用的NIO-8080

<Connector port="8080"

  proxyName="这里是域名"

  proxyPort="443"

  scheme="https"

  secure="true"

  protocol="org.apache.coyote.http11.Http11NioProtocol"

  connectionTimeout="20000" URIEncoding="UTF-8" useBodyEncodingForURI="true"

  redirectPort="8443" />

上述的含义是,

SLB的域名是proxyName

SLB对外端口是proxyPort

SLB使用的协议是https

SLB是否开启SSL:secure


2. 设定X-Forwarded过滤器

在server.xml中的<Engine>元素下增加如下内容:

<Valve className="org.apache.catalina.valves.RemoteIpValve"

  internalProxies="100\.97\.\d{1,3}\.\d{1,3}" />

internalProxies的意思是:TOMCAT仅接受这个IP段过来的请求中的X-Forwarded系列的值覆写为Remote_Addr等。加了这个过滤器之后使用request.getRemoteAddr()就可以获取到正确的客户端IP了。需要注意的是,这个IP段需要根据你所用的SLB来写。

在TOMCAT里,internalProxies的默认值为(无法覆盖到SLB的IP段):

10\.\d{1,3}\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3}|127\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.1[6-9]{1}\.\d{1,3}\.\d{1,3}|172\.2[0-9]{1}\.\d{1,3}\.\d{1,3}|172\.3[0-1]{1}\.\d{1,3}\.\d{1,3} 

特别注意:

这个<Value>一定要写在<Engine>元素下!

这个<Value>一定要写在<Engine>元素下!

这个<Value>一定要写在<Engine>元素下!

我查了很多网上的资料,都是说在server.xml里面加上这个<Value>,于是我看到Tomcat有默认定义一个<Value>在<Host>里面,于是我也跟着写里面,但是就是不生效。然后我特姆调试了两天,结果一直不生效,最后在TOMCAT文档里找到这么一句话:

This Valve may be used at the EngineHost or Context level as required. Normally, this Valve would be used at the Engine level.


其他参数请参考Tomcat的文档:

https://tomcat.apache.org/tomcat-8.0-doc/config/valve.html#Remote_Address_Filter


希望此篇能给有需要的人带来帮助。

相关实践学习
小试牛刀,一键部署电商商城
SAE 仅需一键,极速部署一个微服务电商商城,体验 Serverless 带给您的全托管体验,一起来部署吧!
负载均衡入门与产品使用指南
负载均衡(Server Load Balancer)是对多台云服务器进行流量分发的负载均衡服务,可以通过流量分发扩展应用系统对外的服务能力,通过消除单点故障提升应用系统的可用性。 本课程主要介绍负载均衡的相关技术以及阿里云负载均衡产品的使用方法。
目录
打赏
0
0
0
2
1
分享
相关文章
百度搜索:蓝易云【Nginx与Tomcat负载均衡-动静分离教程】
这些是将Nginx与Tomcat结合使用实现负载均衡和动静分离的基本步骤。根据您的需求和具体环境,可能还需要进行其他配置和调整。请确保在进行任何与网络连接和安全相关的操作之前,详细了解您的网络环境和安全需求,并采取适当的安全措施。
95 1
百度搜索:蓝易云【Nginx和tomcat实现负载均衡教程】
至此,你已经成功地使用Nginx和Tomcat实现了负载均衡。Nginx将根据配置的负载均衡策略将客户端请求分发到多个Tomcat服务器上,以提高系统的性能和可用性。请注意,在实际生产环境中,还需要进行其他配置和优化,如健康检查、会话保持等,以满足具体的需求。
85 0
【揭秘】IP负载均衡背后的神秘力量:如何让网站永不宕机?揭秘四大核心技术,解锁高可用性的秘密通道!
【8月更文挑战第19天】负载均衡技术保障互联网服务的高可用性和可扩展性。它像交通指挥官般按策略分配用户请求至服务器集群,提高响应速度与系统稳定性。本文轻松介绍IP负载均衡的工作原理、算法(如轮询、最少连接数)及实现方法,通过示例展示基于四层负载均衡的设置步骤,并讨论健康检查和会话保持的重要性。负载均衡是构建高效系统的关键。
210 2
Ribbon框架实现客户端负载均衡的方法与技巧
Ribbon框架为微服务架构中的客户端负载均衡提供了强大的支持。通过简单的配置和集成,开发者可以轻松地在应用中实现服务的发现、选择和负载均衡。适当地使用Ribbon,配合其他Spring Cloud组件,可以有效提升微服务架构的可用性和性能。
96 0
IP负载均衡技术
【8月更文挑战第17天】IP负载均衡技术
110 4
微服务之客户端负载均衡
微服务中的客户端负载均衡是指将负载(即工作任务或访问请求)在客户端进行分配,以决定由哪个服务实例来处理这些请求。这种负载均衡方式与服务端负载均衡相对,后者是在服务端(如服务器或负载均衡器)进行请求的分发。
166 5
如何在集群的负载均衡过程保留请求源IP
本文探讨了在Kubernetes (k8s)集群中如何确保服务获取到请求的源IP。通常,源IP可能会因网络地址转换(NAT)和代理服务器而丢失。为保留源IP,文章建议在代理服务器层添加HTTP头`X-REAL-IP`字段。在K8s中,通过设置`externalTrafficPolicy: Local`可保留源IP,但这会牺牲负载均衡。使用Ingress时,可通过配置Ingress Controller的`use-forwarded-headers`并调整ConfigMap来同时保留源IP和实现负载均衡。文章适用于对网络和K8s感兴趣的读者。
220 3
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
Redis系列学习文章分享---第十四篇(Redis多级缓存--封装Http请求+向tomcat发送http请求+根据商品id对tomcat集群负载均衡)
114 1
消息队列 MQ使用问题之如何在grpc客户端中设置负载均衡器
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
Java一分钟之-Spring Cloud Netflix Ribbon:客户端负载均衡
【6月更文挑战第9天】Spring Cloud Netflix Ribbon是客户端负载均衡器,用于服务间的智能路由。本文介绍了Ribbon的基本概念、快速入门步骤,包括添加依赖、配置服务调用和使用RestTemplate。此外,还讨论了常见问题,如服务实例选择不均、超时和重试设置不当、服务列表更新不及时,并提供了相应的解决策略。最后,展示了如何自定义负载均衡策略。理解并正确使用Ribbon能提升微服务架构的稳定性和效率。
334 3
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等