So blockieren Sie Länder-IPs in meiner Firewall mit iptables und nftables unter Linux

Wenn wir einen Server haben, der dem Internet ausgesetzt ist, ist eine grundlegende Empfehlung, Ihren zu konfigurieren Firewall um nur den Datenverkehr zuzulassen, den wir zulassen möchten, und den Rest des Datenverkehrs zu verweigern. In vielen Fällen sind wir Opfer von Brute-Force-Angriffen oder Denial-of-Service-Angriffen aus anderen Ländern als Spanien. In den allermeisten Fällen ist es ratsam, nur die IP-Adressen des Landes zuzulassen, in dem Sie sich befinden oder in dem sich Ihr Unternehmen befindet, und standardmäßig jeden anderen Datenverkehr abzulehnen, den wir nicht auf der Liste der zulässigen Daten haben. In diesem Artikel werden wir Ihnen heute beibringen, alle IP-Bereiche eines bestimmten Landes herunterzuladen, um es zu blockieren, wann immer wir wollen, oder einem von ihnen zu erlauben, immer IPv4 zu verwenden, da dessen Verwendung die Mehrheit ist, wenn Sie IPv6 verwenden Sie müssen das Skript anpassen.

Richtlinien in einer Firewall: zulässig oder einschränkend

Firewalls haben hauptsächlich zwei Richtlinien. Eine zulässige Richtlinie erlaubt den gesamten Datenverkehr, außer dem, was wir ausdrücklich abgelehnt haben. In einer restriktiven Richtlinie erlauben wir nur Datenverkehr, den wir speziell definiert haben. Aus Sicherheitsgründen ist es immer ratsam, eine restriktive Richtlinie für das Internet-WAN zu haben, um zu vermeiden, dass eine schlecht festgelegte Regel zu Datenverkehr führen kann, den wir nicht in unser Netzwerk aufnehmen möchten. Außerdem ist es effizienter, (wenige) Regeln zu haben um bestimmten Verkehr zuzulassen und den Rest in großen Mengen zu verweigern als umgekehrt.

Blockieren Sie Länder-IPs in meiner Firewall mit iptables und nftables unter Linux

Eine sehr gute Richtlinie in einer Firewall wäre, nur ein oder mehrere Länder zuzulassen und den Rest der Länder standardmäßig abzulehnen. Daher kann das unten dargestellte Skript leicht geändert werden, um nur heruntergeladene IP-Adressen oder Subnetze zuzulassen und später die restlichen IP-Adressen nach Richtlinien zu blockieren.

Woher bekomme ich die IP-Adressen und Bereiche der verschiedenen Länder?

In IPVerweigerung Sie können alle IPv4-Adressblöcke finden, die zu jedem Land gehören. Auf diese Weise können wir alle IP-Adressbereiche im CIDR-Format aus allen Ländern der Welt erhalten. Wir haben die Möglichkeit, die IP-Bereiche Spaniens anzuzeigen. China, Russland und viele andere. Je größer das Land, desto mehr IPv4-Adressen werden wir haben. Daher müssen wir den Zugriff auf diese Netzwerke zulassen oder verweigern, um sie später zu verbieten oder zuzulassen. Im dieser andere Link Wir haben die IPv6-Adressblöcke jedes Landes verfügbar.

Ein sehr wichtiges Detail ist, dass IPDeny die gesamte IP-Adressdatenbank sehr häufig aktualisiert, sowohl IPv4 als auch IPv6, um zu verhindern, dass wir IP-Adressen oder Bereiche aus einem Land blockieren, das sich tatsächlich in einem anderen befindet. Diese Webseite wird fast täglich aktualisiert, wenn sich die IPv4- und IPv6-Adressblöcke ändern oder mehr hinzugefügt werden.

Konfiguration von iptables mit ipset zum Blockieren von Ländern

iptables ist das Linux Firewall schlechthin, obwohl es einige Distributionen gibt, die den Sprung zu nftables machen, was die Entwicklung von iptables darstellt, viel schneller, effizienter und einfacher zu konfigurieren. Derzeit verwenden wir jedoch immer noch die iptables-Syntax, obwohl wir im Folgenden nftables verwenden , wie in den neuesten Versionen des Debian-Betriebssystems und vielen anderen. Wenn Sie iptables verwenden, wird dringend empfohlen, die ipset-Erweiterung zu verwenden, mit der wir Millionen von IP-Adressen blockieren oder zulassen können, jedoch mit höherer Leistung, als wenn wir dies direkt mit IPtables tun. Wenn Sie ein ganzes Land zulassen oder blockieren möchten, wird dringend empfohlen, dies über ipset zu tun, da es eindeutig effizienter als iptables ist.

Um ipset mit iptables verwenden zu können, müssen Sie es installieren, da es nicht standardmäßig installiert ist. Sie können es folgendermaßen installieren:

sudo apt install ipset

Sobald es installiert ist, können wir es verwenden.

Das folgende Skript, das wir programmiert haben, besteht darin, ein oder mehrere Länder zu blockieren, alle von IPdeny heruntergeladenen Subnetze hinzuzufügen und alle Subnetze in ein ipset zu integrieren, um dieses ipset später aufzurufen und in iptables zu blockieren. Auf diese Weise sind iptables viel effizienter als ohne die ipset-Erweiterung.

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

Jetzt können wir den Status von iptables sehen, indem wir Folgendes eingeben, und wir werden sehen, dass es das konfigurierte ipset verwendet:

iptables -L

Um den Status des ipset zu sehen, setzen wir Folgendes:

ipset list

Wann immer wir ein neues Land blockieren möchten, müssen Sie das Skript erneut ausführen und automatisch wird der gesamte Inhalt von ipset gelöscht und alle neuen Subnetze werden von Grund auf neu hinzugefügt. Dies wird am meisten empfohlen, da die verschiedenen Datenbanken mit IP-Adressen und Bereichen der verschiedenen Länder ständig aktualisiert werden. Wir müssen beachten, dass Länder wie China eine große Anzahl von IP-Adressblöcken haben. Daher wird es einige Minuten dauern, bis alle Regeln auf die Firewall angewendet sind. Wenn wir nur mit "Werbung" versuchen, ist dies fast augenblicklich, da wir nur sehr wenige haben.

Dank dieses Skripts können wir alle anderen Länder verbieten, wenn unser Internetdienst nur in Spanien funktioniert. Wir müssen jedoch berücksichtigen, dass ein Benutzer aus Spanien einen Proxy verwendet oder VPN aus einem anderen Land erlauben wir keinen Zugang.

Konfiguration von iptables mit ipset, um Spanien zuzulassen und den Rest zu blockieren

In diesem Skript werden wir genau das Gegenteil des vorherigen Skripts tun. Wir werden lediglich die Datenbank mit den IP-Adressen Spaniens herunterladen, sie dem neu erstellten ipset hinzufügen und den Zugriff zulassen. Standardmäßig wird der gesamte andere Datenverkehr aus anderen Ländern abgelehnt. Wenn sich Ihr Unternehmen in Spanien befindet und Sie nur möchten, dass sie sich in Spanien verbinden, ist dies das Beste und Effizienteste, was Sie tun können, da Sie nur ein Land zulassen und den Rest der Welt nicht speziell blockieren.

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

Jetzt können wir den Status von iptables sehen, indem wir Folgendes eingeben, und wir werden sehen, dass es das konfigurierte ipset verwendet:

iptables -L

Um den Status des ipset zu sehen, setzen wir Folgendes:

ipset list

Wie Sie gesehen haben, ist es wirklich einfach, ein Land zu blockieren oder zuzulassen, das ipset von iptables aus verwendet. Außerdem ist es viel effizienter als es direkt mit iptables zu tun. Wir empfehlen daher, ipset immer für diese Art von Aktionen zu verwenden .

Nftables-Konfiguration zum Blockieren von Ländern

nftables ist die neue Linux-Firewall, die besser, schneller und intuitiver ist als die beliebten iptables, die wir immer verwendet haben. nftables ist in den meisten Linux-Distributionen bereits installiert, auch wenn wir die iptables-Syntax verwenden. Wenn Sie die neuesten Versionen von Debian verwenden, werden Sie bereits nftables verwenden, ohne es zu wissen, aber wir können die Syntax von nftables selbst nicht verwenden.

Um nftables zu 100% nutzen zu können, müssen wir es direkt aus den Repositorys installieren und den folgenden Befehl ausführen:

sudo apt install nftables

Nach der Installation können wir mit der Konfiguration von nftables mit dem Befehl „nft“ beginnen. Die Syntax unterscheidet sich grundlegend von iptables. Wenn Sie sie nicht verwendet haben, dauert es eine Weile, bis Sie sich an die neue Syntax angepasst haben.

Das folgende von uns programmierte Skript besteht darin, ein oder mehrere Länder zu blockieren, alle von IPdeny heruntergeladenen Subnetze hinzuzufügen und alle Subnetze in nftables zu integrieren, um sie in der Firewall zu blockieren. Wir müssen uns daran erinnern, dass nftables viel effizienter ist als iptables und sehr gut funktioniert.

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

Jetzt können wir den Status von nftables sehen, indem wir Folgendes eingeben, und wir werden sehen, dass das konfigurierte ipset verwendet wird:

nft list ruleset

Konfigurieren von nftables, um Länder zuzulassen

Das nächste Skript, das wir programmiert haben, besteht darin, ein Land zuzulassen, alle von IPdeny heruntergeladenen Subnetze hinzuzufügen und alle Subnetze in nftables zu integrieren, um es in die Firewall zuzulassen. Der Rest des Datenverkehrs wird abgelehnt. Wir müssen uns daran erinnern, dass nftables viel effizienter ist als iptables und sehr gut funktioniert.

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

Jetzt können wir den Status von nftables sehen, indem wir Folgendes eingeben, und wir werden sehen, dass das konfigurierte ipset verwendet wird:

nft list ruleset

Bisher haben wir dieses Tutorial zu iptables und ipset zum Blockieren oder Zulassen von IPs aus verschiedenen Ländern erstellt. Wir haben auch gesehen, wie dies mit nftables, der neuen Linux-Firewall mit einer neuen Syntax, die viel intuitiver ist, aber das kostet, funktioniert Wir gewöhnen uns an etwas Arbeit, wenn wir immer mit iptables gearbeitet haben.