Spring Cloud Gateway 是一个基于 Spring WebFlux 的非阻塞 API 网关,用于构建微服务架构中的网关服务。它可以用来路由请求、过滤请求和响应、限流等。
按 IP 限制是网关层常见的安全措施之一,可以防止恶意攻击或滥用服务。Spring Cloud Gateway 提供了多种方式来实现 IP 限制。
Spring Cloud Gateway 可以通过自定义过滤器(Filter)来实现 IP 限制。以下是一个简单的示例,展示如何实现 IP 白名单限制:
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.List;
@Component
public class IPWhitelistFilter implements GlobalFilter, Ordered {
private final List<String> whitelist = List.of("192.168.1.1", "192.168.1.2");
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String clientIp = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
if (!whitelist.contains(clientIp)) {
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);
}
@Override
public int getOrder() {
return 0;
}
}
原因:在某些情况下,客户端的 IP 地址可能被代理或负载均衡器修改。
解决方法:使用 X-Forwarded-For
头部来获取真实的客户端 IP 地址。
String clientIp = exchange.getRequest().getHeaders().getFirst("X-Forwarded-For");
if (clientIp == null || clientIp.isEmpty()) {
clientIp = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress();
}
原因:手动配置 IP 白名单或黑名单可能会比较繁琐,尤其是在动态变化的情况下。
解决方法:使用配置中心(如 Spring Cloud Config)来动态管理 IP 限制规则。
spring:
cloud:
gateway:
routes:
- id: service_route
uri: lb://service
predicates:
- Path=/service/**
filters:
- name: IPWhitelist
args:
whitelist: ${ip.whitelist}
然后在配置中心中管理 ip.whitelist
的值。
通过以上方法,你可以有效地按 IP 限制 Spring Cloud Gateway 的访问,提升系统的安全性和稳定性。