跳到主要内容

Nginx 防DDoS攻击

介绍

分布式拒绝服务(DDoS)攻击是一种常见的网络攻击方式,攻击者通过大量的请求淹没目标服务器,使其无法正常响应合法用户的请求。Nginx作为一款高性能的Web服务器和反向代理服务器,可以通过一些配置来有效地防御DDoS攻击。

在本教程中,我们将逐步介绍如何使用Nginx来防御DDoS攻击,并通过实际案例展示这些配置的应用场景。

1. 限制请求速率

Nginx可以通过limit_req模块来限制客户端的请求速率,从而防止单个IP地址在短时间内发送过多的请求。

配置示例

nginx
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

server {
location / {
limit_req zone=one burst=5;
proxy_pass http://backend;
}
}
}

解释

  • limit_req_zone:定义一个共享内存区域来存储请求速率的状态。$binary_remote_addr表示客户端的IP地址,zone=one:10m表示分配10MB的内存来存储状态,rate=1r/s表示每秒允许1个请求。
  • limit_req:在特定的location中应用速率限制。zone=one表示使用之前定义的共享内存区域,burst=5表示允许突发5个请求。

实际案例

假设你的网站突然受到大量请求的攻击,通过上述配置,Nginx会自动限制每个IP地址的请求速率,确保服务器不会被过多的请求淹没。

2. 限制连接数

除了限制请求速率,Nginx还可以通过limit_conn模块来限制每个客户端的连接数。

配置示例

nginx
http {
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
location / {
limit_conn addr 10;
proxy_pass http://backend;
}
}
}

解释

  • limit_conn_zone:定义一个共享内存区域来存储连接数的状态。$binary_remote_addr表示客户端的IP地址,zone=addr:10m表示分配10MB的内存来存储状态。
  • limit_conn:在特定的location中应用连接数限制。addr表示使用之前定义的共享内存区域,10表示每个IP地址最多允许10个并发连接。

实际案例

如果你的服务器受到大量并发连接的攻击,通过上述配置,Nginx会自动限制每个IP地址的并发连接数,确保服务器资源不会被耗尽。

3. 使用Nginx缓存

Nginx的缓存功能可以帮助减轻服务器的负载,尤其是在面对大量请求时。

配置示例

nginx
http {
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;

server {
location / {
proxy_cache my_cache;
proxy_pass http://backend;
}
}
}

解释

  • proxy_cache_path:定义缓存路径和参数。/data/nginx/cache表示缓存文件的存储路径,levels=1:2表示目录结构,keys_zone=my_cache:10m表示分配10MB的内存来存储缓存键,max_size=10g表示缓存的最大大小为10GB,inactive=60m表示60分钟内未被访问的缓存将被删除。
  • proxy_cache:在特定的location中启用缓存。my_cache表示使用之前定义的缓存区域。

实际案例

当你的网站受到大量请求时,Nginx可以通过缓存静态内容来减少对后端服务器的请求,从而减轻服务器的负载。

4. 使用Nginx的ngx_http_limit_req_modulengx_http_limit_conn_module

Nginx的ngx_http_limit_req_modulengx_http_limit_conn_module模块可以帮助你更精细地控制请求速率和连接数。

配置示例

nginx
http {
limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;
limit_conn_zone $binary_remote_addr zone=addr:10m;

server {
location / {
limit_req zone=one burst=5;
limit_conn addr 10;
proxy_pass http://backend;
}
}
}

解释

  • limit_req_zonelimit_conn_zone:分别定义请求速率和连接数的共享内存区域。
  • limit_reqlimit_conn:在特定的location中应用请求速率和连接数限制。

实际案例

通过结合使用limit_reqlimit_conn,你可以更有效地防御DDoS攻击,确保服务器在高负载情况下仍能正常运行。

5. 使用Nginx的ngx_http_realip_module

Nginx的ngx_http_realip_module模块可以帮助你获取真实的客户端IP地址,尤其是在使用反向代理或负载均衡器时。

配置示例

nginx
http {
set_real_ip_from 192.168.1.0/24;
real_ip_header X-Forwarded-For;

server {
location / {
proxy_pass http://backend;
}
}
}

解释

  • set_real_ip_from:定义信任的IP地址范围。192.168.1.0/24表示信任192.168.1.0到192.168.1.255的IP地址。
  • real_ip_header:定义用于获取真实IP地址的HTTP头。X-Forwarded-For表示从X-Forwarded-For头中获取真实IP地址。

实际案例

当你的服务器位于反向代理或负载均衡器后面时,通过上述配置,Nginx可以获取真实的客户端IP地址,从而更准确地应用速率限制和连接数限制。

总结

通过合理配置Nginx,你可以有效地防御DDoS攻击,保护你的Web服务器免受恶意流量的影响。在本教程中,我们介绍了如何使用limit_reqlimit_conn、缓存和ngx_http_realip_module等模块来防御DDoS攻击。

附加资源

练习

  1. 在你的Nginx服务器上配置limit_reqlimit_conn,并测试其效果。
  2. 尝试使用Nginx的缓存功能来减轻服务器负载。
  3. 研究并配置ngx_http_realip_module,确保在反向代理环境下获取真实的客户端IP地址。

通过实践这些配置,你将能够更好地理解和应用Nginx的DDoS防御机制。