Blocca la Cina con iptables


10

Ho appena effettuato l'accesso su un server GitLab e ho notato che aveva 18.974 accessi non riusciti dall'ultima volta che ho controllato il server - quasi 5 giorni. Ho controllato l'IP e sembra che quasi tutti provenissero dalla Cina e abbiano cercato di ottenere l'accesso con SSH e Brute Force. Ho iniziato a bloccare alcuni IP, ma poi mi sono reso conto che è un'enorme perdita di tempo e un'idea migliore sarebbe quella di bloccare l'intero paese.

Esiste un modo per bloccare TUTTA la Cina o qualsiasi altro paese con iptables?

Ho trovato alcuni articoli su Internet ma quasi tutti sono script bash. Sono un principiante su Linux, quindi non capisco davvero tutti quegli script. Trovo iptables davvero interessante e voglio saperne di più.

Qualche idea ? Grazie!


4
Ho risolto lo stesso problema in modo diverso. Ho rafforzato SSH sul server GitLab del mio cliente disattivando la password e l'autenticazione basata su sfida e consenti l'accesso solo con chiavi SSL. Forse funzionerebbe nella tua situazione? Il blocco degli intervalli IP potrebbe ridurre il "rumore" ma non ti fornirà una protezione reale contro la forza bruta.
Blondenzo,

finora non ha funzionato. il server gitlab è ancora attivo e ho avuto 0 break-in. Gli accessi Ssh sono fatti solo con i tasti ssh e ho disabilitato il login root. È solo che voglio imparare iptables così male ..
Caranfil Alegzandru,

1
Puoi anche passare il tuo ssh a una porta non predefinita nel tuo router. Ciò ha portato i miei tentativi di attacco bot ssh da centinaia al giorno a zero.
Marmo organico

Risposte:


7

Usando iptables per identificare automaticamente, e successivamente bloccare, i cattivi per ssh possono essere fatti usando il recentmodulo. Il seguente segmento deve venire dopo la tua ESTABLISHED,RELATEDlinea generica :

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Ora, il recente (l'ultimo o due anni) problema con la Cina è che sono diventati molto intelligenti e molto spesso una volta bloccati da un indirizzo IP, passano semplicemente a un altro sulla stessa sottorete e continuano. Ciò comporta il rischio di rimanere a corto di voci recenti della tabella predefinite (penso che il valore predefinito sia 200). Lo controllo e quindi cerco il segmento IP effettivo e blocco in modo permanente l'intero segmento. Nel mio caso, non mi interessa il danno collaterale, cioè bloccare qualcuno innocente:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Dove sopra:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

È possibile ottenere l'intero elenco di indirizzi IP per la Cina, o qualsiasi paese, in iptables o in altro formato qui . Tuttavia l'elenco è sorprendentemente lungo e piuttosto dinamico. Io stesso, ho deciso di non bloccare l'intero elenco.


Questo ^! Potrebbe essere la migliore risposta che abbia mai ricevuto. Potrebbe essere una domanda stupida, ma immagino che tutte queste regole vadano in uno script bash, giusto? Ho ancora qualche problema a capire iptables ma lo trovo affascinante.
Caranfil Alegzandru,

Sì, utilizzo uno script bash. Alcuni, e ho anche usato anche io, usano un metodo di ripristino diretto di iptables, che è più veloce da caricare. Ho cambiato perché includo alcuni comandi non iptables nello stesso script.
Doug Smythies,

12

Blocco Cina con ipset

Non è possibile aggiungere manualmente alcune migliaia di indirizzi IP ai tuoi iptables e anche farlo automaticamente è una cattiva idea perché può causare un sacco di carico della CPU (o almeno così ho letto). Invece possiamo usare ipset che è progettato per questo genere di cose. ipset gestisce grandi elenchi di indirizzi IP; basta creare un elenco e quindi dire a iptables di usare quell'elenco in una regola.

Nota; Presumo che tutto quanto segue sia fatto come root. Regola di conseguenza se il tuo sistema è basato su sudo.

apt-get install ipset

Successivamente, ho scritto un piccolo script di Bash per fare tutto il lavoro, che dovresti essere in grado di capire dai commenti in esso. Crea un file:

nano /etc/block-china.sh

Ecco cosa vuoi incollare:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Salva il file. Renderlo eseguibile:

chmod +x /etc/block-china.sh

Questo non ha ancora fatto nulla, ma lo farà tra un minuto quando eseguiremo la sceneggiatura. Innanzitutto, dobbiamo aggiungere una regola in iptables che faccia riferimento a questo nuovo elenco ipset definito dallo script sopra:

nano /etc/iptables.firewall.rules

Aggiungi la seguente riga:

-A INPUT -p tcp -m set --match-set china src -j DROP

Salva il file. Per essere chiari, il mio completo iptables.firewall.rules ora assomiglia a questo:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

In questo momento, nulla è cambiato con il server perché non sono state applicate nuove regole; per fare ciò, eseguire lo script block-china.sh:

/etc/block-china.sh

Questo dovrebbe mostrare un po 'di output in quanto estrae un nuovo elenco di IP basati su cinese e quindi, dopo alcuni secondi, verrà completato e tornerà al prompt dei comandi.

Per verificare se ha funzionato, eseguire:

iptables -L

Ora dovresti vedere una nuova regola che blocca la Cina - l'output dovrebbe assomigliare a questo:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Quasi fatto! Funziona e continuerà a funzionare sui riavvii. Tuttavia, gli indirizzi IP cambiano e tale elenco diventerà obsoleto nel tempo. Se vuoi estrarre e applicare un elenco aggiornato di IP puoi semplicemente eseguire nuovamente lo script block-china.sh.

Possiamo anche impostare la macchina per farlo automaticamente tramite un processo cron:

crontab -e

Aggiungi una linea come questa:

* 5 * * * /etc/block-china.sh

Questo funzionerà /etc/block-china.sh ogni giorno alle 5:00. L'utente che esegue lo script dovrà essere root o avere i privilegi di root.

fonte


Perché limitarlo al solo protocollo tcp? Sembra funzionare senza specificare il protocollo. Suggerire di utilizzare gli elenchi aggregati più recenti, poiché sono molto più brevi:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies,

Non c'è nulla qui che ripristina l'ipset dopo il riavvio.
Doug Smythies il

4

Potresti voler installare qualcosa come fail2ban in modo che blocchi ips che tentano di accedere al tuo server e falliscono.


potrei anche usare il firewall CSF e bloccare tutti i paesi che desidero dai file di configurazione. Il fatto è che voglio davvero usare iptables in modo da poter saperne di più.
Caranfil Alegzandru,

Dovresti vedere quali paesi hanno quali blocchi di indirizzi IP assegnati loro per capire chi bloccare. Non sono sicuro se sarebbe super preciso o no. Puoi usare iptables -L per mostrare le attuali regole di iptables, iptables-save per mostrare quali comandi sono stati eseguiti per creare tali regole, quindi progettare le tue regole e testare usando le macchine di prova per saperne di più. È così che l'ho imparato.
Kyle H,

0

È possibile utilizzare il modulo geoip per iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Una volta aggiornato il nostro sistema e installate le dipendenze, ora installeremo i componenti aggiuntivi xtables nella nostra macchina. Per fare ciò, scaricheremo l'ultimo tarball dal sito ufficiale del progetto xtables-addons usando wget. Una volta scaricato, estrarremo il tarball, quindi lo compileremo e lo installeremo sul nostro computer.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Successivamente, eseguiremo un modulo chiamato xt_geoip che viene fornito con l'estensione xtables-addons che scarica il database GeoIP da MaxMind e lo converte in un modulo binario riconosciuto da xt_geoip. Una volta scaricato, lo costruiremo e li sposteremo nel xt_geoippercorso richiesto , ad es /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Ecco la sintassi di base per l'utilizzo di iptables con il modulo geoip al fine di bloccare il traffico proveniente o destinato a un Paese. Qui, dobbiamo usare il codice ISO3166 di due lettere al posto del paese, ad esempio, USA per Stati Uniti, IE per Irlanda, IN per India, CN per Cina e così via.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

0

Si utilizza l' Elenco firewall IP2Location per generare iptables per la Cina.

Il file è nel seguente formato. Eseguilo nella shell e dovresti bloccare tutti gli indirizzi IP cinesi.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.