使用AspNetCoreRateLimit来控制网站并发访问量-博客改造计划【3】

背景

最近在检查后台的时候发现有很多不明IP频繁的扫描博客的后台路径,查了一下IP发现都是国外的IP,可能是被感染的肉鸡对我这个IP段批量进行扫描,虽然说扫站对我的危害性不大,但是扫描太频繁会导致后台带宽占用过高进而导致网站访问缓慢,而且过高的并发也会导致后台服务器崩溃,所以我打算给博客加上并发控制的限制。

AspNetCoreRateLimit

AspNetCoreRateLimit 是一种 ASP.NET Core 速率限制解决方案,旨在控制客户端可以根据 IP 地址或客户端 ID 向 Web API 或 MVC 应用程序发出的请求速率。AspNetCoreRateLimit 包包含一个 IpRateLimitMiddleware 和一个 ClientRateLimitMiddleware,对于每个中间件,您可以为不同的场景设置多个限制,例如允许 IP 或客户端在每秒、15 分钟等时间间隔内进行最大调用次数。您可以定义这些限制来解决对 API 发出的所有请求,或者您可以将限制范围限定为每个 API URL 或 HTTP 动词和路径。

官方网站:

 https://github.com/stefanprodan/AspNetCoreRateLimit

使用方法

首先通过Nuget安装AspNetCoreRateLimit

yyy

安装完成以后在startup.cs里面进行配置

public void ConfigureServices(IServiceCollection services)
{
	// needed to load configuration from appsettings.json
	services.AddOptions();

	// needed to store rate limit counters and ip rules
	services.AddMemoryCache();

	//load general configuration from appsettings.json
	services.Configure<IpRateLimitOptions>(Configuration.GetSection("IpRateLimiting"));

	//load ip rules from appsettings.json
	services.Configure<IpRateLimitPolicies>(Configuration.GetSection("IpRateLimitPolicies"));

	// inject counter and rules stores
	services.AddInMemoryRateLimiting();
        //services.AddDistributedRateLimiting<AsyncKeyLockProcessingStrategy>();
        //services.AddDistributedRateLimiting<RedisProcessingStrategy>();
        //services.AddRedisRateLimiting();

	// Add framework services.
	services.AddMvc();

        // configuration (resolvers, counter key builders)
        services.AddSingleton<IRateLimitConfiguration, RateLimitConfiguration>();
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
	app.UseIpRateLimiting();

	app.UseMvc();
}

在appsettings.json里面设置配置和限制规则

 "IpRateLimiting": {
    "EnableEndpointRateLimiting": false,
    "StackBlockedRequests": false,
    "RealIpHeader": "X-Real-IP",
    "ClientIdHeader": "X-ClientId",
    "HttpStatusCode": 429,
    "IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
    "GeneralRules": [
      {
        "Endpoint": "*",
        "Period": "1s",
        "Limit": 50
      }
    ]
  }

我这里是设置了同一个IP最高可以进行1秒50次并发访问,超过就会被系统封到黑名单里面。

验证

为了方便触发限制,我在本地把限制改成了1秒10次并发,并进行验证:

yyy

可以看到访问这张图片的时候超过了限制,返回了429

yyy

返回的信息也变成了API calls quota exceeded! maximum admitted 10 per 1s. 表面并发超过限制,被系统拦截了。


{{allCount}} 评论
{{item.nickName}}{{item.email}}{{item.webSiteUrl}}
{{item.createTime}}回复

{{item.content}}

{{item2.nickName}}{{item2.createTime}}

@{{item.nickName}} {{item2.content}}