Nginx DOS 攻击防护教程

如果你的 Web 服务器直接暴露于互联网,那么最好启用某种拒绝服务保护。

Nginx 本身无法防御更复杂的分布式 DOS 攻击(这需要 CDN),但这并不妨碍采取一些基本DOS保护措施,这也很容易设置。

连接限制

这是一种敏感的预防措施,可以避免来自单个 IP 的过多连接,并且它是抵御微不足道的 DOS 攻击的第一道防线(即一个简单的脚本从具有 1 个 IP 的 1 个服务器淹没我们的后端)

limit_conn_zone $binary_remote_address zone=addr:10m;
limit_conn servers 1000;

这个简单的代码片段强制规定每个 IP 在任何时候最多可以有 1000 个连接。

10 MB (10m) 将为我们提供足够的空间来存储 160k 请求的历史记录

1000,如果有必要,可以调整和降低限制,始终考虑到我们的客户端可能位于代理后面,并且许多连接可能会从很少的 IP 访问我们的服务器

速率限制

速率限制的工作原理与连接限制非常相似,但从单个 IP 地址每秒接受多少个请求的角度来看

limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
limit_req zone=one burst=10;
limit_req_status 503;  # default value anyway

在这个例子中:

允许来自 1 个 IP 地址的每秒 5 个请求。\
在 5 到 10 个请求/秒之间,所有新传入请求都会延迟。\
每秒超过 10 个请求,所有新传入请求均被拒绝,状态代码设置为limit_req_status\
或者我们可以添加nodelay选项

limit_req zone=one burst=10 nodelay;\
以便在 5 到 10 个请求/秒之间,所有新传入请求都会尽可能快地得到服务,从而形成burst(10 个请求/秒)硬限制和软限制,在此之后请求将被拒绝

带宽限制

带宽限制在 Amazon EC2 等带宽受限的环境中特别有用,在这种环境中,带宽耗尽会导致所有流量几乎停止(即您的后端离线)

limit_rate 50k;
limit_rate_after 500k;

使用 Nginx,我们只能在第一个 500kb 服务完成后将带宽限制为 50kb/秒,以便 Web 服务器有选择地减慢对大负载的请求,同时允许全速处理其他请求

缓存

最后但并非最不重要的一点是,缓存是通过利用 Nginx 提供的超级优化缓存层来为应用程序增加弹性的最有效方法,该层可以轻松地为小负载提供每秒数千个请求的服务

如果您还没有设置缓存,那么您应该这样做。