Cum se blochează IP-urile țării pe Firewall-ul meu cu iptables și nftables pe Linux

Când avem un server expus la Internet, o recomandare fundamentală este să vă configurați firewall pentru a permite doar traficul pe care dorim să-l permitem și să refuzăm restul traficului. În multe ocazii suntem victime ale atacurilor cu forță brută sau ale atacurilor prin refuzul serviciului din alte țări decât Spania. În marea majoritate a ocaziilor, este recomandabil să permiteți doar adresele IP ale țării în care vă aflați sau în care vă aflați afacerea dvs. și să refuzați în mod implicit orice alt trafic pe care nu îl avem pe lista permisă. Astăzi, în acest articol, vă vom învăța să descărcați toate intervalele de IP ale unei anumite țări pentru a le bloca ori de câte ori dorim sau să permitem una dintre ele, folosind întotdeauna IPv4, deoarece utilizarea sa este majoritară, dacă doriți să utilizați IPv6 va trebui să adaptați scenariul.

Politici într-un firewall: permisive sau restrictive

Firewall-urile au în principal două politici, o politică permisivă va permite tot traficul, cu excepția a ceea ce am refuzat în mod specific. Într-o politică restrictivă, vom permite doar traficul pe care l-am definit în mod specific. Pentru securitate, este întotdeauna recomandabil să aveți o politică restrictivă pe Internet WAN, pentru a evita ca o regulă prost stabilită să poată provoca trafic pe care nu dorim să îl pătrundem în rețeaua noastră, în plus, este mai eficient să avem (puține) reguli pentru a permite un anumit trafic și a refuza restul în vrac decât invers.

Blocați IP-urile țării pe Firewall-ul meu cu iptables și nftables pe Linux

O politică foarte bună într-un firewall ar fi să permită doar una sau mai multe țări și să refuze restul țărilor în mod implicit. Prin urmare, scriptul pe care îl vom prezenta mai jos poate fi modificat cu ușurință pentru a permite numai adresele IP sau subrețele descărcate și, ulterior, să blocheze restul adreselor IP prin politică.

De unde obțin adresele IP și intervalele din diferite țări?

In IPDeny puteți găsi toate blocurile de adrese IPv4 care aparțin fiecărei țări, în acest fel, putem obține toate intervalele de adrese IP în format CIDR din toate țările din lume, vom avea posibilitatea de a vedea intervalele IP ale Spaniei, China, Rusia și multe altele. Cu cât țara este mai mare, cu atât vom avea mai multe game de adrese IPv4, deci va trebui să permitem sau să refuzăm accesul la rețelele respective, pentru a le interzice sau a le permite mai târziu. În acest alt link avem disponibile blocurile de adrese IPv6 ale fiecărei țări.

Un detaliu foarte important este că IPDeny actualizează foarte frecvent întreaga bază de date a adreselor IP, atât IPv4, cât și IPv6, pentru a ne împiedica să blocăm adresele IP sau intervalele dintr-o țară care se află de fapt în alta. Această pagină web este actualizată aproape zilnic, deoarece blocurile de adrese IPv4 și IPv6 se schimbă sau se adaugă mai multe.

Configurarea iptables cu ipset pentru a bloca țările

iptables este Linux firewall prin excelență, deși există unele distribuții care fac saltul către nftables, care este evoluția iptables, mult mai rapidă, mai eficientă și mai ușor de configurat, cu toate acestea, în prezent, încă mai folosim sintaxa iptables, deși pentru mai jos folosim nftables , ca și în ultimele versiuni ale sistemului de operare Debian și multe altele. Dacă utilizați iptables, este foarte recomandat să utilizați extensia ipset, care ne va permite să blocăm sau să permitem milioane de adrese IP, dar cu performanțe mai mari decât dacă o facem direct cu IPtables. În cazul permisiunii sau blocării unei țări întregi, este foarte recomandat să o faceți prin ipset, deoarece este în mod clar mai eficient decât iptables.

Pentru a utiliza ipset cu iptables, trebuie să-l instalați deoarece nu este instalat în mod implicit, îl puteți instala astfel:

sudo apt install ipset

Odată instalat, putem începe să îl folosim.

Următorul script pe care l-am programat constă în blocarea unei țări sau mai multe, adăugarea tuturor subrețelor sale descărcate de pe IPdeny și încorporarea tuturor subrețelor într-un ipset pentru a apela ulterior acel ipset și a-l bloca în iptables. În acest fel, iptables vor fi mult mai eficiente decât dacă o faceți fără extensia ipset.

#!/bin/bash
# El objetivo de este script es BLOQUEAR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos BLOQUEAR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), ipset (extension de IPTABLESables), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPTABLES=/sbin/iptables
IPSET=/sbin/ipset
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/iptables-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPSET flush paisbloqueado
$IPSET destroy paisbloqueado
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que IPTABLES interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el IPset nuevo para bloquear el pais
$IPSET create paisbloqueado hash:net
for ipbloqueo in $FILTROIPS
do
$IPSET add paisbloqueado $ipbloqueo
done
done
#Denegamos el tráfico del ipset creado.
$IPTABLES -I INPUT -m set --match-set paisbloqueado src -j DROP
#Permitimos todo el resto del trafico. CUIDADO CON ESTO
$IPTABLES -A INPUT -j ACCEPT
exit 0

Acum putem vedea starea iptables punând următoarele, și vom vedea că folosește ipset-ul configurat:

iptables -L

Pentru a vedea starea ipsetului, punem următoarele:

ipset list

Ori de câte ori dorim să blocăm o țară nouă, va trebui să rulați din nou scriptul și automat tot conținutul ipsetului va fi șters și toate subrețele noi vor fi adăugate de la zero. Acesta este cel mai recomandat deoarece diferitele baze de date de adrese IP și intervale din diferite țări sunt în continuă actualizare. Trebuie să menționăm că țări precum China au un număr mare de blocuri de adrese IP, deci va dura câteva minute să aplicăm toate regulile la firewall, dacă încercăm doar cu „anunț” este aproape instantaneu, deoarece avem foarte puține.

Datorită acestui script, dacă serviciul nostru de internet funcționează numai în Spania, putem interzice toate celelalte țări, dar trebuie să avem în vedere că, dacă un utilizator din Spania folosește un proxy sau VPN dintr-o altă țară, nu vom permite accesul.

Configurarea iptables cu ipset pentru a permite Spaniei și a bloca restul

În acest script vom face exact opusul precedentului, ceea ce vom face este să descărcăm baza de date a adreselor IP din Spania, o vom adăuga la noul ipset creat și vom permite accesul. În mod implicit, ceea ce va face este să refuze orice alt trafic din alte țări. Dacă afacerea dvs. este în Spania și doriți să se conecteze numai în Spania, acesta este cel mai bun și mai eficient lucru pe care îl puteți face, deoarece veți permite doar o țară și nu veți bloca în mod specific restul lumii.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos PERMITIR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a iptables (cortafuegos), ipset (extension de IPTABLESables), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que iptables no pueda interpretar ###
IPTABLES=/sbin/iptables
IPSET=/sbin/ipset
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/iptables-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$IPTABLES -F
$IPTABLES -X
$IPTABLES -t nat -F
$IPTABLES -t nat -X
$IPTABLES -t mangle -F
$IPTABLES -t mangle -X
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPSET flush paispermitido
$IPSET destroy paispermitido
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que IPTABLES interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el IPset nuevo para bloquear el pais
$IPSET create paispermitido hash:net
for ippermitir in $FILTROIPS
do
$IPSET add paispermitido $ippermitir
done
done
#Permitimos el tráfico del ipset creado.
$IPTABLES -I INPUT -m set --match-set paispermitido src -j ACCEPT
#DENEGAMOS todo el resto del trafico.
$IPTABLES -A INPUT -j DROP
exit 0

Acum putem vedea starea iptables punând următoarele, și vom vedea că folosește ipset-ul configurat:

iptables -L

Pentru a vedea starea ipsetului, punem următoarele:

ipset list

După cum ați văzut, este foarte ușor să blocați sau să permiteți unei țări să utilizeze ipset din iptables, în plus, este mult mai eficient decât să o faceți direct cu iptables, așa că vă recomandăm să utilizați întotdeauna ipset pentru acest tip de acțiuni .

Configurare Nftables pentru a bloca țările

nftables este noul firewall Linux, mai bun, mai rapid și mai intuitiv decât popularele iptables pe care le-am folosit întotdeauna. nftables este deja instalat în majoritatea distribuțiilor Linux, chiar dacă folosim sintaxa iptables. Dacă utilizați cele mai recente versiuni de Debian, veți folosi deja nftables fără să știți, dar nu vom putea folosi sintaxa nftables în sine.

Pentru a putea utiliza nftables 100%, va trebui să îl instalăm direct din depozite, executând următoarea comandă:

sudo apt install nftables

Odată instalat, putem începe configurarea nftables cu comanda „nft”. Sintaxa este radical diferită de iptables, deci dacă nu ați folosit-o, va dura ceva timp pentru a vă adapta la noua sintaxă.

Următorul script pe care l-am programat constă în blocarea unei țări sau a mai multor, adăugarea tuturor subrețelor descărcate de pe IPdeny și încorporarea tuturor subrețelor în nftables pentru a o bloca în firewall. Trebuie să ne amintim că nftables este mult mai eficient decât iptables și va funcționa foarte bine.

#!/bin/bash
# El objetivo de este script es BLOQUEAR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos BLOQUEAR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a nftables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que NFT no pueda interpretar ###
NFT=/sbin/nft
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/NFT-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$NFT flush set filter ips_baneadas
$NFT flush chain ip filter INPUT
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que NFT interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el set de ips_baneadas de tipo IPv4.
$NFT add set ip filter ips_baneadas {type ipv4_addr; flags interval;}
#Metemos en el set todos los rangos de IP.
for ipbloqueo in $FILTROIPS
do
$NFT add element ip filter ips_baneadas { $ipbloqueo }
done
done
#Bloqueamos todo lo que coincida con el SET anteriormente creado.
$NFT add rule ip filter INPUT ip saddr @ips_baneadas counter drop
$NFT list ruleset > /etc/nftables.conf
systemctl restart nftables.service
exit 0

Acum putem vedea starea nftables punând următoarele, și vom vedea că folosește ipset-ul configurat:

nft list ruleset

Configurarea nftables pentru a permite țărilor

Următorul script pe care l-am programat constă în permiterea unei țări, adăugarea tuturor subrețelor sale descărcate de pe IPdeny și încorporarea tuturor subrețelor în nftables pentru a permite aceasta în firewall, restul traficului va fi refuzat. Trebuie să ne amintim că nftables este mult mai eficient decât iptables și va funcționa foarte bine.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos, aunque tambien podriamos permitir solamente el nuestro, y denegar el resto.
# Autor: this article.net; puedes compartir y modificar este script como desees.
# -------------------------------------------------------------------------------
#Elegiremos el nombre PAIS del pais que queremos PERMITIR
#Como ejemplo pondremos Andorra ya que tiene pocos rangos de direcciones IP.
PAIS="ad"
### Variables para facilitar el uso del script que apuntan a nftables (cortafuegos), wget para coger los archivos de la base de datos y egrep para seleccionar la IP sin ningún símbolo que NFT no pueda interpretar ###
NFT=/sbin/nft
WGET=/usr/bin/wget
EGREP=/bin/egrep
#Ubicacion donde se guarda la base de datos de
BBDD="/root/NFT-bdd"
#URL de la base de datos de paises
URLDESCARGA="http://www.ipdeny.com/ipblocks/data/countries"
#Funcion para limpiar todas las reglas del firewall y lo ponemos por defecto.
limpiarReglasAntiguas(){
$NFT flush set filter ips_permitidas
$NFT flush chain ip filter INPUT
}
#Creamos el directorio para almacenar la base de datos
[ ! -d $BBDD ] && /bin/mkdir -p $BBDD
#Ejecutamos la funcion
limpiarReglasAntiguas
for c in $PAIS
do
# Base de datos local
DBLOCAL=$BBDD/$c.zone
# Descargamos y actualizamos la base de datos
$WGET -O $DBLOCAL $URLDESCARGA/$c.zone
# Filtramos la base de datos para que NFT interprete correctamente la base de datos y vamos anadiendo cada bloque de IP.
FILTROIPS=$(egrep -v "^#|^$" $DBLOCAL)
#Creamos el set de ips_permitidas de tipo IPv4.
$NFT add set ip filter ips_permitidas {type ipv4_addr; flags interval;}
#Metemos en el set todos los rangos de IP.
for ippermitida in $FILTROIPS
do
$NFT add element ip filter ips_permitidas { $ippermitida }
done
done
#Permitimos todo lo que coincida con el SET anteriormente creado.
$NFT add rule ip filter INPUT ip saddr @ips_permitidas counter accept
#Bloqueamos todo lo demas en cadena base
$NFT add chain ip filter INPUT '{ policy drop; }'
#Guardamos y reiniciamos servicio
$NFT list ruleset > /etc/nftables.conf
systemctl restart nftables.service
exit 0

Acum putem vedea starea nftables punând următoarele, și vom vedea că folosește ipset-ul configurat:

nft list ruleset

Până acum am venit cu acest tutorial despre iptables și ipset pentru a bloca sau permite IP-uri din diferite țări, am văzut și cum să o facem cu nftables, noul firewall Linux cu o nouă sintaxă mult mai intuitivă, dar care va costa ne-am obișnuit cu unele lucrări dacă am lucrat întotdeauna cu iptables.