Bloccare Ip da Stati non desiderati tramite nginx

Gestione del web server nginx tramite geoip database per il blocco o ban di indirizzi ip provenienti da Stati non desiderati.

Tags: nginx ban ip country

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
  • .git
  • 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_timeout65;
    types_hash_max_size2048;
    # 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 $exclusions1;
    }
    if($allowed_country = no){
        return444;
    }

Riavviamonginxcon

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"4440"-""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.