Vous êtes sur la page 1sur 21

Iptables sous

Linux
LASFAR Salim
Iptables est une interface en ligne de commande
permettant de configurer Netfilter1). En plus de Iptables,
depuis la version 8.04, Ubuntu est install avec la
surcouche UFW qui permet de contrler simplement
Netfilter, UFW est toutefois moins complet que iptables.

LP-R2SI:
Administration des
rseaux et scurit
sous Linux.

Firwalling et NAT sous


Linux
Introduction:
Iptables est une interface en ligne de commande permettant de configurer
Netfilter1). En plus de Iptables, depuis la version 8.04, Ubuntu est install
avec la surcouche UFW qui permet de contrler simplement Netfilter,
UFW est toutefois moins complet que iptables.
Cette documentation est une introduction Iptables, elle est destine
ceux qui souhaitent mettre en place un pare-feu et/ou un partage de
connexion, sur une machine Linux, sans passer par une interface
graphique. Seule la table par dfaut (Filter) d'Iptables est prsent ici et
seules les chanes utilises par Filter (Input, Forward et Output) y sont
exposes.
Les lecteurs dsirant approfondir leur recherche et aborder l'utilisation des
autres tables (Nat, Mangle, Row et Security) ainsi que des chanes non
utilisables par Filter (Prerouting et Postrouting) se tourneront vers les
nombreuses documentations disponibles sur l'Internet (voir notamment
ici). Ceux dsirant configurer un pare-feu par l'intermdiaire d'une
interface graphique se tourneront vers Gufw ou encore vers Shorewall
pour une utilisation sur serveur.
iptables existe aussi pour ipv6, pour cela il suffit d'utiliser la commande
ip6tables au lieu de iptables.
Pour une bonne comprhension d'Iptables (et des pare-feux en gnral) il
est conseill d'avoir des notions en rseaux informatiques, au minima
connatre le principe de fonctionnement des protocoles TCP et UDP.

La table filter :
Iptables fonctionne selon un systme de tables, ces tables sont composes
de chane. Dans le cadre de la configuration et de l'utilisation de Netfilter
comme pare-feu, c'est la table Filter qui est utile, elle permet de filtrer les

paquets rseaux. Tout paquet entrant est analys afin de dterminer


notamment sa source et sa destination.
Elle est compose de trois sortes de chane :

INPUT : Permet d'analyser les paquets entrants. Si le paquet est


adress au poste, il est confront au filtre INPUT.

FORWARD : Permet d'analyser et d'autoriser les trames passer


d'une interface une autre, seulement dans le cadre d'une interface
rseau servant de passerelle.

OUTPUT : Permet d'analyser les paquets sortants. Si le paquet sort


du poste, il passera par la chane OUTPUT.

cette table peut tre affect quatre politiques (policy) : DROP, LOG,
ACCEPT et REJECT.

Configuration du pare-feu :
Nous allons configurer notre pare-feu de la manire suivante :

On bloque tout le trafic entrant par dfaut.


On autorise au cas par cas : le trafic appartenant ou li des
connexions dj tablies et le trafic destination des serveurs (web,
ssh, etc.) que nous souhaitons mettre disposition.

Afin de ne pas avoir de problme au moment o on cre ces rgles, nous


allons d'abord crer les autorisations, puis nous enverrons le reste en enfer.
En tapant sudo iptables -L , une liste de vos rgles actuelles est affiche.
Si vous (ou un logiciel) n'avez encore jamais touch iptables, les chaines
sont vides, et vous devriez voir :
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

Pour l'instant, tout passe dans toutes les directions (policy ACCEPT).
Pour cette configuration basique, seul le trafic entrant (chaine input) nous
intresse.

Par dfaut, sudo iptables -L n'affiche que la table "filter". Pour consulter
les autres tables, vous devez ajouter l'option -t suivie de "nat", "mangle" ou
"raw". Pour la configuration d'un pare-feu la table "filter" est toutefois la
seule ncessaire.

Atelier :

Oprations sur une seule chane et sur la table filter:


Crer les rgles suivantes : (vous noterez sur cette feuille chacune des
rgles demandes, ainsi que le test de la rgle, savoir un copi/coll du
term, et/ou du rsultat d'un sniff( ethereal,ngrep etc)
interdire tout paquet entrant
effacer la rgle

iptables -A INPUT -j DROP


iptables -D INPUT 1

paramtre protocole
interdire le protocole icmp entrant
effacer la rgle

iptables -A INPUT -p icmp -j DROP

paramtre source
interdire le protocole icmp provenant de localhost
effacer la rgle

iptables -A INPUT -p icmp -s localhost -j DROP

chane OUTPUT paramtre destination


interdire tout paquet destination de localhost
effacer la rgle

iptables -A OUTPUT -d localhost -j DROP

paramtre inversion
interdire un paquet s'il ne provient pas de localhost
effacer la rgle

iptables -A INPUT ! -s localhost -j DROP

paramtre interface d'entre


interdire tout paquet entrant par eth0
effacer la rgle

iptables -A INPUT -i eth0 -j DROP

interdire un paquet s'il provient de lo ( ne surtout jamais faire sur une


machine si l'on ne sait pas
EXACTEMENT ce que l'on fait)
effacer la rgle

iptables -A INPUT -i lo -j DROP

paramtre interface de sortie


interdire tout paquet sortant par eth0
effacer la rgle

iptables -A OUTPUT -o eth0 -j DROP

paramtre destination port


interdire tout paquet destination du port ftp
effacer la rgle

iptables -A INPUT -p tcp --dport 21 -j DROP

paramtre source port


interdire tout paquet sortant par eth0 dont le numro de port source est
infrieur 1025

iptables -A OUTPUT -o eth0 -p tcp --sport :1024 -j DROP


iptables -A OUTPUT -o eth0 -p udp --sport :1024 -j DROP

tester une connexion ftp


effacer la rgle et retester une connexion ftp
paramtre flag TCP
interdire toute tentative d'initialisation de connexion TCP provenant de
eth0
effacer la rgle

iptables -A INPUT -i eth0 -p tcp --syn -j DROP

paramtre flag icmp


interdire tout paquet entrant correspondant un ping
effacer la rgle

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

interdire toute rponse un ping


effacer la rgle

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j DROP

paramtre extension:
extension mac
interdire tout paquet entrant par eth0 dont l'adresse mac n'est pas celle
du voisin
effacer la rgle

iptables -A INPUT -i eth0 -m mac --mac-source ! 00:50:FC:23:2D:D7 -j


DROP

extension limit
positionner la police par dfaut DROP pour la chane INPUT

iptables -P INPUT DROP

crire une rgle qui laisse passer 5 tentatives de connexion TCP puis qui
n'en laisse passer plus que2 par minute

iptables -A INPUT -p tcp --syn -m limit --limit 2/minute --limit-burst


5 -j ACCEPT

faire de mme avec les pings

iptables -A INPUT -p icmp --icmp-type ping -m limit --limit 2/minute


--limit-burst 5 -j ACCEPT

combien de temps(sans tentative de connexion ou d'echo-request)faudra


t'il pour qu'on puisse nouveau avoir 5 des ces paquets qui puissent passer
la suite ?
3 minutes
effacer la rgle
le suivi de connexion(ip_conntrack)
positionnez les rgles par dfaut DROP pour les chanes INPUT,
OUTPUT, FORWARD

iptables -P INPUT DROP


iptables -P OUTPUT DROP
iptables -P FORWARD DROP

autoriser tout paquet relatif une connexion dj tabli ou en rapport


avec une connexion dj tabli en entre

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j


ACCEPT

interdire tout paquet relatif une connexion de type INVALID

iptables -A INPUT -m state --state INVALID -j DROP


iptables -A OUTPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP

autoriser tout paquet crant une nouvelle connexion en sortie


destination du port 80

iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j


ACCEPT

que faut il modifier ici pour que l'on puisse naviguer sur le net ?

iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j


ACCEPT
iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j
ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j
ACCEPT

effacer la rgle
2. Oprations sur plusieurs chanes et sur la table filter:
cration d'une nouvelle chane
crer une nouvelle chane qui log les paquets entrants en ajoutant le
prfixe [INPUT DROP] et qui le drop

iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG --log-prefix [INPUT DROP]
iptables -A LOG_DROP -j DROP

renvoyer sur cette nouvelle chane tout paquet engendrant une nouvelle
connexion en entre

iptables -A INPUT -m state state NEW -j LOG_DROP

3. Oprations sur plusieurs chaires et sur plusieurs tables :


[Pour cette partie nous travaillerons sur des machines ayant au minimum 2
interfaces rseau]
modification de champ TCP/IP ; table nat ; chanes PREROUTING,
POSTROUTING ; cibles SNAT,
DNAT, MASQUERADE
Positionnez les rgles par dfaut DROP pour les chanes INPUT,
OUTPUT, FORWARD

iptables -P INPUT DROP


iptables -P OUTPUT DROP
iptables -P FORWARD DROP

crer une rgle qui modifie tout paquet qui arrive via l'interface eth1
destination du port 2222 afin que ce paquet ai dans son champ IP DST
l'adresse 192.168.0.1 et dans son champ TCP DPORT 22

iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 2222 -j DNAT -to-destination 192.168.0.1:22

que se passe t il si on tente une connexion sur eth1 sur le port 2222 ?
Rien car les paquets sont drops dans la chaine FORWARD
que faut il faire pour que la translation fonctionne effectivement ? (dans
un sens comme dans l'autre)
pour vous aider mettez ces rgles dans un script se terminant par une
rgle qui log et drop tout et ensuite regarder attentivement les logs

iptables -A FORWARD -s 192.168.0.1 -j ACCEPT


iptables -A FORWARD -d 192.168.0.1 -j ACCEPT

effacer ces rgles(sauf les polices par dfaut)

crer une rgle qui altre le champ IP SRC de tout paquet sortant via
l'interface eth1, en remplaant la valeur de ce champ par l'adresse IP de
cette interface(eth1)

iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source


62.212.36.222

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

autoriser tout trafic provenant de eth0 tre forward par notre machine

iptables -A FORWARD -i eth0 -j ACCEPT

autoriser tout trafic de statuts ESTABLISHED,RELATED tre


forward par notre machine

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j


ACCEPT

Sauvegadre de configuration :
La commande iptables-save sauve ltat actuel de votre Netfilter dans un
fichier. Son utilisation :

# iptables-save > firewall.rules

Iptables-restore pour restaurer cette configuration :

# iptables-restore < firewall.rules

5. Scriptes darrt et de dmarrage du firewall


Scripte pour dsactiver le firewall :
Ce script que nous pouvons nommer et placer dans /etc/firewall-stop
permettra de dsactiver le firewall :

Scripte pour activer le firewall :


Ce script que nous pouvons nommer et placer dans /etc/firewall-start
permettra de dmarrer le firewall :

Avant de lancer les scripts, il faut les rendre excutables :

# chmod +x /etc/firewall-start
# chmod +x /etc/firewall-stop
Ensuite, il est possible de lancer manuellement le firewall et de vrifier le
rsultat :

# /etc/firewall-start
# iptables -L -v

Mme chose pour larrter.

Lancement automatique du firewall au dmarrage de lordinateur


Pour activer le firewall automatiquement au dmarrage de lordinateur, il
faut crer le script /etc/init.d/firewall contenant les lignes suivantes :

Rendre ce script excutable avec la commande :

# chmod +x /etc/init.d/firewall
Crer les liens permettant de dmarrer automatiquement le script au
dmarrage de lordinateur :

# update-rc.d firewall defaults

La commande suivante permet darrter le firewall :

# /etc/init.d/firewall stop
La commande suivante permet dmarrer le firewall :

# /etc/init.d/firewall start