Come impostare il limite in nginx, ma includere / escludere determinati indirizzi IP?

Sono in grado di utilizzare limit_req per valutare-limite tutte le richieste al mio server.

Tuttavia, vorrei rimuovere la restrizione di tasso per alcuni indirizzi IP (ovvero whitelist) e utilizzare una restrizione di tasso diversa per alcuni altri (ovvero alcuni IP che vorrei come 1r / s).

Ho provato a utilizzare condizionali (ad esempio, if ( $remote_addr = "1.2.3.4" ) {} ) ma che sembra funzionare solo con le regole di riscrittura, non per le regole di limitazione del tasso.

  • Letsencrypt recupero get - errore remoto: tls: handshake failure
  • nginx include fastcgi_params ordine
  • Ottimizzazione del webserver
  • 'Nessun file di input specificato' - NginX / fcgi - quando si richiede un file .php inesistente
  • PHP in alias della directory NGINX non funziona
  • Il procuratore inverso di nginx rallenta la mia produttività per metà
  • Nginx include file di configuration non in ordine?
  • Nginx HttpGeoIPModule con X_Forwarded e HAProxy
  • 2 Solutions collect form web for “Come impostare il limite in nginx, ma includere / escludere determinati indirizzi IP?”

    È meglio evitare di usare la direttiva "se". Quando la chiave in limite_req_zone (e limit_conn_zone) è vuota, i limiti non vengono applicati. È ansible utilizzare questo in combinazione con la mappa e i moduli geo per creare un elenco di IP in cui i limiti di farfalla non vengono applicati.

    Questo esempio mostra come configurare un limite per le richieste simultanee e la velocità di richiesta da un singolo IP.

     http { geo $whitelist { default 0; # CIDR in the list below are not limited 1.2.3.0/24 1; 9.10.11.12/32 1; 127.0.0.1/32 1; } map $whitelist $limit { 0 $binary_remote_addr; 1 ""; } # The directives below limit concurrent connections from a # non-whitelisted IP address to five limit_conn_zone $limit zone=connlimit:10m; limit_conn connlimit 5; limit_conn_log_level warn; # logging level when threshold exceeded limit_conn_status 503; # the error code to return # The code below limits the number requests from a non-whitelisted IP # to one every two seconds with up to 3 requests per IP delayed # until the average time between responses reaches the threshold. # Further requests over and above this limit will result # in an immediate 503 error. limit_req_zone $limit zone=one:10m rate=30r/m; limit_req zone=one burst=3; limit_req_log_level warn; limit_req_status 503; 

    Le direttive di zona devono essere collocate a livello di http, tuttavia le altre direttive possono essere posizionate più in basso, ad esempio nel server o nel livello di localizzazione per limitarne la portta o addirittura adattare i limiti.

    Per ulteriori informazioni consultare la documentazione nginx ngx_http_limit_req_module e ngx_http_limit_conn_module

    È ansible utilizzare in modo sicuro le posizioni denominate, ad esempio "@location" in un block if ().

    Vedi: http://wiki.nginx.org/IfIsEvil

    Qualcosa di simile dovrebbe funzionare:

     http { limit_req_zone $binary_remote_addr zone=delay:10m rate=1r/m; server { ... error_page 410 = @slowdown; if( $remote_addr != "1.2.3.4" ) { return 410; } location @slowdown { limit_req zone=delay burst 5; ... } location / { ... } } 

    Compilare "location @slowdown {}" con le stesse informazioni di "location / {}, ad esempio proxy_pass se si utilizza nginx come proxy inverso.

    Suggerimenti per Linux e Windows Server, quali Ubuntu, Centos, Apache, Nginx, Debian e argomenti di rete.