Lorsque nous avons un serveur exposé à Internet, une recommandation fondamentale est de configurer votre pare-feu pour autoriser uniquement le trafic que nous voulons 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 cet article, nous allons vous apprendre à télécharger toutes les plages IP d'un certain pays pour le bloquer quand nous le voulons, ou à autoriser l'une d'entre elles, en utilisant toujours IPv4 puisque son utilisation est majoritaire, si vous allez utiliser IPv6 vous devrez adapter le script.
Stratégies 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 provoquer un trafic que l'on ne souhaite pas entrer sur 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 présenterons ci-dessous peut être facilement modifié pour n'autoriser que les adresses IP ou sous-réseaux téléchargés, et bloquer plus tard le reste des adresses IP par stratégie.
Où puis-je obtenir les adresses IP et les plages des différents pays?
In 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 IP de l'Espagne, Chine, 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 plus tard. Dans cet autre lien nous disposons des 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, à la fois IPv4 et IPv6, pour nous empêcher de bloquer les adresses IP ou les plages d'un pays qui se trouve en fait dans un autre. Cette page Web est mise à jour presque quotidiennement, à mesure que les blocs d'adresses IPv4 et IPv6 changent ou plus sont ajoutés.
Configuration d'iptables avec ipset pour bloquer les pays
iptables est le Linux/Unix pare-feu 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 de l'autorisation ou du blocage d'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, à ajouter tous ses sous-réseaux téléchargés depuis IPdeny et à incorporer tous les sous-réseaux à un ipset pour appeler ultérieurement cet ipset et le bloquer dans iptables. De cette façon, iptables sera beaucoup plus efficace que si vous le faisiez 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: 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
Maintenant, nous pouvons voir l'état 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 exécuter à nouveau 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 pare-feu, si nous essayons avec seulement «annonce» c'est presque instantané car nous en avons 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 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, nous allons télécharger la base de données des adresses IP d'Espagne, nous l'ajouterons au nouvel ipset créé et nous autoriserons l'accès. Par défaut, il refuse tout autre trafic en provenance d'autres pays. Si votre entreprise est en Espagne et que vous souhaitez qu'elle se connecte uniquement 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: 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
Maintenant, nous pouvons voir l'état 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 à utiliser 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 nftables à 100%, nous devrons l'installer directement à partir des 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 iptables, donc si vous ne l'avez pas utilisée, il faudra un certain temps pour s'adapter à la nouvelle syntaxe.
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 à 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: 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
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
Configurer nftables pour autoriser les pays
Le prochain script que nous avons programmé consiste à autoriser un pays, à ajouter tous ses sous-réseaux téléchargés depuis IPdeny et à incorporer 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: 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
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 qui coûtera nous nous y habituons si nous avons toujours travaillé avec iptables.