Qu'est-ce que le pare-feu ferm basé sur Linux iptables et comment le configurer

In Linux/Unixsystèmes d'exploitation basés sur pare-feu par excellence que vous utilisez est iptables, cependant, il est également possible que vous utilisiez nftables, qui est l'évolution d'iptables, beaucoup plus efficace et avec une syntaxe beaucoup plus "humaine", cependant, tout le monde n'utilise pas encore nftables. Aujourd'hui nous allons vous expliquer comment configurer un firewall sur des serveurs Linux en utilisant Ferm (For Easy Rule Making), une interface iptables qui va nous permettre d'ajouter des règles au firewall très facilement, rapidement et simplement, sans avoir à apprendre la syntaxe de iptables.

Qu'est-ce que le pare-feu Ferm et à quoi sert-il ?

Qu'est-ce que le pare-feu ferm basé sur Linux iptables

Ferm (For Easy Rule Making) est une interface d'iptables, cela signifie que, en dessous, il utilise en fait iptables pour autoriser ou refuser le trafic, mais il nous permet de configurer le pare-feu de manière très avancée sans avoir à apprendre la syntaxe de iptables ou créer différents scripts en utilisant iptables, mais nous le ferons directement avec Ferm. Cet outil est capable de lire les règles à partir d'un fichier de configuration que nous allons définir, et plus tard il « appellera » iptables pour ajouter les différentes règles une à une, en les insérant en temps réel dans le noyau.

L'objectif de Ferm est de fournir aux administrateurs système et réseau un moyen simple de lire et d'écrire toutes les règles de pare-feu, en réduisant la tâche d'avoir à écrire une règle après l'autre, afin que nous puissions passer plus de temps à développer et à optimiser les règles, pour les rendre aussi efficace que possible. Ferm utilise un langage de configuration très simple mais assez avancé, nous pouvons utiliser des variables, des fonctions, des tableaux et même des blocs. Une autre option très intéressante de Ferm est qu'il va nous permettre d'inclure d'autres fichiers de configuration dans un répertoire, et il se chargera d'importer et d'appliquer toutes ces règles automatiquement.

Ferm est toujours une interface iptables, par conséquent, lorsque nous utiliserons cet outil, nous pourrons toujours éditer et configurer directement le pare-feu à l'aide des commandes iptables. En fait, Ferm est capable d'importer les règles iptables actuelles et de les mettre automatiquement dans le fichier de configuration, pour les modifier ou les développer ultérieurement.

L'un des frontends iptables les plus populaires est ufw, largement utilisé par les administrateurs système et réseau pour configurer facilement et rapidement leurs pare-feu.

Installation et mise en service de Ferm

L'installation de Ferm est vraiment simple, elle se trouve actuellement dans la plupart des référentiels des différentes distributions basées sur Linux, dans notre cas nous avons utilisé la dernière version de Debian pour effectuer tous les tests que nous allons vous apprendre. Pour installer ce programme, qui est une interface iptables, nous devons exécuter la commande suivante :

sudo apt install ferm

Une fois que nous avons exécuté cette commande, nous devrions voir quelque chose comme ceci, où nous verrons les packages supplémentaires que nous devons installer, en gros, nous devons installer Perl pour pouvoir exécuter ce programme correctement.

Le programme d'installation de Ferm nous dira qu'il chargera les règles du pare-feu au démarrage à partir du chemin /etc/ferm/ferm.conf, c'est-à-dire que tout ce qui se trouve dans ce fichier sera automatiquement transmis à iptables pour autoriser ou refuser le trafic réseau. La configuration par défaut de ce pare-feu nous permet d'avoir accès par SSH à distance via le port 22, si vous n'avez pas SSH configuré sur ce port, alors vous devrez modifier les valeurs par défaut et cliquer sur « non » pour qu'il ne démarre pas , sinon vous perdrez la connectivité.

Une fois que nous avons choisi oui ou non, apt terminera l'installation de tous les packages supplémentaires dont nous avons besoin pour faire fonctionner ce programme.

Une fois installé, nous pouvons aller dans le chemin /etc/ferm/ et nous verrons à la fois le fichier de configuration appelé ferm.conf, ainsi qu'un répertoire appelé ferm.d où nous pourrons incorporer nos fichiers de configuration ferm pour les importer, cela permet nous avons une plus grande modularité.

Ferm est déjà fourni par défaut avec une liste de règles que nous pouvons supprimer à tout moment, mais cela nous aidera à gérer la syntaxe de cette interface iptables, ce sera donc très utile. Si nous regardons la syntaxe, nous verrons qu'elle est similaire à nftables, mais qu'elle est basée sur iptables.

Dans la capture d'écran suivante, vous pouvez voir comment sont déclarés les domaines où il va être configuré (iptables ou ip6tables), les tables et les chaînes, ainsi que les règles que nous avons au sein des différentes chaînes.

Nous pouvons également voir que nous avons plusieurs règles par défaut :

  • Dans la chaîne INPUT, la politique est DROP, le trafic localhost est autorisé, le trafic ICMP et la connexion sont autorisés via IPsec et également via SSH avec les ports par défaut. En ce qui concerne l'état des connexions, les connexions invalides sont SUPPRIMÉES et les connexions établies et liées sont autorisées, mais les nouvelles ne sont pas autorisées, à l'exception de celles spécifiquement définies.

Dans la chaîne OUTPUT, il est défini que la politique est de tout accepter, et l'état de la connexion autorise celles établies et liées. Dans la chaîne FORWARD, le trafic est refusé par la politique, les connexions non valides sont spécifiquement bloquées mais établies et les connexions associées sont autorisées.

Ensuite, vous pouvez voir ce fichier de configuration au format texte :

# -*- shell-script -*-
#
# Configuration file for ferm(1).
#
domain (ip ip6) {
table filter {
chain INPUT {
policy DROP;

# suivi de connexion
état mod état INVALID DROP;
état mod état (ÉTABLISHED RELATED) ACCEPTER ;

# autorise le paquet local
interface quoi ACCEPTER;

# répondre au ping
proto icmp ACCEPTER;

# autoriser IPsec
proto udp dport 500 ACCEPTER;
@if @eq ($ DOMAINE, ip) {
proto (en particulier ah) ACCEPTER;
} @autre {
proto (esp) ACCEPTER;
}

# autoriser les connexions SSH
proto tcp dport ssh ACCEPTER;
}
chaîne SORTIE {
politique ACCEPTER;

# suivi de connexion
#mod état état INVALID DROP;
état mod état (ÉTABLISHED RELATED) ACCEPTER ;
}
chaîne AVANT {
politique BAISSER;

# suivi de connexion
état mod état INVALID DROP;
état mod état (ÉTABLISHED RELATED) ACCEPTER ;
}
}
}

@include ferm.d/;

La partie la plus intéressante est le "@include ferm.d /" que nous avons dans la partie finale, cela signifie qu'il importera tous les fichiers de configuration que nous avons dans ce répertoire en question.

Ce pare-feu Ferm ci-dessous utilise donc iptables si nous exécutons la commande suivante :

iptables -L

Nous pouvons voir l'état actuel d'iptables avec toutes les règles qu'il a intégrées au pare-feu :

Une fois que nous avons vu la configuration par défaut de Ferm, nous allons voir différents exemples de configuration que nous pouvons faire.

Configuration de base Ferm

La syntaxe de Ferm est très simple et flexible, mais nous devons l'apprendre pour faire une configuration correcte. Nous vous recommandons accéder au manuel officiel Ferm où vous trouverez tous les détails sur la syntaxe à utiliser et comment les différentes règles doivent être déclarées dans le fichier de configuration, grâce à ce manuel officiel, nous pouvons configurer ce pare-feu sans trop de problèmes.

La première chose à garder à l'esprit est que toutes les règles Ferm commencent et se terminent par des accolades, et les règles se terminent par un point-virgule, c'est donc une syntaxe bien connue en programmation. D'autres fonctionnalités intéressantes sont que les sauts de ligne sont ignorés, et vous pouvez mettre des commentaires n'importe où en mettant "#" à la fin de la ligne.

Concernant la syntaxe d'iptables et de ferm, nous avons quelques différences :

  • Pour définir l'interface d'entrée : interface (if)
  • Pour définir l'interface de sortie : externalface (of)
  • Pour définir une origine : saddr
  • Pour définir une destination : daddr
  • Pour définir un protocole : proto
  • Port d'origine : sport
  • Port de destination : dport
  • Charger un module : mod
  • Aller à une règle personnalisée : sauter

Dans Ferm il n'y a pas de commandes telles que -A, -I, -C, -R ou -D, puisque tout est écrit dans un fichier de configuration, il en va de même avec les commandes pour ajouter une nouvelle chaîne, la renommer ou la supprimer, maintenant ici disparaît complètement. D'autres fonctionnalités sont que ferm vous permet d'hériter de différentes règles à utiliser dans d'autres règles, imbriquées dans le fichier de configuration.

Une fois que nous savons à peu près à quoi ressemble la syntaxe, nous allons voir quelques exemples la comparant avec iptables, dans chacun d'eux nous travaillerons sur la table «filter» dans la chaîne «INPUT».

iptables -P INPUT ACCEPT
iptables -A INPUT -p tcp -j ACCEPT

En ferm, cela s'écrirait comme suit (en ajoutant la politique de la chaîne OUTPUT et FORWARD de la table de filtrage):

domain ip {
table filter {
chain INPUT {
policy DROP;
proto tcp ACCEPT;
}
chain OUTPUT {
policy ACCEPT;
}
chain FORWARD {
policy DROP;
}
}
}

Ferm nous permet de définir les mêmes règles dans l'ENTRÉE et la SORTIE facilement et rapidement, sans avoir besoin de répéter les règles encore et encore. Par exemple, imaginons que maintenant nous voulons accepter le protocole TCP à la fois dans la chaîne INPUT et dans la chaîne OUTPUT, cela dans iptables serait comme suit :

iptables -A INPUT -p tcp -j ACCEPT
iptables -A OUTPUT -p tcp -j ACCEPT
iptables -A INPUT -p udp -j ACCEPT
iptables -A OUTPUT -p udp -j ACCEPT

Avec Ferm, c'est aussi simple que de faire ce qui suit :

domain ip {
table filter {
chain (INPUT OUTPUT) {
proto (udp tcp) ACCEPT;
}
}

Comme vous pouvez le voir, il est beaucoup plus rapide et plus facile d'appliquer cette même règle à la fois à l'ENTRÉE et à la SORTIE.

Ce pare-feu intègre également des fonctions très intéressantes, par exemple, on peut vérifier si une variable ou une fonction est définie, on peut vérifier si deux valeurs sont identiques ou différentes, refuser une valeur booléenne, résoudre des domaines directement depuis Ferm, concaténer des paramètres et un long liste des fonctions.

Ferm permet également de « charger » les modules iptables pour les utiliser, et de configurer le firewall de manière avancée, par exemple, nous avons les éléments suivants :

mod connlimit connlimit-above 4 connlimit-mask 24 REJECT;

Que nous pouvons mettre dans tout le fichier de configuration.

Pour appliquer les règles introduites dans Ferm, nous devrons exécuter la commande suivante :

ferm -i -t 10 /etc/ferm/ferm.conf

Importer des règles iptables dans Ferm

Ferm nous permet d'importer facilement et rapidement les règles iptables que nous avons actuellement en exécution, dans un fichier Ferm pour une modification ultérieure. Pour pouvoir faire cela, nous devrons simplement avoir les règles iptables chargées en mémoire (en cours d'utilisation) et exécuter cette commande :

import-ferm > /etc/ferm/ferm.d/reglas-iptables.conf

Lorsque nous l'exécutons, nous pouvons voir les règles iptables directement dans la syntaxe de Ferm.

Si vous souhaitez transformer les règles iptables que vous avez dans un fichier texte en Ferm, vous pouvez exécuter la commande suivante :

import-ferm origen de las reglas de iptables > /etc/ferm/ferm.d/reglas-iptables.conf

Comme vous l'avez vu, ferm est une excellente interface iptables qui nous permettra de le configurer de manière avancée, sans avoir à apprendre la syntaxe d'iptables et à organiser correctement les règles dans un fichier de configuration. Cependant, à notre avis, nous pensons que la configuration correcte d'un script bash avec toutes les règles iptables ne nécessite aucun frontal ni logiciel supplémentaire, bien que cela puisse être utile pour certaines personnes. Il faut rappeler que Nftables intègre déjà la possibilité de configurer les règles directement dans un fichier de configuration, et pas seulement de manière interactive via les commandes de la console.