Skip navigation

Firewall : iptables

Éditer des règles de firewalling avec iptables

iptables permet de filtrer les connexions entrantes et/ou sortantes. Utilisé comme pare-feu, iptables permet également de faire de la translation d’adresse (NAT).

Lister les règles en cours.

root@debian~#: iptables -L

sortie

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

La sortie précédente donne accès à quiconque de importe où.

Supprimer toutes les règles en cours incluant les règles NAT.

root@debian~#: iptables -F
root@debian~#: iptables -X
root@debian~#: iptables -F -t nat
root@debian~#: iptables -X -t nat

Les chaînes
INPUT : règle entrante
OUTPUT : règle sortant
FORWARD : règle de transite.

Les “policy” (politique)
ACCEPT : accepte les paquets
REJECT : refuse les paquets avec notification
DROP : refuse/jette les paquets sans notification

Gestions des policy de connexions pour tout refuser.

: à ne pas faire sur une machine distante.

root@debian~#: iptables -P INPUT DROP
root@debian~#: iptables -P OUTPUT DROP
root@debian~#: iptables -P FORWARD DROP

: les commandes iptables -F suivi de iptables -X n’affectent pas les “policy”.

Options courantes

Option Description
-F, --flush Nettoie la règle passé en paramètre. Vide toutes la table si aucun paramètre est passée.
-X, --zero Nettoie la règle de l’utilisateur passée en paramètre. Vide toutes la table si aucun paramètre est passé.
-t, --table Définie le type de “table” sur lequel l’utilisateur veut agir : filter, nat, mangle, […]
-P, --policy Change le type de “policy”
-A, --append Ajoute une ou plusieurs règles.
-p--protocol Le protocole de la règle ou du paquet.
-i, --in-interface Nom l’interface qui reçoit les paquets pour les chaînes : INPUT, FORWARD et PREROUTING.
-o, --out-interface Nom de l’interface qui envoie les paquets pour les chaînes FORWARD, OUTPUT et POSTROUTING.
--dport, --destination-port Port ou intervalle de port de destination.
--sport, --source-port Port ou intervalle de port source.
-j, --jump Spécifie la cible de la règle, action à effectuer si le paquet correspond à la règle

Création d’une règle

Autoriser à comminiquer via SSH.

root@debian~#: iptables -A INPUT -p tcp -i eth0 -d 172.16.0.10 --dport ssh -j ACCEPT #1
root@debian~#: iptables -A OUTPUT -p tcp -o eth0 -d 172.16.0.0/16 --sport ssh -j ACCEPT #2

La règle #1 va autoriser l’interface eth0 à recevoir (–dport) via le protocol ssh.
La règle #2 va autoriser l’interface eth0 à emettre (–sport) via le protocol ssh.

Cette règle n’est pas permanante.

Sauvegarder une règle

Pour sauvegarder une règle il faut utiliser la commande iptables-save.

root@debian~#: iptables-save > /etc/iptables.up.rules

Restaurer une règle

Pour restaurer une règle il faut utiliser la commande iptables-restore.

root@debian~#: iptables-restore < /etc/iptables.up.rules

: dans l’exemple les règles sont sauvegarder puis restaurer depuis le dossier /etc mais elles peuvent être stockées ailleurs.

Appliquer les règles au démarrage

Enfin, toujours via la commande iptables-restore il est possible d’appliquer des règles iptables dès le démarrage.

Créer le fichier d’appel des règles

root@debian~#: vim /etc/network/if-pre-up.d/iptables

contenu du fichier

#!/bin/sh
/sbin/iptables-restore < /etc/iptables.up.rules

Ce fichier doit être executable.

root@debian~#: chmod +x /etc/network/if-pre-up.d/iptables

Exemple d’application

Accéder à Internet depuis une VM derrière un hyperviseur

Supposons que l’on souhaites accéder, via ssh, à des VMs sans passer par l’hyperviseur.

vm-behind-host

Voici la règle.

root@debian~#: iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 23980 -j DNAT --to 10.0.0.15:22

Cette règle va NATer une connexion entrante de l’interface eth0 sur le port 29980 vers l’IP 10.0.0.15 sur son port 22.

Natter tout traffic

root@debian~#: iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Supprimer une règle

Identifier la règle à supprimer, dans le cas présent, la régle précédement ajouter pour rediriger un flux SSH.

root@debian~#: iptables -L -t nat --line-numbers

aperçu du contenu du fichier

[…]
order lb-ord inf: IP-nginx Nginx-rsc
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DNAT       tcp  --  anywhere             anywhere             tcp dpt:28091 to:10.0.0.12:9091
2    DNAT       tcp  --  anywhere             anywhere             tcp dpt:http to:10.0.0.13:80
[…]
8    DNAT       tcp  --  anywhere             anywhere             tcp dpt:28900 to:10.0.0.20:80
9    DNAT       tcp  --  anywhere             anywhere             tcp dpt:23980 to:10.0.0.15:22
[…]

La règle est identifiée, c’est la ligne 9.

Supprimer la règle.

root@debian~#: iptables -D INPUT 9

: si la sortie indique « iptables: Index of deletion too big. » la règle n’est supprimée, dans ce cas faire un export (iptables-save > rules), éditer cet export en supprimant la ligne et ré-importer (iptables-restore < rules).

Scripts

Faire un « safe flush » des règles iptables.

: à placer dans /usr/local/sbin/ de façon à pouvoir l'appeler de façon transparente.

script : iptable-flush.sh

#!/bin/bash

# Flusher les règles existantes
iptables -F
iptables -X

iptables -t nat -F
iptables -t nat -X

# Application de la politique par défaut
# /!\ À ne pas faire via un accès distant
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# Autoriser tout en loopback
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Autorise le ping DEPUIS l'extérieur uniquement
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

# Autorise le ping VERS l'extérieur uniquement
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

# NOTE : autorisez tout en ping en une seule règle
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT

# Autoriser tout trafic sortant et la réponse à ce trafic
iptables -A INPUT -i eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o eth0 -m state --state NEW,ESTABLISHED -j ACCEPT

by | April 25, 2015 | No Comments | Système | Tags : firewall iptables