Accueil > Réseau, Sécurité, Système > Configurer IPTables pour Netfilter sous Debian Squeeze

Configurer IPTables pour Netfilter sous Debian Squeeze

02/06/2015 Categories: Réseau, Sécurité, Système Tags: , , ,

Qu’est-ce que c’est?

IPTables regroupe les lignes de commandes nécessaires à la gestion de Netfilter. Oui mais que fait Netfilter ? Pour les anglophones, vous aurez remarquer que dans Netfilter, il y a Net et il y a Filter donc à priori ça va parler d’Internet et de filtrage. Et qui dit filtrage, veut dire Firewall.

Voilà le mot est laché ! Le couple Netfilter/IPTables permet de faire du filtrage de port grâce à des règles de pare-feu. Il sera alors possible de bloquer certains paquets IP et de laisser passer ceux qui nous intéressent. Par exemple par le port 80 (le port pour http), le trafic Internet sera possible et votre navigateur préféré vous emmènera sur les autoroutes du savoir offert par Internet.

Quant aux ports, ce sont des ports logiques. Votre PC a besoin pour différencier de manière unique les différents services auxquels il va se connecter. Grâce à une combinaison port + adresse IP qui forme un socket, votre PC sait maintenant faire la différence, à partir d’une seule IP, entre une connexion sur le web en port 80 et une connexion sur un serveur de messagerie en smpt sur le port 25. Sans cela, vous seriez obligé de naviguer sur Internet puis de fermer votre navigateur et enfin vous pourriez aller sur votre application cliente de messagerie comme Outlook.

Avouez que ce serait moins agréable qu’aujourd’hui alors que nous sommes devenus de grands consommateurs de services sur Internet et le tout, en même temps, sans attendre. D’ailleurs, que le premier qui n’a pas téléchargé sur Internet en regardant une vidéo en streaming tout en chattant sur MSN jette la première pierre ! Personne ! Bon alors c’est parti pour un nouveau tuto…


Pré requis :

  • Debian Squeeze installé.
  • Disposer d’une connexion à l’Internet.
  • Les règles fonctionnent pour un serveur dédié Dedibox mais le script peut s’adapter aisément pour un serveur héberger à domicile sur une ligne ADSL classique.

1. Iptables vous permet de lister les règles déjà en place :

iptables -L

2. En principe aucune règle n’est définie si votre installation de Debian est toute fraîche du matin. Si ce n’est pas le cas il faut écraser les règles présentes avec cette commande :

iptables -F

3. Nous allons créer un script pour nos règles de pare-feu. Bien sûr vous pourrez le modifier et jouter les règles dont vous aurez besoin. Mais pourquoi un script. En cas de redémarrage de votre machine, nos paramètres pour IPTables seront vides et vous serez obligé de les entrer à nouveau à la main. Et ce serait dommage de perdre un élément de sécurité comme le pare-feu. Pour commencer, nous devons donner droits au script et à Iptables pour s’exécuter en mode root :

chmod +x /etc/init.d/mesReglesIptables

4. Pourquoi pas l’intégrer aussi comme un service. Cette commande permet à Linux de lancer le script en tant que service au démarrage :

update-rc.d mesReglesIptables defaults

5. Ouvrez un fichier dans le dossier « /etc/init.d/ » comme vous nommerez « firewall » :

nano /etc/init.d/mesReglesIptables

6. Voici le script à créer :

1 ### BEGIN INIT INFO
2 # Provides:          mesReglesIptables
3 # Required-Start:    $remote_fs $syslog
4 # Required-Stop:     $remote_fs $syslog
5 # Default-Start:     2 3 4 5
6 # Default-Stop:      0 1 6
7 # Short-Description: Demarrage du script lors de la sequence de boot
8 # Description:       Ajout des regles de parefeu
9 ### END INIT INFO
10
11 #!/bin/sh
12 case "$1" in
13 start)
14
15 echo - Initialisation du firewall :
16
17 # Vidage des tables et des regles personnelles
18 iptables -t filter -F
19 iptables -t filter -X
20 echo - Vidage des regles et des tables : [OK]
21
22 # Interdire toutes connexions entrantes et sortantes
23 iptables -t filter -P INPUT DROP
24 iptables -t filter -P FORWARD DROP
25 iptables -t filter -P OUTPUT DROP
26 echo - Interdire toutes les connexions entrantes et sortantes : [OK]
27
28 # Ne pas casser les connexions etablies
29 iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
30 iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
31 echo - Ne pas casser les connexions établies : [OK]
32
33 ########## Regles ##########
34
35 # Autoriser loopback
36 iptables -t filter -A INPUT -i lo -j ACCEPT
37 iptables -t filter -A OUTPUT -o lo -j ACCEPT
38
39 # Autoriser le ping
40 iptables -t filter -A INPUT -p icmp -j ACCEPT
41 iptables -t filter -A OUTPUT -p icmp -j ACCEPT
42
43 # Autoriser SSH
44 iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
45 iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
46
47 # Autoriser DNS
48 iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
49 iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
50 iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
51 iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
52
53 # Autoriser NTP
54 iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
55
56 # Autoriser FTP
57 modprobe ip_conntrack_ftp
58 iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
59 iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
60 iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
61
62 # Autoriser HTTP et HTTPS
63 iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
64 iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
65 iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
66 iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
67 iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT
68
69 # Autoriser POP3
70 iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
71 iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT
72
73 # Autoriser SMTP
74 iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
75 iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT
76
77 # Autoriser IMAP
78 iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
79 iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT
80
81 # Autoriser POP3S
82 iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
83 iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT
84
85 # Autoriser DMA pour le Monitoring de la Dedibox
86 iptables -A INPUT -i eth0 -s 88.191.254.0/24 -p tcp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT
87 iptables -A INPUT -i eth0 -s 88.191.254.0/24 -p udp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT
88 iptables -A OUTPUT -o eth0 -d 88.191.254.0/24 -p tcp --sport 161 -m state --state ESTABLISHED -j ACCEPT
89 iptables -A OUTPUT -o eth0 -d 88.191.254.0/24 -p udp --sport 161 -m state --state ESTABLISHED -j ACCEPT
90 echo - Initialisation des regles : [OK]
91
92 ;;
93 status)
94
95 echo - Liste des regles :
96 iptables -n -L
97
98 ;;
99 stop)
100
101 # Vidage des tables et des regles personnelles
102 iptables -t filter -F
103 iptables -t filter -X
104 echo - Vidage des regles et des tables : [OK]
105
106 iptables -P INPUT ACCEPT
107 iptables -P FORWARD ACCEPT
108 iptables -P OUTPUT ACCEPT
109 echo - Autoriser toutes les connexions entrantes et sortantes : [OK]
110
111 ;;
112 esac
113 exit 0

7. Tapez la commande suivante pour démarrer le script (nous allons expliquer cette commande dans la remarque après la prochaine étape) :

/etc/init.d/mesReglesIptables start

8. Redémarrez votre système pour vérifier si les règles sont bien démarrées et actives avec la commande suivante :

iptables -L

Remarquons qu’après redémarrage pour vider les règles de votre pare-feu, la commande « iptables -L » risque de ne plus fonctionner. C’est normal votre script agit comme un service et demande d’être traité comme tel. Voici alors les commandes pour l’arrêter :

/etc/init.d/mesReglesIptables stop

Ou bien pour le démarrer :

/etc/init.d/mesReglesIptables start

Enfin pour consulter l’état de votre script :

/etc/init.d/mesReglesIptables status

Encore des commandes :

Vidage des toutes les règles :

iptables –F

Bien entendu il existe d’autres configurations possibles pour créer votre propre script. D’ailleurs vous attendez certainement une petite explication de texte de ce script un peu barbare à première vue.

Petit ajout de dernière minute (mise à jour de l’article):

Afin d’éviter le méchant message d’erreur « missing LSB tags and overrides » qui vous pourrit le week-end et vous fait vous passer les nerfs sur votre copine, nous avons ajouter ceci:

### BEGIN INIT INFO
# Provides: mesReglesIptables
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Demarrage du script lors de la sequence de boot
# Description: Ajout des regles de parefeu
### END INIT INFO

En fait il s’agissait de fournir une description du script et les codes qui devront être générés lors du redémarrage ou de l’arrêt de celui-ci. Par exemple quand tout va bien, le code 0 est renvoyé.

On vide les règles déjà existantes pour éviter les conflits :

# Vidage des tables et des regles personnelles
iptables -t filter -F
iptables -t filter -X

Puis on affiche un petit message spécifiant que tout est ok pour cette partie du script :

echo - Vidage des regles et des tables : [OK]

D’abord on coupe tout. C’est radical mais on commence toujours par interdire toutes les connexions entrantes et sortantes :

# Interdire toutes connexions entrantes et sortantes
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP

Toujours un petit message pour savoir si tout va bien :

echo - Interdire toutes les connexions entrantes et sortantes : [OK]

Par exemple si vous êtes connecté en SSH à votre serveur, il serait dommage de perdre la connexion déjà ouverte :

# Ne pas casser les connexions etablies
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
echo - Ne pas casser les connexions établies : [OK]########## Regles ##########

On autorise tout le trafic entrant et sortant en local :

# Autoriser loopback
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT

La commande ping est utile :

# Autoriser le ping
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT

Souvenez-vous du commentaire sur SSH pour les connexions déjà ouvertes. Bloquer le port SSH et vous ne pourrez plus vous connecter à distance, c’est ennuyeux pour un serveur dédié chez un hébergeur (le port par défaut est 22 mais si vous l’avez modifié pour des raisons de sécurité entrez le n° que vous lui avez attribué) :

# Autoriser SSH
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT

Toujours pareil sauf que l’on autorise le DNS en entrée et en sortie :

# Autoriser DNS
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT

Le NTP est autorisée pour synchroniser l’heure avec les serveurs de temps :

# Autoriser NTP
iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT

Si vous avez un serveur FTP :

# Autoriser FTP
modprobe ip_conntrack_ftp
iptables -t filter -A OUTPUT -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Bien sûr pour surfer sur le Net il faut ne pas bloquer le port 80:

# Autoriser HTTP et HTTPS
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 8443 -j ACCEPT

Les règles suivantes concernent la messagerie :

# Autoriser POP3
iptables -t filter -A INPUT -p tcp --dport 110 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 110 -j ACCEPT# Autoriser SMTP
iptables -t filter -A INPUT -p tcp --dport 25 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 25 -j ACCEPT# Autoriser IMAP
iptables -t filter -A INPUT -p tcp --dport 143 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 143 -j ACCEPT# Autoriser POP3S
iptables -t filter -A INPUT -p tcp --dport 995 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 995 -j ACCEPT

Attention cas particulier, ceci est spécifique à la maintenance pour les utilisateurs de Dedibox :

# Autoriser DMA pour le Monitoring de la Dedibox
iptables -A INPUT -i eth0 -s 88.191.254.0/24 -p tcp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -s 88.191.254.0/24 -p udp --dport 161 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 88.191.254.0/24 -p tcp --sport 161 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -d 88.191.254.0/24 -p udp --sport 161 -m state --state ESTABLISHED -j ACCEPT

Cette partie est spécifique au fonctionnement des commandes de votre script en tant que service dont nous avons parlé dans la petite remarque après l’étape 8 :

echo - Initialisation des regles : [OK];;
status)echo - Liste des regles :
iptables -n -L;;
stop)# Vidage des tables et des regles personnelles
iptables -t filter -F
iptables -t filter -X
echo - Vidage des regles et des tables : [OK]iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
echo - Autoriser toutes les connexions entrantes et sortantes : [OK];;
esac
exit 0

Pour résumer, voici un récapitulatif de certaines attributs définis dans nos règles :

Dans la ligne de votre nouvelle règle, il faut préciser les paquets sont traités en entrée, en sortie ou bien s’ils sont routés:

FORWARD : Traite les paquets routés.
INPUT : Traite les paquets entrants.
OUTPUT : Traite les paquets sortants.

Ceci définit l’action à faire sur les paquets d’une règle inscrite dans la table des règles :

DROP :: Le paquet est rejeté, aucune notification n’est envoyée à la source.
REJECT : Le paquet est rejeté, une notification est envoyée à la source.
ACCEPT : Le paquet est accepté.

La définition des attributs pour les règles dans votre fichier de configuration contenant la table des règles mais aussi quelques commandes pour les ajouter ou les supprimer directement :

-A : ajoute une règle
-D : supprime un règle
-F : vide les tables
-X : vide les règles
-L : liste les règles
-i : interface entrante
-o : interface sortante
-p : protocole
-s : nom d’hôte ou adresse ip
-j : jump, action de la règle (ACCEPT, DROP, REJECT )
-m : options de concordance
–dport : numéro port de destination
–sport : numéro du port source

Enfin pour conclure, sachez que les règles de filtrage peuvent vous servir pour monter un proxy sous Squid par exemple. Pour les plus curieux, le filtrage de ports est lié aux NAT (Net Adress Translation) et se situe au niveau « Application » de la pile TCP/IP et au niveau 7 du modèle OSI. Netfilter permet aussi de partager un accès Internet à partir d’une machine pour le reste de votre réseau local si vous ne possédez qu’une seule IP publique ainis que pour la QoS (Quality of Services) afin de fournir un service irréprochable à votre DSI préféré et ceci 24/7.

Print Friendly, PDF & Email

Related Post

Les commentaires sont fermés.