Comment configurer un pare-feu iptables pour permettre l’accès distant aux services sous Linux – Partie 8

Linux Foundation Certified Engineer – Part 8

Présentation du programme de certification de la Linux Foundation

Vous vous souviendrez de Partie 1 – À propos d’Iptables de cette série LFCE (Ingénieur Certifié Linux Foundation) que nous avons donnée une description de base de ce qu’est un pare-feu : un mécanisme pour gérer les paquets entrant et sortant du réseau. Par « gérer », nous entendons en fait :

  1. Permettre ou empêcher certains paquets d’entrer ou de sortir de notre réseau.
  2. Transférer d’autres paquets d’un point du réseau à un autre.

basé sur des critères prédéterminés.

Dans cet article, nous discuterons de la manière de mettre en œuvre un filtrage de paquets de base et de configurer le pare-feu avec iptables, une interface utilisateur pour netfilter, qui est un module noyau natif utilisé pour le pare-feu.

Veuillez noter que le pare-feu est un sujet vaste et que cet article n’a pas pour but d’être un guide complet pour comprendre tout ce qu’il y a à savoir à ce sujet, mais plutôt comme un point de départ pour une étude plus approfondie de ce sujet. Cependant, nous revisiterons le sujet dans Partie 10 de cette série lorsque nous explorerons quelques cas d’utilisation spécifiques d’un pare-feu sous Linux.

Vous pouvez penser à un pare-feu comme à un aéroport international où les avions de passagers viennent et vont presque 24 heures sur 24. En fonction de plusieurs conditions, telles que la validité du passeport d’une personne ou son pays d’origine (pour ne citer que quelques exemples), il ou elle peut, ou non, être autorisé(e) à entrer ou à quitter un certain pays.

En même temps, les agents de l’aéroport peuvent donner des instructions aux personnes pour qu’elles se déplacent d’un endroit de l’aéroport à un autre si nécessaire, par exemple lorsqu’elles doivent passer par les services des douanes.

Nous pourrions trouver l’analogie de l’aéroport utile pendant le reste de ce tutoriel. Gardez simplement à l’esprit les relations suivantes au fur et à mesure que nous avançons :

  1. Personnes = Paquets
  2. Pare-feu = Aéroport
  3. Pays n°1 = Réseau n°1
  4. Pays n°2 = Réseau n°2
  5. Réglementations de l’aéroport appliquées par les agents = règles du pare-feu

Iptables – Les bases

À un niveau bas, c’est le noyau lui-même qui « décide » quoi faire avec les paquets en fonction des règles regroupées dans des chaînes, ou phrases. Ces chaînes définissent les actions à prendre lorsqu’un paquet correspond aux critères qui y sont spécifiés.

La première action entreprise par iptables consistera à décider quoi faire avec un paquet :

  1. L’accepter (le laisser passer dans notre réseau) ?
  2. Le rejeter (l’empêcher d’accéder à notre réseau) ?
  3. Le transférer (vers une autre chaîne) ?

Juste au cas où vous vous demandiez pourquoi cet outil s’appelle iptables, c’est parce que ces chaînes sont organisées en tables, la table filter étant la plus connue et celle qui est utilisée pour mettre en œuvre le filtrage des paquets avec ses trois chaînes par défaut :

1. La chaîne INPUT gère les paquets entrant dans le réseau, qui sont destinés aux programmes locaux.

2. La chaîne OUTPUT est utilisée pour analyser les paquets originaires de la réseau locale qui doivent être envoyés à l’extérieur.

3. La chaîne FORWARD traite les paquets qui doivent être transférés vers une autre destination (comme dans le cas d’un routeur).

Pour chaque de ces chaînes, une politique par défaut est associée, qui définit ce que doit faire le système par défaut lorsque les paquets ne correspondent à aucune règle de la chaîne. Vous pouvez afficher les règles créées pour chaque chaîne et la politique par défaut en exécutant la commande suivante :

# iptables -L

Les politiques disponibles sont les suivantes :

  1. ACCEPT → permet au paquet de passer. Tout paquet qui ne correspond à aucune règle de la chaîne est autorisé dans le réseau.
  2. DROP → supprime le paquet silencieusement. Tout paquet qui ne correspond à aucune règle de la chaîne est empêché d’entrer dans le réseau.
  3. REJECT → rejette le paquet et renvoie un message d’information. Cette politique ne fonctionne pas en tant que politique par défaut. Au lieu de cela, elle est destinée à compléter les règles de filtrage des paquets.
Linux Iptables Policies

Lors de la décision sur quelle politique sera mise en œuvre, vous devez considérer les avantages et les inconvénients de chaque approche comme expliqué ci-dessus – notez qu’il n’y a pas de solution unique qui convienne à tous.

Ajouter des règles

Pour ajouter une règle à la pare-feu, exécutez la commande iptables comme suit :

# iptables -A chain_name criteria -j target

où,

  1. -A signifie Ajouter (ajouter la règle actuelle à la fin de la chaîne).
  2. chain_name est soit INPUT, OUTPUT ou FORWARD.
  3. cible est l’action ou la politique à appliquer dans ce cas (ACCEPTER, REJETER ou SUPPRIMER).
  4. critères est l’ensemble des conditions selon lesquelles les paquets doivent être examinés. Il est composé d’au moins un (probablement plusieurs) des indicateurs suivants. Les options entre crochets, séparées par une barre verticale, sont équivalentes les unes aux autres. Le reste représente des commutateurs optionnels :
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

Notre environnement de test

Assemblons tout cela dans 3 exemples classiques en utilisant l’environnement de test suivant pour les deux premiers :

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

Et cela pour le dernier exemple

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
EXEMPLE 1 : Analyse de la différence entre les politiques DROP et REJECT

Nous définirons d’abord une politique DROP pour les pings d’entrée vers notre pare-feu. C’est-à-dire que les paquets icmp seront abandonnés silencieusement.

# ping -c 3 192.168.0.15
# iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP
Drop ICMP Ping Request

Avant de passer à la partie REJECT, nous allons vider toutes les règles de la chaîne INPUT pour nous assurer que nos paquets seront testés par cette nouvelle règle :

# iptables -F INPUT
# iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
# ping -c 3 192.168.0.15
Reject ICMP Ping Request in Firewall
EXEMPLE 2 : Désactivation / réactivation des connexions ssh de dev2 à dev1

Nous allons traiter la chaîne OUTPUT car nous gérons le trafic sortant :

# iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT
Block SSH Login in Firewall
EXEMPLE 3 : Autoriser / empêcher les clients NFS (de 192.168.0.0/24) à monter des partages NFS4

Exécutez les commandes suivantes dans le serveur / pare-feu NFSv4 pour fermer les ports 2049 et 111 pour tout type de trafic :

# iptables -F
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT
Block NFS Ports in Firewall

Maintenant, ouvrons ces ports et voyons ce qui se passe.

# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
# iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT
Open NFS Ports in Firewall

Comme vous pouvez le constater, nous avons pu monter le partage NFSv4 après avoir ouvert le trafic.

Insertion, Ajout et Suppression de Règles

Dans les exemples précédents, nous avons montré comment ajouter des règles aux chaînes INPUT et OUTPUT. Si vous souhaitez les insérer plutôt à un emplacement prédéfini, vous devriez utiliser l’option -I (i majuscule) au lieu de cela.

Il est important de se rappeler que les règles seront évaluées une après l’autre, et l’évaluation s’arrête (ou saute) lorsqu’une politique DROP ou ACCEPT est matche. Pour cette raison, vous pourriez avoir besoin de déplacer les règles vers le haut ou le bas dans la liste de chaînes selon vos besoins.

Nous allons utiliser un exemple trivial pour illustrer cela :

Check Rules of Iptables Firewall

Ajoutons la règle suivante,

# iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

à la position 2) dans la chaîne INPUT (ainsi, la règle précédente #2 devient #3)

Iptables Accept Rule

Avec la configuration ci-dessus, le trafic sera vérifié pour voir s’il est dirigé vers le port 80 avant de vérifier pour le port 2049.

De plus, vous pouvez supprimer une règle et modifier la cible des règles restantes à REJECT (en utilisant l’option -R) :

# iptables -D INPUT 1
# iptables -nL -v --line-numbers
# iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
# iptables -R INPUT 1 -p tcp --dport 80 -j REJECT
Iptables Drop Rule

Enfin, il est important de se rappeler que pour que les règles de pare-feu soient persistantes, vous devrez les enregistrer dans un fichier et les restaurer automatiquement à l’arrêt du système (en utilisant la méthode préférée de votre choix ou celle disponible pour votre distribution).

Enregistrer les règles du pare-feu :

# iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
# iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Restaurer les règles :

# iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
# iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Ici, nous voyons une procédure similaire (enregistrement et restauration des règles de pare-feu manuellement) en utilisant un fichier factice appelé iptables.dump au lieu de celui par défaut montré ci-dessus.

# iptables-save > iptables.dump
Dump Linux Iptables

Pour rendre ces modifications persistantes à travers les redémarrages :

Ubuntu: Installez le paquet iptables-persistent, qui chargera les règles enregistrées dans le fichier /etc/iptables/rules.v4.

# apt-get install iptables-persistent

CentOS: Ajoutez les 2 lignes suivantes au fichier /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: Liste des ports, protocoles, adresses, etc. autorisés (séparés par des virgules) dans le fichier /etc/sysconfig/SuSEfirewall2.

Pour plus d’informations, référez-vous au fichier lui-même, qui est largement commenté.

Conclusion

Les exemples fournis dans cet article, bien qu’ils ne couvrent pas toutes les fonctionnalités d’iptables, servent à illustrer comment activer et désactiver le trafic entrant ou sortant.

Pour ceux d’entre vous qui sont des fans de pare-feu, gardez à l’esprit que nous revisiterons ce sujet avec des applications plus spécifiques dans la Partie 10 de cette série LFCE.

N’hésitez pas à me faire part de vos questions ou commentaires.

Source:
https://www.tecmint.com/configure-iptables-firewall/