Iptables, le pare-feu Linux
Il est important de protéger vos serveurs notamment quand ils sont directement visibles depuis l’internet. Vous trouverez donc ci-dessous les règles iptables par défaut que je mets sur mes différents serveurs ainsi que certaines règles facultatives.
Qu’est ce qu’iptables ?
Iptables est un logiciel permettant de la mise en place d’un pare-feu sous Linux. Un pare-feu étant un système de blocage des accès vers ou depuis votre ordinateur depuis ou vers le réseau, réseau qui peut être domestique, local ou mondial. Il sert à mettre en place votre politique de sécurité informatique.
Xtables comprends plusieurs composantes : iptables
pour les réseaux IPV4, ip6tables
pour les réseaux IPV6, arptables
pour protéger les tables ARP et ebtables
pour les trames ethernet au niveau de la couche Liaison du modèle OSI.
Quelles règles mettre ?
Vous trouverez ci-dessous mon script de mise en place de mes règles iptables. Il est découpé en plusieurs parties. La première est la suppression totale de toutes les règles en place, puis vient l’acceptation de tout trafic venant ou allant vers localhost, suivi de la gestion des connexions déjà établies. Ensuite, viennent les règles d’acceptation du trafic sur les ports des services désirés, les règles non obligatoires sont commentées pour être dé-commentées sur les serveurs le nécessitant. Pour finir, nous avons la règles refusant tout trafic entrant ne respectant pas les règles précédentes.
# mkdir /etc/iptables # vi /etc/iptables/iptables.sh
#! /bin/sh IPT=/sbin/iptables # Delete all rules $IPT -F $IPT -X $IPT -F -t nat $IPT -X -t nat # lo $IPT -t filter -A INPUT -i lo -j ACCEPT $IPT -t filter -A OUTPUT -o lo -j ACCEPT # Established connections $IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # SSH server $IPT -A INPUT -p tcp --dport ssh -j ACCEPT # HTTP Server #$IPT -A INPUT -p tcp --dport 80 -j ACCEPT #$IPT -A INPUT -p tcp --dport 443 -j ACCEPT # Gitlab #$IPT -A INPUT -p tcp --dport 3550 -j ACCEPT # Ping $IPT -A INPUT -p icmp -j ACCEPT # REJECT all other $IPT -A INPUT -j REJECT
Comme vous pouvez le remarquer, les règles sont globales et non spécifiques à une interface. Il faudra les adapter à votre cas de figure.
Pour mettre en place les règles précédentes, rien de plus simple.
# chmod +x /etc/iptables/iptables.sh # /etc/iptables/iptables.sh
Les règles seront alors appliquées jusqu’au redémarrage de votre serveur. Cela est pratique dans la phase d’adaptation des règles à votre serveur. Si vous faites une bêtise et que vous retrouvez exclus de votre serveur, il vous suffira de le redémarrer pour y avoir de nouveau accès.
Mettre en place les règles au démarrage
Via iptables-persistent
iptables-persistent
est un utilitaire qui se propose de charger automatiquement au démarrage vos règles iptables. Il gère les règles pour IPv4 et IPv6. L’avantage de cette solution réside dans le fait de ne pas avoir à faire d’adaptation de vos scripts pour le passage sous systemD le travail ayant déjà été fait. De plus son utilisation se veut très simple.
Pour commencer vous devez installer son paquet
# apt-get install iptables-persistent
À l’installation, le système de paquet va vous demander si vous souhaitez sauvegarder vos règles. iptables-persistent sauvegardes les règles dans /etc/iptables
sous les nom rules.v4
pour les règles en lien avec IPv4 et rules.v6
pour les règles IPv6.
Pour sauvegarder les règles, vous devez utiliser la commande
# service netfilter-persistent save
Celle-ci revient à utiliser iptables-save
et ip6tables-save
et d’enregistrer leurs sorties dans les fichiers rules.v4
et rules.v6
.
Pour effacer l’ensemble des règles actuelles
# service netfilter-persistent flush
Pour remettre les règles sauvegardées
# service netfilter-persistent reload
Via le script d’init (Obsolète)
Une fois votre script bien établi, vous pouvez rendre automatique la mise en place de celles-ci au démarrage de votre serveur en ajoutant le script d’init suivant :
#!/bin/sh ### BEGIN INIT INFO # Provides: firewall # Required-Start: $local_fs $remote_fs $syslog $network # Required-Stop: $local_fs $remote_fs $syslog $network # Default-Start: 3 # Default-Stop: 0 6 # Short-Description: Starts Firewall # Description: Starts Firewall ### END INIT INFO IPTABLES=/sbin/iptables case "$1" in start) /etc/iptables/iptables.sh exit 0 ;; stop) # Initialisation du FW $IPTABLES -F $IPTABLES -X $IPTABLES -t nat -F $IPTABLES -t nat -X exit 0 ;; *) echo "Usage: /etc/init.d/firewall {start|stop}" exit 1 ;; esac
Il vous reste maintenant à l’ajouter au système d’init de votre serveur.
# update-rc.d firewall defaults
Commentaires
zlka
Très intéressant et ludique présenté comme ça. Je n’avais jusqu’alors pas saisi la notion d’iptables. Merci !
Anthony
De rien.
Pour info, je viens de découvrir iptables-persistent qui de ne plus avoir à faire le script d’init.