Bloccare Ip da Stati non desiderati tramite nginx

Chi gestisce un server remoto nei log trova spesso tentativi di intrusione da parte di hacker o comunque persone che “smanettando” cercano accessi a funzionalità quali

  • phpmyadmin
  • sqlite
  • wp-admin
  • etc… etc…

Di solito utilizzano degli script che scansionano, indirizzi e porte e trovando accesso eseguono una serie di operazioni ripetute…
Questo non vuol dire che abbiano accesso ai nostri servizi… ma oltre ad essere fastidiosi, occupano banda effettuando accessi e richieste ripetute.
In genere tali tentativi provengono da stati quali Cina, Russia, India, Singapore etc…

Se i nostri servizi, non sono rivolti a tali stati è possibile bloccare l’accesso a indirizzi provenienti da un SET di stati indicati come non amici. Vediamo come.

Per prima cosa, dovremmo installare un database contenente la lista di indirizzi associati a stati (Country):

sudo apt-get install geoip-database-contrib -y

Fatto questo, all’interno del file di configurazione di nginx dovremmo aggiungere alcune regole. apriamo il file:

nano /etc/nginx/nginx.conf

ed aggiungiamo all’interno di http {… il codice presente dopo il commento ESCLUSIONE IP:

http {
        # Basic Settings
        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;
        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ### ESCLUSIONE IP #######################################
        geoip_country /usr/share/GeoIP/GeoIP.dat;
        map $geoip_country_code $allowed_country {
                    default no;
                    IT yes;
                    DE yes;
        }

In questo caso indichiamo l’esclusione di tutti gli indirizzi ad eccezione di quelli provenienti dall’Italia e dalla Germania. Abbiamo dato accesso solo ad alcuni Paesi desiderati.

Se invece volessimo escludere manualmente alcuni paesi dovremmo scrivere:

### ESCLUSIONE IP #######################################
        geoip_country /usr/share/GeoIP/GeoIP.dat;
        map $geoip_country_code $allowed_country {
                    default yes;
                    CN no;
                    RU no;
        }

In questo caso, abbiamo definito che tutte le richieste possono essere accolte (default yes) ad eccezione di quelle provenienti dalla Cina e dalla Russia.

Ora nel nostro file server di nginx dovremmo inserire le righe con la condizione if:

server {
    listen      80;
    server_name x.xxx.xxx.xxx;
    charset     utf-8;
    
    [...]
    if ($allowed_country = yes) {
        set $exclusions 1;
    }
    if ($allowed_country = no) {
        return 444;
    }

Riavviamo nginx con

systemctl restart nginx

A questo punto dovremmo essere pronti.

Escludendo ad esempio indirizzi provenienti dagli USA potrebbe capitare di trovare nei log una stringa di questo tipo:

66.249.93.6 - - [29/Jun/2018:10:46:13 +0200] "GET /manuale/ HTTP/1.1" 444 0 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36 Google Favicon"

Questo è il googlebot che ha tentato di accedere al manuale di un applicativo, ma si è visto ritornare un 444 dal server.

 

Bloccare Ip da Stati non desiderati tramite nginx

Potrebbe anche interessarti