现在很多服务都部署到阿里云上,免不了使用SLB做负载均衡,然后又通过了nginx等代理。如果这个时候你想获取客户端访问的真实ip,你会发现一直拿到的是127.0.0.1 下面一起来解决这个问题。
现在来解决一下:
首先:配置一下SLB监听。确定获取真实IP已经开启,一般默认都是开启的,如图:
二、配置nginx转发ip信息,基本都有这段配置:
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
三、重点,配置spring boot工程tomcat的ip过滤配置,主要增加最后一行, `"100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}"`, 这是 阿里云SLB对内地址段,否则默认的是没有的,这样则会被认为是对内地址,SLB 对内地址不在`"100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}"`中,则就获取不到了。
有两种配置方式,任选一种即可解决问题:
第一种最简单,直接在 spring boot 工程的application.properties工程中添加:
#配置获取客户端真实IP。这里因为通过阿里云SLB代理,所以要额外配置一下
server.tomcat.protocolHeader=X-Forwarded-Proto
server.tomcat.internalProxies=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}|100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}
第二种:添加一个配置类:
/*
* 文件名:RemoteIpConfig.java 版权:Copyright by gogym 描述: 修改人:gogym 修改时间:2018年12月18日 跟踪单号: 修改单号:
* 修改内容:
*/
package com.open.configuration;
import org.apache.catalina.filters.RemoteIpFilter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
// @Configuration
public class RemoteIpConfig
{
// 配置获取客户端真实IP。这里因为通过阿里云SLB代理,所以要额外配置一下,不在这里配置,通过配置文件指定也是可以的
String internalProxyPattern = "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}|100\\.10[0-9]{1}\\.\\d{1,3}\\.\\d{1,3}";
@Bean
public RemoteIpFilter remoteIpFilter()
{
RemoteIpFilter ipFilter = new RemoteIpFilter();
ipFilter.setProtocolHeader("X-Forwarded-Proto");
ipFilter.setInternalProxies(internalProxyPattern);
return ipFilter;
}
}
完