Sécurité

Bloquez n’importe quel pays sur le pare-feu de votre serveur avec iptables ou nftables

Lorsque nous avons un serveur exposé à Internet, une recommandation fondamentale consiste à configurer votre pare-feu pour autoriser uniquement le trafic que nous souhaitons autoriser et refuser le reste du trafic. À de nombreuses reprises, nous sommes victimes d’attaques par force brute ou d’attaques par déni de service provenant de pays autres que l’Espagne. Dans la grande majorité des cas, il est conseillé de n’autoriser que les adresses IP du pays où vous vous trouvez, ou de votre entreprise, et de refuser par défaut tout autre trafic que nous n’avons pas sur la liste autorisée. Aujourd’hui, dans RedesZone, nous allons vous apprendre à télécharger toutes les plages d’adresses IP d’un certain pays pour le bloquer à tout moment, ou autoriser l’une d’entre elles, toujours en utilisant IPv4 puisque son utilisation est majoritaire, si vous utilisez IPv6, vous devra adapter le script.

Politiques dans un pare-feu : permissives ou restrictives

Les pare-feu ont principalement deux politiques, une politique permissive autorisera tout le trafic sauf ce que nous avons spécifiquement refusé. Dans une politique restrictive, nous n’autoriserons que le trafic que nous avons spécifiquement défini. Pour la sécurité, il est toujours conseillé d’avoir une politique restrictive sur le WAN Internet, pour éviter qu’une règle mal paramétrée puisse engendrer du trafic que l’on ne souhaite pas entrer dans notre réseau, en plus, il est plus efficace d’avoir (peu) de règles pour autoriser certains trafics et refuser le reste en vrac que l’inverse.

Une très bonne politique dans un pare-feu serait de n’autoriser qu’un ou plusieurs pays et de refuser le reste des pays par défaut. Par conséquent, le script que nous allons présenter ci-dessous peut être facilement modifié pour autoriser uniquement les adresses IP ou les sous-réseaux téléchargés, et bloquer ultérieurement le reste des adresses IP par stratégie.

Où puis-je obtenir les adresses IP et les plages des différents pays ?

Dans IPDeny vous pouvez trouver tous les blocs d’adresses IPv4 qui appartiennent à chaque pays, de cette façon, nous pouvons obtenir toutes les plages d’adresses IP au format CIDR de tous les pays du monde, nous aurons la possibilité de voir les plages des IP en Espagne, en Chine, en Russie et bien d’autres. Plus le pays est grand, plus nous aurons de plages d’adresses IPv4, nous devrons donc autoriser ou refuser l’accès à ces réseaux, pour les interdire ou les autoriser ultérieurement. Dans cet autre lien, nous avons à disposition les blocs d’adresses IPv6 de chaque pays.

Un détail très important est qu’IPDeny met à jour très fréquemment l’ensemble de la base de données d’adresses IP, IPv4 et IPv6, pour nous empêcher de bloquer les adresses IP ou les plages d’un pays qui se trouvent en réalité dans un autre. Cette page Web est mise à jour presque quotidiennement, à mesure que les blocs d’adresses IPv4 et IPv6 changent ou que davantage sont ajoutés.

Configurer iptables avec ipset pour bloquer les pays

iptables est le pare-feu Linux par excellence, bien qu’il existe certaines distributions qui font le saut vers nftables, qui est l’évolution d’iptables, beaucoup plus rapide, plus efficace et plus facile à configurer, cependant, actuellement nous utilisons toujours la syntaxe iptables bien que pour ci-dessous nous utilisons nftables, comme dans les dernières versions du système d’exploitation Debian et bien d’autres. Si vous utilisez iptables, il est fortement recommandé d’utiliser l’extension ipset, qui nous permettra de bloquer ou d’autoriser des millions d’adresses IP, mais avec des performances plus élevées que si nous le faisions directement avec IPtables. Dans le cas d’autoriser ou de bloquer un pays entier, il est fortement recommandé de le faire via ipset car il est clairement plus efficace que iptables.

Pour utiliser ipset avec iptables, vous devez l’installer car il n’est pas installé par défaut, vous pouvez l’installer de cette façon :

sudo apt install ipset

Une fois installé, nous pouvons commencer à l’utiliser.

Le script suivant que nous avons programmé consiste à bloquer un ou plusieurs pays, en ajoutant tous ses sous-réseaux téléchargés depuis IPdeny et en incorporant tous les sous-réseaux à un ipset pour appeler plus tard cet ipset et le bloquer dans iptables. De cette façon, iptables sera beaucoup plus efficace que si vous le faites sans l’extension 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: RedesZone.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

Maintenant, nous pouvons voir le statut d’iptables en mettant ce qui suit, et nous verrons qu’il utilise l’ipset configuré :

iptables -L

Pour voir l’état de l’ipset, nous mettons ce qui suit :

ipset list

Chaque fois que nous voulons bloquer un nouveau pays, vous devrez réexécuter le script et automatiquement tout le contenu d’ipset sera supprimé et tous les nouveaux sous-réseaux seront ajoutés à partir de zéro. C’est le plus recommandé car les différentes bases de données d’adresses IP et de plages des différents pays sont continuellement mises à jour. Il faut noter que des pays comme la Chine ont un grand nombre de blocs d’adresses IP, il faudra donc plusieurs minutes pour appliquer toutes les règles au firewall, si on essaie avec seulement «ad» c’est quasi instantané car on en a très peu.

Grâce à ce script, si notre service Internet ne fonctionne qu’en Espagne, nous pouvons interdire tous les autres pays, mais nous devons garder à l’esprit que si un utilisateur espagnol utilise un proxy ou un VPN d’un autre pays, nous n’autoriserons pas l’accès.

Configuration d’iptables avec ipset pour autoriser l’Espagne et bloquer le reste

Dans ce script, nous ferons exactement le contraire du précédent, ce que nous ferons est de télécharger la base de données des adresses IP de l’Espagne, nous l’ajouterons au nouvel ipset créé et nous autoriserons l’accès. Par défaut, il refusera tout autre trafic en provenance d’autres pays. Si votre entreprise se trouve en Espagne et que vous souhaitez uniquement qu’elle se connecte en Espagne, c’est la chose la meilleure et la plus efficace que vous puissiez faire, car vous n’autoriserez qu’un seul pays et ne bloquerez pas spécifiquement le reste du monde.

#!/bin/bash
# El objetivo de este script es PERMITIR todo el tráfico del pais que nosotros definamos.
# Autor: RedesZone.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

Maintenant, nous pouvons voir le statut d’iptables en mettant ce qui suit, et nous verrons qu’il utilise l’ipset configuré :

iptables -L

Pour voir l’état de l’ipset, nous mettons ce qui suit :

ipset list

Comme vous l’avez vu, il est vraiment facile de bloquer ou d’autoriser un pays en utilisant ipset depuis iptables, en plus, c’est beaucoup plus efficace que de le faire directement avec iptables, nous vous recommandons donc de toujours utiliser ipset pour ce genre d’actions.

Configuration Nftables pour bloquer les pays

nftables est le nouveau pare-feu Linux, meilleur, plus rapide et plus intuitif que les iptables populaires que nous avons toujours utilisés. nftables est déjà installé dans la plupart des distributions Linux même si nous utilisons la syntaxe iptables. Si vous utilisez les dernières versions de Debian, vous utiliserez déjà nftables sans le savoir, mais nous ne pourrons pas utiliser la syntaxe de nftables elle-même.

Pour pouvoir utiliser 100% nftables, nous devrons l’installer directement depuis les référentiels, en exécutant la commande suivante :

sudo apt install nftables

Une fois installé, nous pouvons commencer à configurer nftables avec la commande «nft». La syntaxe est radicalement différente de celle d’iptables, donc si vous ne l’avez pas utilisé, il faudra un certain temps pour s’adapter à la nouvelle syntaxe.

Le script suivant que nous avons programmé consiste à bloquer un pays ou plusieurs, à ajouter tous ses sous-réseaux téléchargés depuis IPdeny et à intégrer tous les sous-réseaux à nftables pour le bloquer dans le pare-feu. Nous devons nous rappeler que nftables est beaucoup plus efficace que iptables et qu’il fonctionnera très bien.

#!/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: RedesZone.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

Maintenant, nous pouvons voir l’état de nftables en mettant ce qui suit, et nous verrons qu’il utilise l’ipset configuré :

nft list ruleset

Configuration Nftables pour autoriser les pays

Le script suivant que nous avons programmé consiste à autoriser un pays, à ajouter tous ses sous-réseaux téléchargés depuis IPdeny et à intégrer tous les sous-réseaux à nftables pour l’autoriser dans le pare-feu, le reste du trafic sera refusé. Nous devons nous rappeler que nftables est beaucoup plus efficace que iptables et qu’il fonctionnera très bien.

#!/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: RedesZone.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

Maintenant, nous pouvons voir l’état de nftables en mettant ce qui suit, et nous verrons qu’il utilise l’ipset configuré :

nft list ruleset

Jusqu’à présent, nous sommes venus avec ce tutoriel sur iptables et ipset pour bloquer ou autoriser les IP de différents pays, nous avons également vu comment le faire avec nftables, le nouveau pare-feu Linux avec une nouvelle syntaxe beaucoup plus intuitive, mais cela coûtera nous un peu de travail pour nous y habituer si nous avons toujours travaillé avec iptables.

Articles Similaires

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba