Iptables, le pare-feu Linux

Réseau
Sécurité


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.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.