Sådan blokeres land-IP'er på min firewall med iptables og nftables på Linux

Når vi har en server udsat for Internettet, er en grundlæggende anbefaling at konfigurere din firewall kun at tillade den trafik, som vi vil tillade, og nægte resten af ​​trafikken. Ved mange lejligheder er vi ofre for voldsangreb eller benægtelse af tjenesteangreb fra andre lande end Spanien. I langt de fleste tilfælde tilrådes det kun at tillade IP-adresserne i det land, hvor du er, eller din virksomhed befinder sig, og som standard nægte enhver anden trafik, som vi ikke har på den tilladte liste. I dag i denne artikel vil vi lære dig at downloade alle IP-intervaller i et bestemt land for at blokere det, når vi vil, eller at tillade en af ​​dem, altid ved hjælp af IPv4, da dens anvendelse er flertallet, hvis du vil bruge IPv6 du bliver nødt til at tilpasse scriptet.

Politikker i en firewall: tilladende eller restriktiv

Firewalls har hovedsagelig to politikker, en tilladelig politik tillader al trafik undtagen hvad vi specifikt har nægtet. I en restriktiv politik tillader vi kun trafik, som vi specifikt har defineret. Af sikkerhedshensyn tilrådes det altid at have en restriktiv politik på internet-WAN for at undgå, at en dårligt indstillet regel kan medføre trafik, som vi ikke ønsker at komme ind i vores netværk, desuden er det mere effektivt at have (få) regler at tillade bestemt trafik og nægte resten i løs vægt end omvendt.

Bloker land-IP'er på min firewall med iptables og nftables på Linux

En meget god politik i en firewall ville være at kun tillade et eller flere lande og nægte resten af ​​landene som standard. Derfor kan scriptet, som vi præsenterer nedenfor, let ændres for kun at tillade downloadede IP-adresser eller undernet og senere blokere resten af ​​IP-adresser efter politik.

Hvor får jeg IP-adresser og intervaller fra de forskellige lande?

In IPDeny du kan finde alle IPv4-adresseblokke, der hører til hvert land, på denne måde kan vi få alle IP-adresseområder i CIDR-format fra alle lande i verden, vi har mulighed for at se IP-intervaller i Spanien, Kina, Rusland og mange andre. Jo større land, jo flere intervaller af IPv4-adresser har vi, så vi bliver nødt til at tillade eller nægte adgang til disse netværk for senere at forbyde eller tillade dem. I dette andet link vi har tilgængelige IPv6-adresseblokke i hvert land.

En meget vigtig detalje er, at IPDeny opdaterer hele IP-adressedatabasen meget ofte, både IPv4 og IPv6, for at forhindre os i at blokere IP-adresser eller spænder fra et land, der faktisk er i et andet. Denne webside opdateres næsten dagligt, da IPv4- og IPv6-adresseblokke ændres eller mere tilføjes.

Konfiguration af iptables med ipset for at blokere lande

iptables er Linux firewall par excellence, selvom der er nogle distributioner, der gør springet til nftables, hvilket er udviklingen af ​​iptables, meget hurtigere, mere effektivt og lettere at konfigurere, men i øjeblikket bruger vi stadig iptables-syntaksen, selvom vi nedenfor bruger nftables , som i de nyeste versioner af Debian-operativsystemet og mange andre. Hvis du bruger iptables, anbefales det stærkt, at du bruger ipset-udvidelsen, som giver os mulighed for at blokere eller tillade millioner af IP-adresser, men med højere ydeevne, end hvis vi gør det direkte med IPtables. I tilfælde af at tillade eller blokere et helt land anbefales det stærkt at gøre det via ipset, fordi det klart er mere effektivt end iptables.

For at bruge ipset med iptables skal du installere det, fordi det ikke er installeret som standard, du kan installere det på denne måde:

sudo apt install ipset

Når det er installeret, kan vi begynde at bruge det.

Det følgende script, som vi har programmeret, består i at blokere et land eller flere, tilføje alle dets undernet, der er downloadet fra IPdeny, og inkorporere alle undernetene til et ipset for senere at kalde det ipset og blokere det i iptables. På denne måde vil iptables være meget mere effektive, end hvis du gør det uden ipset-udvidelsen.

#!/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 på iptables ved at sætte følgende, og vi vil se, at det gør brug af det konfigurerede ipset:

iptables -L

For at se status for ipset sætter vi følgende:

ipset list

Når vi vil blokere et nyt land, skal du køre scriptet igen, og automatisk slettes alt indholdet af ipset, og alle nye undernet tilføjes fra bunden. Dette er det mest anbefalede, fordi de forskellige databaser med IP-adresser og intervaller i de forskellige lande løbende opdateres. Vi skal bemærke, at lande som Kina har et stort antal blokke af IP-adresser, så det vil tage flere minutter at anvende alle reglerne på firewallen, hvis vi kun prøver med "annonce", er det næsten øjeblikkeligt, fordi vi har meget få.

Takket være dette script, hvis vores internettjeneste kun fungerer i Spanien, kan vi forbyde alle andre lande, men vi skal huske på, at hvis en bruger fra Spanien bruger en proxy eller VPN fra et andet land tillader vi ikke adgang.

Konfiguration af iptables med ipset for at tillade Spanien og blokere resten

I dette script vil vi gøre det modsatte af det forrige. Hvad vi vil gøre er at downloade databasen over IP-adresser i Spanien, vi vil føje den til den nye oprettede ipset, og vi giver adgang. Som standard vil det nægte al anden trafik fra andre lande. Hvis din virksomhed er i Spanien, og du kun vil have dem til at oprette forbindelse i Spanien, er dette den bedste og mest effektive ting, du kan gøre, fordi du kun tillader et land og ikke specifikt blokerer resten af ​​verden.

#!/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 på iptables ved at sætte følgende, og vi vil se, at det gør brug af det konfigurerede ipset:

iptables -L

For at se status for ipset sætter vi følgende:

ipset list

Som du har set, er det virkelig nemt at blokere eller tillade et land, der bruger ipset fra iptables. Derudover er det meget mere effektivt end at gøre det direkte med iptables, så vi anbefaler, at du altid bruger ipset til denne form for handlinger .

Nftables-konfiguration til at blokere lande

nftables er den nye Linux-firewall, bedre, hurtigere og mere intuitiv end de populære iptables, som vi altid har brugt. nftables er allerede installeret i de fleste Linux-distributioner, selvom vi bruger iptables-syntaksen. Hvis du bruger de nyeste versioner af Debian, bruger du allerede nftables uden at vide det, men vi kan ikke selv bruge syntaxen for nftables.

For at kunne bruge nftables 100% bliver vi nødt til at installere det direkte fra arkiverne og udføre følgende kommando:

sudo apt install nftables

Når vi er installeret, kan vi begynde at konfigurere nftables med kommandoen “nft”. Syntaksen adskiller sig radikalt fra iptables, så hvis du ikke har brugt den, vil det tage et stykke tid at tilpasse sig den nye syntaks.

Det følgende script, som vi har programmeret, består i at blokere et land eller flere, tilføje alle dets undernet, der er downloadet fra IPdeny, og inkorporere alle undernet til nftables for at blokere det i firewallen. Vi skal huske, at nftables er meget mere effektive end iptables, og det fungerer rigtig godt.

#!/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 tilstanden af ​​nftables ved at sætte følgende, og vi vil se, at det gør brug af det konfigurerede ipset:

nft list ruleset

Konfiguration af nftables til at tillade lande

Det næste script, som vi har programmeret, består i at tillade et land, tilføje alle dets undernet, der er downloadet fra IPdeny, og inkorporere alle undernetene i nftables for at tillade det i firewallen, resten af ​​trafikken nægtes. Vi skal huske, at nftables er meget mere effektive end iptables, og det fungerer rigtig godt.

#!/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 tilstanden af ​​nftables ved at sætte følgende, og vi vil se, at det gør brug af det konfigurerede ipset:

nft list ruleset

Indtil videre er vi kommet med denne tutorial om iptables og ipset til at blokere eller tillade IP'er fra forskellige lande, vi har også set hvordan man gør det med nftables, den nye Linux-firewall med en ny syntaks, der er meget mere intuitiv, men det vil koste os noget arbejde vænne sig til det, hvis vi altid har arbejdet med iptables.