Wéi Limitéiert d'Zuel vu Verbindungen (Ufroen) an NGINX


NGINX schéckt mat verschiddene Moduler fir Benotzer z'erméiglechen Traffic op hir Websäiten, Webapplikatiounen, wéi och aner Webressourcen ze kontrolléieren. Ee vun de Schlësselgrënn fir den Traffic oder den Zougang ze limitéieren ass Mëssbrauch oder Attacke vu bestëmmten Aarte wéi DoS (Denial of Service) Attacken ze vermeiden.

Et ginn dräi grouss Weeër fir d'Benotzung oder den Traffic am NGINX ze limitéieren:

  1. D'Zuel vun de Verbindungen (Ufroen) limitéieren.
  2. Den Taux vun Ufroen limitéieren.
  3. Bandbreed limitéieren.

Déi uewe genannte NGINX Traffic Management Approche, ofhängeg vum Benotzungsfall, kënne konfiguréiert ginn fir ze limitéieren baséiert op engem definéierte Schlëssel, am meeschte verbreet ass d'IP Adress vum Client. NGINX ënnerstëtzt och aner Variablen wéi e Sessiouns-Cookie a vill méi.

An dësem éischten Deel vun eiser Dräi-Deel Serie wäerte mir diskutéieren wéi Dir d'Zuel vun de Verbindungen an NGINX limitéiere kënnt fir Är Websäiten/Uwendungen ze schützen.

  • Wéi Limitéiert d'Zuel vu Verbindungen (Ufroen) an NGINX - Deel 1
  • Wéi Limitéiert een den Taux vu Verbindungen (Ufroen) an NGINX - Deel 2
  • Wéi Limitéiert d'Bandbreedungsverbrauch am NGINX - Deel 3

Denkt drun datt NGINX eng Verbindung betruecht fir ze limitéieren nëmmen wann et eng Ufro huet déi vum Server veraarbecht gëtt an de ganzen Ufro Header ass scho gelies. Dofir ginn net all Clientverbindunge gezielt.

Limitéiert Zuel vu Verbindungen an NGINX

Als éischt musst Dir eng gemeinsam Gedächtniszone definéieren déi Verbindungsmetriken fir verschidde Schlësselen späichert, mat der Limit_conn_zone Direktiv. Wéi virdru scho gesot, e Schlëssel kann en Text sinn, eng Variabel wéi d'Remote IP Adress vun engem Client, oder eng Kombinatioun vun deenen zwee.

Dës Direktiv, déi valabel ass am HTTP Kontext, hëlt zwee Parameteren: de Schlëssel an d'Zone (am Format zone_name: Gréisst).

limit_conn_zone $binary_remote_addr zone=limitconnbyaddr:20m;

Fir en Äntwertstatuscode ze setzen deen op refuséiert Ufroe zréckgeet, benotzt d'limit_conn_status Direktiv déi en HTTP-Statuscode als Parameter hëlt. Et ass valabel am HTTP-, Server- a Standortkontexter.

limit_conn_status 429;

Fir Verbindungen ze limitéieren, benotzt d'Limint_conn Direktiv fir d'Erënnerungszone ze setzen fir ze benotzen an déi maximal Unzuel vun erlaabte Verbindungen wéi an der folgender Konfiguratiounsschnëtt gewisen. Dës Direktiv ass valabel am HTTP-, Server- a Standortkontexter.

limit_conn   limitconnbyaddr  50;

Hei ass déi komplett Konfiguratioun:

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;

    limit_conn   limitconnbyaddr  50;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    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";
   }
}

Späichert d'Datei a maach se zou.

Da kontrolléiert ob d'NGINX Konfiguratioun gutt ass andeems Dir de folgende Kommando ausféiert:

$ sudo nginx -t

Als nächst lued den NGINX Service nei fir déi rezent Ännerungen auszeféieren:

$ sudo systemctl reload nginx

Iwwerpréift Nginx Connection Limit

Wann e Client d'maximal Unzuel vun erlaabte Verbindungen iwwerschreift, gëtt NGINX e 429 Ze vill Ufroen Feeler un de Client zréck a registréiert en Entrée wéi deen hei ënnen an der Fehlerlogdatei:

2022/03/15 00:14:00 [error] 597443#0: *127 limiting connections by zone "limitconnbyaddr", client: x.x.x.x, server: testapp.tecmimt.com, request: "GET /static/css/main.63fdefff.chunk.css.map HTTP/1.1", host: "testapp.tecmimt.com"

Limitéiert Nginx Zuel vu Verbindungen op d'Applikatioun

Dir kënnt och d'Zuel vun de Verbindunge fir e bestëmmte Server limitéieren andeems Dir d'$server_name Variabel benotzt:

upstream api_service {
    server 127.0.0.1:9051;
    server 10.1.1.77:9052;
}
limit_conn_zone $server_name zone=limitbyservers:10m;
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;

     limit_conn  limitbyservers  2000;

    #include snippets/error_pages.conf;
    proxy_read_timeout 600;
    proxy_connect_timeout 600;
    proxy_send_timeout 600;
    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";
   }
}

Dës Konfiguratioun erméiglecht NGINX fir d'total Unzuel u Verbindungen op de virtuelle Server ze limitéieren deen d'Applikatioun testapp.linux-console.net op 2000 Verbindungen dréit.

Bemierkung: Limitéieren vun Verbindungen op Basis vun engem Client seng IP huet en Nodeel. Dir kënnt eventuell Verbindunge fir méi wéi nëmmen ee Benotzer beschränken, besonnesch wa vill Benotzer, déi op Är Applikatioun zougräifen, um selwechten Netz sinn an hannert engem NAT operéieren - all hir Verbindunge kommen aus der selwechter IP Adress.

An esou engem Szenario kënnt Dir eng oder méi Variablen, déi am NGINX verfügbar sinn, benotzen, déi e Client um Applikatiounsniveau identifizéieren, e Beispill ass e Sessiouns-Cookie.

Dir kënnt och déi folgend Nginx-relatéiert Artikelen gär hunn:

  • Wéi eng Custom 404 Feeler Säit an NGINX erstellen
  • Wéi kontrolléiert den Zougang baséiert op Client IP Adress an NGINX
  • Wéi Cache Inhalt an NGINX
  • Wéi kënnt Dir HTTP/2.0 an Nginx aktivéieren
  • Wéi benotzt Dir Nginx als HTTP Load Balancer a Linux

Dat ass et fir elo! Am nächsten Deel vun dëser Serie wäerte mir eng aner nëtzlech Verkéiersverwaltungstechnik am NGINX diskutéieren - den Taux vun Ufroen limitéieren. Bleift bis dohin bei eis.