Com limitar l'amplada de banda de xarxa al servidor web NGINX


Anteriorment, a la nostra sèrie de controls de seguretat i gestió de trànsit NGINX, hem parlat de com limitar la taxa de sol·licituds (limitar la velocitat a la qual un client pot fer sol·licituds) per als vostres recursos web.

Per assegurar-vos que l'ample de banda d'ús de l'aplicació no es gasta per un sol client, heu de controlar les velocitats de càrrega i descàrrega per client. Aquest és un control de seguretat comú de NGINX contra atacs DoS (Denegació de servei) d'usuaris maliciosos que només intenten abusar del rendiment del lloc.

En aquesta tercera part de la sèrie, explicarem com limitar l'amplada de banda de la xarxa al servidor web NGINX.

Limitació de l'amplada de banda a NGINX

Per limitar l'amplada de banda a NGINX, utilitzeu la directiva limit_rate que limita la velocitat de transmissió de resposta a un client. És vàlid a la declaració HTTP, servidor, ubicació i if dins d'un bloc d'ubicació, i de manera predeterminada especifica el límit de velocitat per a un context determinat en bytes per segon. També podeu utilitzar m per megabytes o g per gigabytes.

limit_rate 20k;

Una altra directiva relacionada és limit_rate_after, que especifica que la connexió no s'ha de limitar a la velocitat fins que s'hagi transferit una quantitat especificada de dades. Aquesta directiva es pot establir a l'HTTP, el servidor, la ubicació i la declaració \if dins d'un bloc d'ubicació.

limit_rate_after 500k;

Aquí teniu un exemple de configuració per limitar un client a descarregar contingut mitjançant una única connexió a una velocitat màxima de 20 kilobytes per segon.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       
   }
   location /documents {
        limit_rate 20k;
        limit_rate_after 500k;  
}
}

Un cop hàgiu afegit la configuració necessària explicada anteriorment, deseu els canvis i tanqueu el fitxer. Després, comproveu si la sintaxi de configuració de NGINX és correcta, així:

$ sudo nginx -t

Si tot està bé, torneu a carregar el servei NGINX per fer els darrers canvis:

$ sudo systemctl reload nginx

Limitació de l'amplada de banda i el nombre de connexions a NGINX

Amb la configuració anterior, el client pot obrir diverses connexions per augmentar l'ample de banda. Per tant, a més, també podeu limitar les connexions per client mitjançant un paràmetre com ara una adreça IP com hem vist abans.

Per exemple, podeu limitar una connexió per adreça IP.

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;
limit_conn_status 429;

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        limit_conn   limitconnbyaddr  5;

        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";

       
   }
   location  /documents {
        limit_rate 50k;
        limit_rate_after 500k;  
        limit_conn   limitconnbyaddr  1;
}
}

Limitació de l'amplada de banda dinàmicament a NGINX

Com a valor de paràmetre de la directiva limit_rate, podeu especificar variables per limitar dinàmicament l'amplada de banda. És especialment útil en situacions en què la taxa ha de ser limitada en funció d'una determinada condició.

En aquest exemple, estem utilitzant el bloc de mapa. Us va permetre crear una variable nova el valor de la qual depèn dels valors d'una o més de les variables originals ($slow i $limit_rate) especificades al primer paràmetre.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $slow $limit_rate {
    1     20k;
    2     30k;
}

server {
    listen 80;
    server_name testapp.linux-console.net;
    root /var/www/html/testapp.linux-console.net/build;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html =404 =403 =500;
    }
    location /api {
        proxy_pass http://api_service;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
   }
   location /documents {
        limit_rate $limit_rate;
        limit_rate_after 500k;
}
}

Aquí hi ha un altre exemple de configuració de mostra per il·lustrar la limitació dinàmica de l'ample de banda a NGINX. Aquesta configuració permet a NGINX limitar l'amplada de banda en funció de la versió TLS. La directiva limit_rate_after 512 implica la taxa límit després d'haver enviat les capçaleres.

upstream api_service {
    server 10.1.1.10:9051;
    server 10.1.1.77:9052;
}

map $ssl_protocol $response_rate {
    "TLSv1.1" 50k;
    "TLSv1.2" 100k;
    "TLSv1.3" 500k;
}

server {
    listen 443 ssl;
    ssl_protocols       TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate     /etc/ssl/testapp.crt;
    ssl_certificate_key   /etc/ssl/testapp.key;

    location / {
        limit_rate       $response_rate; # Limit bandwidth based on TLS version
        limit_rate_after 512;
        proxy_pass       http://api_service;
    }
}

Això és tot el que teníem per a tu en aquesta part de la sèrie. Continuarem cobrint més temes relacionats amb la gestió del trànsit i els controls de seguretat de NGINX. Però, com és habitual, podeu fer preguntes o compartir els vostres pensaments sobre aquesta guia mitjançant el formulari de comentaris a continuació.

Referència: guia de controls de seguretat al lloc web de NGINX.