2025年最后一篇文章 总结的是之前快手发生的事情
image

就技术层面 我想到使用简单的案例验证模拟 正好复习之前的知识点 我第一想到的也是gateway网关防范
但为啥还是大量DDos攻击顶不住
Screenshot 2025-12-24 172624
image

搭配gpt配合学习仿照模拟一个小案例

技术点
image

项目使用trae直接构建好初始项目 不用再自己一个一个搭建了
Screenshot 2025-12-24 193420

首先是模拟普通业务 登录服务模块

@RestController
public class RegisterController {
    @PostMapping("/register")
    public String register(@RequestParam("phone") String phone) {
        return "register success : " + phone;
    }
}

重点理解是gateway网关

配置文件:
server:
  port: 8080
spring:
  application:
    name: gateway
  cloud:
    gateway:
      routes:
        - id: register-service
          uri: http://localhost:8081
          predicates:
            - Path=/register/**
  data:
    redis:
      host: localhost
      port: 6379

上面这个之前学习springcloud总结过

核心是lua即如何过滤


@Component
public class LuaRateLimitFilter implements GlobalFilter, Ordered {
    private static final String LUA_SCRIPT =
            "local current = redis.call('INCR', KEYS[1]) " +
                    "if tonumber(current) == 1 then " +
                    " redis.call('EXPIRE', KEYS[1], ARGV[1]) " +
                    "end " +
                    "if tonumber(current) > tonumber(ARGV[2]) then " +
                    " return 0 " +
                    "end " +
                    "return 1";
    private final ReactiveStringRedisTemplate redisTemplate;
    private final RedisScript<Long> redisScript;
    public LuaRateLimitFilter(ReactiveStringRedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
        this.redisScript = RedisScript.of(LUA_SCRIPT, Long.class);
    }
    @Override
    public Mono<Void> filter(ServerWebExchange exchange,
                             GatewayFilterChain chain) {
        String ip = exchange.getRequest()
                .getRemoteAddress()
                .getAddress()
                .getHostAddress();
        String path = exchange.getRequest().getURI().getPath();
        String key = "rate:" + ip + ":" + path;
        return redisTemplate.execute(
                        redisScript,
                        Collections.singletonList(key),
                        Arrays.asList("1", "5")
                ).single()
                .flatMap(result -> {
                    if (result != null && result == 1L) {
                        return chain.filter(exchange);
                    }
                    exchange.getResponse()
                            .setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
                    return exchange.getResponse().setComplete();
                });
    }
    @Override
    public int getOrder() {
        return -100;
    }
}

同一个 IP 访问同一个接口,1 秒内最多 5 次,超了直接 429

测试验证 使用jmeter

image
image

我们先攻击8080直接绕过gateway

前面还能成功
image

其实会一直灌入 因为没有拦截 但本人机器的端口数量有限 所以出现如下错误
image

我理解的就是大量攻击 导致系统资源耗尽 成了一个fw 那不是随便怎么搞都行吗

然后启动gateway防护

我们会看到429 将其防范
image

参考:GPT学习
文件文档同步gitee:https://gitee.com/gao-yuan187/fang
代码同步到gitee:https://gitee.com/gao-yuan187/DDos_Test
2026年见

posted on 2025-12-30 16:04  蒸饺  阅读(2)  评论(0)    收藏  举报