SpringCloudGateWay和Sentinel结合做黑白名单来源控制

假设我们的分布式项目,admin是8087,gateway是8088,consumer是8086

我们一般的思路是我们的请求必须经过我们的网关8088然后网关转发到我们的分布式项目,那我要是没有处理我们绕过网关直接访问项目8087和8086不也是可以?

所以我们会有个黑白名单来源控制来对这种特殊情况做处理

不用sentinel的做法

我们在网关那在转发请求的时候+一个请求头,请求头的值固定

然后这个请求头相当于密钥我们不会对外暴露,然后在java代码的拦截器中我们拦截请求判断这个请求头是否和配置一样

优点:简单

缺点:我们要是请求头泄漏,我们发起请求的时候可以伪造请求头这样子我们仍然能跨网关访问

用Sentinel的做法

sentinel+请求头判断来源做法

控制调用方

把我们的调用方分为白名单和黑名单

我们要的名称其实是origin

RequestOriginParser接口

我们的sentinel是通过这个接口里的parseOrigin()这个方法,来获取请求的来源的

这个方法的作用就是,从我们的request对象中解析出我们的origin的值

可惜,默认情况下这个方法返回的结果是default

如果不为空,那我们就把我们的origin作为请求头返回

如果浏览器获得的origin头和网关获取的请求头不一样,那他们的来源名称就不一样

这样子我们就可以来编写我们的规则了

区分请求是否经过网关

然后我们的网关有一个过滤器

请求头的名字是origin,然后值是gateway

这样我们从网关过来的就有请求头,然后不是从网关过来的就没有请求头

之前如果我们知道正确的url,我们甚至可以绕过网关进行访问,这样子一点都不安全


实现步骤

连接RequestOriginParser接口

然后我们把它注册成一个bean

为网关添加过滤器

看到没,我们网关配置的请求头的origin的值是gateway

总结

我们的sentinel是用这个方法来获取我们的请求来源的

你看我们的返回值是String,我们就通过这个String来判断我们的请求来源

我们默认请求头有origin这个参数

因为我们配置从网关来的,我们的origin的参数时gateway

添加授权

我们刚刚的那个方法返回的参数,就是我们的来源的名称

然后填写我们的来源名称

我们用8088端口绕过网关,发现不行


sentinel限制IP做法

  • 在业务服务中配置 Sentinel 的 IP 限制规则,只允许网关的 IP 访问。

  • 这种方式适用于网关和服务部署在同一内网环境的情况。

实现步骤

  1. 获取网关的 IP

    • 假设网关的 IP 是 192.168.1.100
  2. 配置 Sentinel 规则

    • 在业务服务中配置 Sentinel 的白名单规则只允许网关的 IP 访问

      import com.alibaba.csp.sentinel.slots.block.RuleConstant;
      import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRule;
      import com.alibaba.csp.sentinel.slots.block.authority.AuthorityRuleManager;
      import org.springframework.context.annotation.Configuration;
      
      import javax.annotation.PostConstruct;
      import java.util.Collections;
      
      @Configuration
      public class SentinelAuthorityRuleConfig {
      
          /**
           * 配置 Sentinel 的 IP 白名单规则
           */
          @PostConstruct
          public void initAuthorityRule() {
              // 创建 AuthorityRule 规则
              AuthorityRule rule = new AuthorityRule();
              rule.setResource("gateway_ip_whitelist"); // 资源名称
              rule.setStrategy(RuleConstant.AUTHORITY_WHITE); // 白名单模式
              rule.setLimitApp("192.168.1.100"); // 只允许 Gateway 的 IP 访问
      
              // 加载规则
              AuthorityRuleManager.loadRules(Collections.singletonList(rule));
          }
      }
      

3.业务服务层

  • 在业务服务中启用 Sentinel 的流控功能,确保只有网关的请求可以通过

Gateway 的 IP

  • 情况说明:如果 Gateway 没有进行特殊的配置来传递客户端 IP 信息,那么后端服务接收到的请求中的 IP 地址通常是 Gateway 的 IP 地址。
  • 实现方式:这是比较常见的默认情况,例如一些简单的网络代理服务器在转发请求时,如果没有专门设置修改请求头中的 IP 相关信息,后端服务器就只能看到代理服务器(即 Gateway)的 IP 地址,因为在网络数据包传输过程中,源 IP 地址会被替换为 Gateway 的出口 IP 地址。

如果我们要保留之前的客户端请求的IP,我们要在Gateway做额外处理

相关推荐
程序猿零零漆8 小时前
SpringCloud系列教程:微服务的未来(十八)雪崩问题、服务保护方案、Sentinel快速入门
spring cloud·微服务·sentinel
Forest 森林18 小时前
【微服务与分布式实践】探索 Sentinel
sentinel
kerwin_code3 天前
Sentinel 控制台集成 Nacos 实现规则配置双向同步和持久化存储(提供改造后源码)
java·sentinel
kerwin_code5 天前
SpringCloudAlibaba 服务保护 Sentinel 项目集成实践
java·sentinel
ChinaRainbowSea6 天前
10. SpringCloud Alibaba Sentinel 规则持久化部署详细剖析
java·spring·spring cloud·sentinel·负载均衡
等一场春雨6 天前
Alibaba Spring Cloud 十七 Sentinel熔断降级
spring·spring cloud·sentinel
kerwin_code8 天前
SpringCloud Gateway 集成 Sentinel 详解 及实现动态监听Nacos规则配置实时更新流控规则
spring cloud·gateway·sentinel
ps酷教程9 天前
sentinel微服务保护
微服务·架构·sentinel
Icoolkj9 天前
微服务学习-Sentinel 限流保护服务
学习·微服务·sentinel