Hur man blockerar IP-adresser på min brandvägg med iptables och nftables på Linux

När vi har en server exponerad för Internet är en grundläggande rekommendation att konfigurera din brandvägg att endast tillåta den trafik som vi vill tillåta och förneka resten av trafiken. Vid många tillfällen är vi offer för brute force attacker eller denial of service attacker från andra länder än Spanien. I de allra flesta tillfällen är det tillrådligt att endast tillåta IP-adresserna i det land där du är, eller ditt företag är, och att som standard neka annan trafik som vi inte har på den tillåtna listan. Idag i den här artikeln kommer vi att lära dig att ladda ner alla IP-intervall i ett visst land för att blockera det när vi vill, eller att tillåta en av dem, alltid använda IPv4 eftersom dess användning är majoritet, om du ska använda IPv6 du måste anpassa manuset.

Politik i en brandvägg: tillåtande eller begränsande

Brandväggar har huvudsakligen två policyer, en tillåtande policy tillåter all trafik utom vad vi specifikt har förnekat. I en restriktiv policy tillåter vi endast trafik som vi specifikt har definierat. För säkerhet är det alltid tillrådligt att ha en restriktiv policy på Internet WAN, för att undvika att en dåligt inställd regel kan orsaka trafik som vi inte vill komma in i vårt nätverk, dessutom är det mer effektivt att ha (få) regler för att tillåta viss trafik och förneka resten i bulk än tvärtom.

Blockera IP-adresser för landet på min brandvägg med iptables och nftables på Linux

En mycket bra policy i en brandvägg skulle vara att endast tillåta ett eller flera länder och förneka resten av länderna som standard. Därför kan skriptet som vi presenterar nedan enkelt modifieras så att endast nedladdade IP-adresser eller undernät tillåts, och senare blockeras resten av IP-adresser enligt policy.

Var får jag IP-adresser och intervall för olika länder?

In IPDeny du kan hitta alla IPv4-adressblock som tillhör varje land, på detta sätt kan vi få alla IP-adressintervall i CIDR-format från alla länder i världen, vi kommer att ha möjlighet att se IP-intervallen i Spanien, Kina, Ryssland och många andra. Ju större land, desto fler utbud av IPv4-adresser kommer vi att ha, så vi måste tillåta eller neka åtkomst till dessa nätverk för att senare förbjuda eller tillåta dem. I den här andra länken vi har tillgängliga IPv6-adressblock i varje land.

En mycket viktig detalj är att IPDeny uppdaterar hela IP-adressdatabasen mycket ofta, både IPv4 och IPv6, för att hindra oss från att blockera IP-adresser eller intervall från ett land som faktiskt befinner sig i ett annat. Denna webbsida uppdateras nästan dagligen, eftersom IPv4- och IPv6-adressblocken ändras eller mer läggs till.

Konfiguration av iptables med ipset för att blockera länder

iptables är Linux brandvägg par excellence, även om det finns vissa distributioner som gör språnget till nftables, vilket är utvecklingen av iptables, mycket snabbare, effektivare och lättare att konfigurera, men för närvarande använder vi fortfarande iptables-syntaxen, men nedan använder vi nftables , som i de senaste versionerna av Debian-operativsystemet och många andra. Om du använder iptables rekommenderas det att du använder ipset-tillägget, vilket gör att vi kan blockera eller tillåta miljontals IP-adresser, men med högre prestanda än om vi gör det direkt med IPtables. I fallet att tillåta eller blockera ett helt land rekommenderas det starkt att göra det via ipset eftersom det helt klart är effektivare än iptables.

För att använda ipset med iptables måste du installera det eftersom det inte är installerat som standard, du kan installera det på detta sätt:

sudo apt install ipset

När vi väl har installerat kan vi börja använda den.

Följande skript som vi har programmerat består av att blockera ett land eller flera, lägga till alla dess undernät som laddats ner från IPdeny och inkludera alla undernät i en ipset för att senare ringa den ipset och blockera den i iptables. På så sätt blir iptables mycket effektivare än om du gör det utan ipset-tillägget.

#!/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

Nu kan vi se status för iptables genom att sätta följande, och vi kommer att se att det använder den konfigurerade ipset:

iptables -L

För att se status för ipset sätter vi följande:

ipset list

När vi vill blockera ett nytt land måste du köra skriptet igen och automatiskt raderas allt innehåll i ipset och alla nya undernät läggs till från grunden. Detta är det mest rekommenderade eftersom de olika databaserna för IP-adresser och intervall i de olika länderna kontinuerligt uppdateras. Vi måste notera att länder som Kina har ett stort antal IP-adressblock, så det tar flera minuter att tillämpa alla regler på brandväggen, om vi bara försöker med "annons" är det nästan omedelbart eftersom vi har väldigt få.

Tack vare detta skript kan vi, om vår internettjänst bara fungerar i Spanien, förbjuda alla andra länder, men vi måste komma ihåg att om en användare från Spanien använder en proxy eller VPN från ett annat land tillåter vi inte åtkomst.

Konfiguration av iptables med ipset för att tillåta Spanien och blockera resten

I det här skriptet kommer vi att göra precis motsatsen till den tidigare. Vad vi kommer att göra är att ladda ner databasen över IP-adresser i Spanien, vi lägger till den i den nya ipset som skapats och vi tillåter åtkomst. Som standard kommer det att neka all annan trafik från andra länder. Om ditt företag är i Spanien och du bara vill att de ska ansluta i Spanien är detta det bästa och mest effektiva du kan göra eftersom du bara tillåter ett land och inte specifikt blockerar resten av världen.

#!/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

Nu kan vi se status för iptables genom att sätta följande, och vi kommer att se att det använder den konfigurerade ipset:

iptables -L

För att se status för ipset sätter vi följande:

ipset list

Som du har sett är det väldigt enkelt att blockera eller tillåta ett land som använder ipset från iptables, dessutom är det mycket effektivare än att göra det direkt med iptables, så vi rekommenderar att du alltid använder ipset för den här typen av åtgärder .

Nftables-konfiguration för att blockera länder

nftables är den nya Linux-brandväggen, bättre, snabbare och mer intuitiv än de populära iptables som vi alltid har använt. nftables är redan installerat i de flesta Linux-distributioner även om vi använder iptables-syntax. Om du använder de senaste versionerna av Debian kommer du redan att använda nftables utan att veta det, men vi kan inte själv använda syntaxen för nftables.

För att kunna använda nftables 100% måste vi installera det direkt från förvaren och utföra följande kommando:

sudo apt install nftables

När vi väl har installerat kan vi börja konfigurera nftables med kommandot “nft”. Syntaxen skiljer sig radikalt från iptables, så om du inte har använt den tar det en stund att anpassa sig till den nya syntaxen.

Följande skript som vi har programmerat består av att blockera ett land eller flera, lägga till alla dess undernät som laddats ner från IPdeny och inkludera alla undernät i nftables för att blockera det i brandväggen. Vi måste komma ihåg att nftables är mycket effektivare än iptables, och det kommer att fungera riktigt bra.

#!/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

Nu kan vi se tillståndet för nftables genom att sätta följande, och vi kommer att se att det använder den konfigurerade ipset:

nft list ruleset

Konfigurera nftables för att tillåta länder

Nästa skript som vi har programmerat består av att tillåta ett land, lägga till alla dess undernät som laddats ner från IPdeny och inkludera alla undernät i nftables för att tillåta det i brandväggen, resten av trafiken kommer att nekas. Vi måste komma ihåg att nftables är mycket effektivare än iptables, och det kommer att fungera riktigt bra.

#!/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

Nu kan vi se tillståndet för nftables genom att sätta följande, och vi kommer att se att det använder den konfigurerade ipset:

nft list ruleset

Hittills har vi kommit med den här guiden om iptables och ipset för att blockera eller tillåta IP-adresser från olika länder, vi har också sett hur man gör det med nftables, den nya Linux-brandväggen med en ny syntax som är mycket mer intuitiv, men det kommer att kosta oss lite arbete vänja oss vid det om vi alltid har arbetat med iptables.