Nginx如何防止流量攻击

本文介绍如何使用Nginx实现单IP限流,包括配置限流区、连接区及错误页面,有效防止CC攻击,确保服务器稳定运行。

使用场景
最近,报告查询系统负载均衡集群相关配置已经完成,两种实现方式分别是基于Ehcache和Redis的session管理策略。

大家都知道服务器资源有限的,但是客户端来的请求是无限的(不排除恶意攻击), 为了保证大部分的请求能够正常响应,不得不放弃一些客户端来的请求,所以我们会采用Nginx的限流操作, 这种操作可以很大程度上缓解服务器的压力, 使其他正常的请求能够得到正常响应。

如何使用Nginx实现基本的限流,比如单个IP限制每秒访问50次。通过Nginx限流模块,我们可以设置一旦并发连接数超过我们的设置,将返回503错误给客户端。这样可以非常有效的防止CC攻击。再配合 iptables防火墙,基本上CC攻击就可以无视了。

如何使用

conf配置
#统一在http域中进行配置
#限制请求
limit_req_zone $binary_remote_addr $uri zone=api_read:20m rate=50r/s;
#按ip配置一个连接 zone
limit_conn_zone $binary_remote_addr zone=perip_conn:10m;
#按server配置一个连接 zone
limit_conn_zone $server_name zone=perserver_conn:100m;
server {
        listen       80;
        server_name  report.52itstyle.com;
        index login.jsp;
        location / {
              #请求限流排队通过 burst默认是0
              limit_req zone=api_read burst=5;
              #连接数限制,每个IP并发请求为2
              limit_conn perip_conn 2;
              #服务所限制的连接数(即限制了该server并发连接数量)
              limit_conn perserver_conn 1000;
              #连接限速
              limit_rate 100k;
              proxy_pass      http://report;
        }
}
upstream report {
        fair;
        server  172.16.1.120:8882 weight=1  max_fails=2 fail_timeout=30s;
        server  172.16.1.120:8881 weight=1  max_fails=2 fail_timeout=30s;
}
配置503错误
默认情况,超出限制额度,将会报503错误,提示:

503 Service Temporarily Unavailable

The server is temporarily unable to service your request due to maintenance downtime or capacity problems. Please try again later. Sorry for the inconvenience.
Please report this message and include the following information to us.
Thank you very much!
这样显示没毛病,但是不够友好,这里我们自定义503错误。

error_page   500 502 503 504  /50x.html;
location = /50x.html {
    root   html;#自定义50X错误
}

配置说明
limit_conn_zone

是针对每个IP定义一个存储session状态的容器。这个示例中定义了一个100m的容器,按照32bytes/session,可以处理3200000个session。

limit_rate 300k;

对每个连接限速300k. 注意,这里是对连接限速,而不是对IP限速。如果一个IP允许两个并发连接,那么这个IP就是限速limit_rate×2。

burst=5;

这相当于在检查站req旁边放5个座位。如果某个请求当时超过速度限制被拦了,请他在空座位上坐着,等排队,如果检查站空了,就可以通过。如果连座位都坐满了,那就抱歉了,请求直接退回,客户端得到一个服务器忙的响应。所以说burst跟request_rate一点关系都没有,设成10000,就是1万个请求可以等着排队,而检查站还是1秒钟放行5个请求(龟速)。而且也不能一直排队,所以nginx还设了超时,排队超过一定时间,也是直接退回,返回服务器忙的响应。

以上配置Nginx需要配置以下模块:
ngx_http_limit_conn_module (static)
ngx_http_limit_req_module (static)

执行命令 nginx -V 就可以检查到是否有安装。

小结
限流的目的就是防止恶意请求流量,恶意攻击,或者防止流量超出系统峰值。

实现方案有很多,Nginx的limit模块只是其中一个思路。对于恶意请求流量,限制访问到cache层或者对于恶意ip使用nginx deny进行屏蔽。

### Spring Boot 中防止 DDoS 攻击的最佳实践 在现代分布式系统架构中,保护应用程序免受恶意流量攻击至关重要。Spring Boot 提供了多种机制来增强应用的安全性和稳定性。以下是一些针对 DDoS 攻击的有效防护措施: #### 1. **使用限流技术** 通过限制单个 IP 或用户的请求频率,可以有效缓解 DDoS 攻击的影响。常用的工具和技术包括 Resilience4j 和 Redis。 - 使用 Resilience4j 的 RateLimiter 组件实现基于时间窗口的速率控制[^1]。 ```java import io.github.resilience4j.ratelimiter.RateLimiter; import io.github.resilience4j.ratelimiter.RequestNotPermitted; public class RateLimitService { private final RateLimiter rateLimiter; public RateLimitService(RateLimiter rateLimiter) { this.rateLimiter = rateLimiter; } public void performOperation() { try { rateLimiter.acquirePermission(); // 执行业务逻辑 } catch (RequestNotPermitted e) { throw new RuntimeException("Rate limit exceeded", e); } } } ``` - 利用 Redis 实现分布式的令牌桶算法,适用于多实例部署环境下的统一限流策略[^2]。 --- #### 2. **配置 Zuul 进行网关级别的防护** Zuul 是 Netflix 开发的一个 API 网关组件,在微服务架构中常用于处理入口流量管理。可以通过自定义过滤器实现对异常流量的检测和阻断。 - 下面是一个简单的 ZuulFilter 示例,展示如何拦截并拒绝超出阈值的请求: ```java import com.netflix.zuul.ZuulFilter; import com.netflix.zuul.context.RequestContext; import org.springframework.stereotype.Component; @Component public class DdosPreventionFilter extends ZuulFilter { @Override public String filterType() { return "pre"; } @Override public int filterOrder() { return 1; } @Override public boolean shouldFilter() { return true; } @Override public Object run() { RequestContext ctx = RequestContext.getCurrentContext(); // 获取客户端IP地址 String clientIp = getClientIpAddress(ctx.getRequest()); // 假设有一个方法判断当前IP是否被标记为高风险 if (isHighRiskClient(clientIp)) { ctx.setSendZuulResponse(false); // 不转发到下游服务 ctx.getResponse().setContentType("application/json"); ctx.setResponseBody("{\"error\":\"Too many requests\"}"); ctx.setResponseStatusCode(429); // HTTP状态码: Too Many Requests } return null; } private String getClientIpAddress(javax.servlet.http.HttpServletRequest request) { String ip = request.getHeader("X-FORWARDED-FOR"); if (ip == null || ip.isEmpty()) { ip = request.getRemoteAddr(); } return ip; } private boolean isHighRiskClient(String ipAddress) { // 自定义逻辑:查询Redis或其他存储以确认该IP是否有过多访问记录 return false; // 替换为实际实现 } } ``` --- #### 3. **启用 Web 应用防火墙(WAF)功能** Web 应用程序防火墙能够识别潜在威胁模式并对可疑行为发出警告甚至阻止其继续执行。虽然这不是原生支持于 Spring Boot 内部的功能模块,但可通过集成第三方中间件完成此目标。 例如,借助 ModSecurity 结合 Nginx 来构建 WAF 层次结构;或者直接采用云服务商提供的托管型解决方案如 AWS Shield Advanced、Google Cloud Armor 等产品作为外部防御屏障。 --- #### 4. **优化数据库连接池设置与缓存策略** 当遭遇大规模并发请求时,合理调整 JDBC 数据源参数以及引入高效的内存级数据共享方案同样重要。比如 HikariCP 能够显著提升性能表现的同时降低资源消耗水平;而 Ehcache/Redis 缓存则可减少重复计算开销从而减轻服务器负载压力。 --- #### 5. **日志监控与报警机制建设** 最后一步也是至关重要的环节——实时跟踪系统运行状况以便及时发现任何不寻常活动迹象。推荐利用 ELK Stack (Elasticsearch, Logstash, Kibana)、Prometheus + Grafana 等开源项目搭建可视化运维平台,并设定合理的告警规则提醒管理员注意可能存在的安全隐患问题。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值