Вы находитесь на странице: 1из 12

Monday 07 April 2003

Iptables
Drnires modifications : Monday 07 April 2003
La drnire version de ce document est disponible ici : http://tuxz.org/cours/iptables/
Stphane Sals
s.sales@tuxz.org

Table of Contents
1.COURS

2.TP IPTABLES

1.1.Mettons nous en situation :


1.2.Que puis-je faire avec iptables/netfilter ?
1.3.C'est quoi une chane ?
1.4.Comment placer une rgle dans une chane ?

2.1.Oprations sur une seule chane et sur la table filter:


2.1.1.Premire rgle
2.1.2.paramtre protocole
2.1.3.paramtre source
2.1.4.chane OUTPUT paramtre destination
2.1.5.paramtre inversion
2.1.6.paramtre interface d'entre
2.1.7.paramtre interface de sortie
2.1.8.paramtre destination port
2.1.9.paramtre source port
2.1.10.paramtre flag TCP
2.1.11.paramtre flag icmp
2.1.12.paramtre extension:
2.1.12.1.extension mac
2.1.12.2.extension limit
2.1.13.le suivi de connexion(ip_conntrack)

2
2
3
4

5
5
5
5
5
5
5
5
5
5
5
5
7
7
7
7

2.2.Oprations sur plusieurs chanes et sur la table filter:

2.3.Oprations sur plusieurs chaires et sur plusieurs tables :

2.2.1.cration d'un nouvelle chane

2.3.1.modification de champ IP/TCP ; table nat et chanes


PREROUTING,POSTROUTING ; cible SNAT, DNAT, MASQUERADE
8
2.3.1.TODO: 1.Ajouter un schma
8
2.3.1.TODO: 2.--to-destination ipaddr[-ipaddr][:port-port You can add several
--to-destination options. If you specify more than one destination address,
either via an address range or multiple --to-destination options, a simple
round-robin (one after another in cycle) load balancing takes place between
these adresses.
8
2.3.1.TODO: 3.--to-source ipaddr[-ipaddr][:port-port You can add several

--to-source options. If you specify more than one source address, either via
Page (one
1 sur 12
an address range or multiple --to-source options, a simple round-robin
after another in cycle) takes place between these adresses.
9

Monday
07 April 2003
2.3.1.TODO: 3.--to-source ipaddr[-ipaddr][:port-port You can
add several
--to-source options. If you specify more than one source address, either via
an address range or multiple --to-source options, a simple round-robin (one
after another in cycle) takes place between these adresses.
9

Page 2 sur 12

Monday 07 April 2003

1. COURS
1.1. Mettons nous en situation :

j'ai 3 machines en rseau(raccords via un switch) qui forme mon LAN, une de ces machines
possde 2 interfaces rseaux :
- une carte rseau reli au switch qui sera donc mon interface pour joindre mon LAN
- une connexion modem reli un autre rseau, en l'occurrence Internet
Un schma valant mille explications :

Nous ne dtaillerons pas ici l'installation d'iptables tant donn que nous travaillerons sur des
Debian munis du noyau 2.4.18-bf2.4 qui contient tout ce dont nous avons besoin(la seule chose
restant ventuellement faire tant de charger les modules dont nous nous serviront, une
commande permettant de charger un module est :
modprobe module

1.2. Que puis-je faire avec iptables/netfilter ?

* monter un firewall filtrant bas sur les paquets mais aussi sur le statut des connexions

engendrs par les paquets(le suivi de connexion)

Page 3 sur 12

* monter un firewall filtrant bas sur les paquets mais aussi sur le statut
Monday
des connexions
07 April 2003
engendrs par les paquets(le suivi de connexion)
* utiliser NAT(Network Address Translation) et le masquerading afin de partager un accs
internet plusieurs machines
* utiliser NAT pour faire du proxy transparent(vite d'avoir paramtrer le proxy sur les
clients/navigateurs web)
* mettre en place(notamment en permettant le marquage des paquets via la table mangle) la
possibilit d'utiliser tc+iproute2 dans le but d'obtenir un routeur sophistiqu permettant le
QoS(Quality of Service, ie privilgi certains services, mettre en place des limites d'utilisation de
bande passante sur un utilisateur, sur un groupe etc)
* manipuler des paquets pour par exemple altr le champ TOS(2) d'un datagramme IP

1.3. C'est quoi une chane ?

Nous allons donc nous positionner comme tant sur la machine qui fera office de firewall/routeur
pour tenter de la scuriser.
Lorsqu'un paquet arrive, il va tre orient(selon un certain nombre de paramtres) dans l'une des
diffrentes chanes disponibles.

Ainsi que nous le montres le schma un paquet rentrera toujours dans la machine via la chane
PREROUTING et sortira toujours de la machine via la chane POSTROUTING(chanes servant
notamment certaines oprations de routage entre les 2 rseaux) raccords par notre routeur.
Les chanes INPUT et OUTPUT quand elle serviront respectivement placer des rgles pour les
paquets destins la machine et ceux mis par la machine, pour faire simple si un paquet est
destin ma machine, "il arrivera dans la chane INPUT" [1]
Par exemple si je demande la visualisation d'une page sur le web depuis la machine, j'mets une
requte qui sortira par la chane OUTPUT et la rponse arrivera sur ma machine par la chane
Page 4 sur 12
INPUT .

Par exemple si je demande la visualisation d'une page sur le web depuis la machine,
Monday j'mets
07 Aprilune
2003
requte qui sortira par la chane OUTPUT et la rponse arrivera sur ma machine par la chane
INPUT .
[La nuance est dans le "destin", savoir que l'on peut considrer qu'un paquet destination du
LAN sera, au moins certain(s) moment(s) et certain(s) niveau(x) du modle OSI, destin la
machine faisant office de routeur mais sera lui orient dans la chane FORWARD et non pas dans la
chane INPUT]
Au moment o le paquet rentre dans la chane, les rgles correspondant cette chane sont
appliques dans l'ordre dans lequel elles sont stockes.

1.4. Comment placer une rgle dans une chane ?


SYNOPSIS :
iptables [-t table] -[ADC] chain rule-specification [options]

tant donn que pour la premire partie du tp nous n'utiliserons que la table filter, nous pourrons
omettre durant celle ci le paramtre -t, car en l'absence de celui-ci la table filter est utilis par
dfaut.
Pour manipuler les rgles appliques une chane, on utilisera les paramtres :
-A pour append : rajouter une rgle la suite des autres(la premire rgle pass par -A se
retrouve en premire position, les suivantes se retrouve la suite)
-D pour delete : effacer une rgle
-D numerox : effacer la rgle numro x
-D rgle : efface la rgle
-F pour flush : on obtient le mme rsultat en effaant toutes les rgles une par une
-P : sert fixer les policy par dfaut, c'est dire fixer l'action prendre par dfaut(ie
quand aucune rgle n'est match).
La premier paramtre connatre est le paramtre -j, car c'est avec celui-ci que l'on va dire quoi
faire lorsqu'un paquet match la rgle que l'on crit. Le paramtre -j s'utilise de la manire suivante :
-j target
Ainsi une rgle basique sera de la forme :
iptables -A chane -j target

Nous utiliserons dans un premier temps les 2 cibles suivantes(ensuite nous verrons que nous
pourrons crer nos propre cibles) :
ACCEPT: laisser passer le paquet
DROP : refuser le paquet
[ par dfaut il existe une cible QUEUE et RETURN que nous n'utiliserons pas dans ce tp]
N.B: avant de commencer le tp vous prendrez soin de couper tout service qui pourrait modifier les
rgles iptables(/etc/init.d/service stop, o service peut tre iptables,shorewall etc).
Vous vrifierez avec la commande iptables -L (liste les rgles qui sont en ce moment applique) qui
devra vous donner ceci :
# iptables -L
Chain INPUT (policy ACCEPT)
target
prot opt source

destination

Chain FORWARD (policy ACCEPT)


target
prot opt source

destination

Chain OUTPUT (policy ACCEPT)

Page 5 sur 12

Monday 07 April 2003


target

prot opt source

destination

Le "policy ACCEPT" n'est pas bnin, en effet ceci prcise l'action prendre par dfaut(i.e quand
aucune rgle ne match)

2. TP IPTABLES
2.1. 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 terminal, et/ou du rsultat d'un sniff(
ethereal,ngrep etc)
2.1.1. Premire rgle
Interdire tout paquet entrant
Effacer la rgle

2.1.2. paramtre protocole


Interdire le protocole ICMP
Effacer la rgle

2.1.3. paramtre source


Interdire le protocole ICMP provenant de localhost
Effacer la rgle

2.1.4. chane OUTPUT paramtre destination


Interdire tout paquet destination de localhost
Effacer la rgle

2.1.5. paramtre inversion


Interdire un paquet s'il ne provient pas de localhost
Effacer la rgle

2.1.6. paramtre interface d'entre


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

2.1.7. paramtre interface de sortie


Interdire tout paquet sortant par eth0
Effacer la rgle

2.1.8. paramtre destination port


Interdire tout paquet destination du port ftp
Effacer la rgle

2.1.9. paramtre source port


Interdire tout paquet sortant par eth0 dont le numro de port destination est infrieur 1024
Tester une connexion ftp(ou n'importe quelle serveur qui tourne sur un port privilgi) depuis
une machine distante sur votre machine

HELP : Les services qui tournent sur des ports < 1024 sont des services qui tournent sous le
compte root et sont donc protger prioritairement
effacer la rgle et retester une connexion ftp

2.1.10. paramtre flag TCP


Interdire toute tentative d'initialisation de connexion TCP provenant de eth0
Effacer la rgle

Page 6 sur 12

Monday 07 April 2003


2.1.11. paramtre flag icmp
Interdire tout paquet entrant correspondant un ping
Effacer la rgle
Interdire toute rponse un ping
Effacer la rgle

2.1.12. paramtre extension:


2.1.12.1. extension mac
Attention on ne peut utiliser l'extension mac que sur les tables INPUT, PREROUTING et FORWARD
; votre avis pourquoi ?
Interdire tout paquet entrant par eth0 dont l'adresse mac n'est pas celle du voisin
Effacer la rgle

2.1.12.2. extension limit


Positionner la police par dfaut DROP pour la chane INPUT
crire une rgle qui laisse entrer 5 tentatives de connexion TCP puis qui n'en laisse passer plus
que 2 par minute
Faire de mme avec les pings
On suppose que le burst est maintenant 0, 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 ?
Effacer la rgle

2.1.13. le suivi de connexion(ip_conntrack)


Positionnez les rgles par dfaut DROP pour les chanes INPUT, OUTPUT, FORWARD
Autoriser tout paquet relatif une connexion dj tabli ou en rapport avec une connexion dj
tabli en entre
Interdire tout paquet relatif une connexion de type INVALID
Autoriser tout paquet crant une nouvelle connexion en sortie destination du port 80
Que faut il modifier ici pour que l'on puisse naviguer sur le net ?
Effacer la rgle

2.2. Oprations sur plusieurs chanes et sur la table filter:


2.2.1. cration d'un nouvelle chane
Crer une nouvelle chane qui log le paquet en ajoutant le prfixe [INPUT DROP] et qui le drop
Renvoyer sur cette nouvelle chane tout paquet engendrant une nouvelle connexion en entre

Dsormais nous sommes en mesure d'obtenir la configuration suivante :

Page 7 sur 12

Monday 07 April 2003

2.3. Oprations sur plusieurs chaires et sur plusieurs tables :


[Pour cette partie nous travaillerons sur des machines ayant au minimum 2 interfaces rseau]
2.3.1. modification de champ IP/TCP ; table nat et chanes PREROUTING,POSTROUTING ;
cible SNAT, DNAT, MASQUERADE
Positionnez les rgles par dfaut DROP pour les chanes INPUT, OUTPUT, FORWARD
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

2.3.1.TODO: 1. Ajouter un schma


2.3.1.TODO: 2. --to-destination ipaddr[-ipaddr][:port-port You can add several --to-destination
options. If you specify more than one destination address, either via an address
range or multiple --to-destination options, a simple round-robin (one after
another in cycle) load balancing takes place between these adresses.
Que se passe t il si on tente une connexion sur eth1 sur le port 2222 ?
Que faut il faire pour que la translation fonctionne effectivement ? (dans un sens comme dans
l'autre)

Page 8 sur 12

Monday 07 April 2003


HELP : 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
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)

2.3.1.TODO: 3. --to-source ipaddr[-ipaddr][:port-port You can add several --to-source options. If


you specify more than one source address, either via an address range or multiple
--to-source options, a simple round-robin (one after another in cycle) takes place
between these adresses.
Autoriser tout trafic provenant de eth0 tre forward par notre machine
Autoriser tout trafic de statuts ESTABLISHED,RELATED tre forward par notre machine

Dsormais nous sommes en mesure d'obtenir la configuration suivante :

Page 9 sur 12

Monday 07 April 2003


Le but sera ici de se placer dans un cas concret, et de rpondre au mieux aux besoins de filtrage,
d'accs aux services et de qualit de service .
Le cas concret :

Nous considrerons qu' iptables est install sur la machine servant de routeur/firewall et nous allons
donc nous attacher crire le script pour cette machine.
Les machines, le routeur et le serveur plac dans la DMZ, doivent tre protges au mieux.
Le routeur a 3 interfaces rseau :
eth0(192.168.0.254) reli la DMZ
eth1(192.168.1.254) reli au LAN
ppp0(62.212.36.222) reli internet
La machine doit pouvoir tre joignable via SSH depuis le LAN, et depuis Internet.
Les machines du LAN doivent pouvoir aller sur Internet(HTTP et FTP).
Les machines du LAN doivent pouvoir pinger une machine sur Internet.
Sur la DMZ, la machine 192.168.0.1 hberge le site web de l'entreprise, un relay mail et un serveur
imap-ssl qui doivent tre joignable, depuis le LAN, et depuis Internet. Cette machine doit aussi tre
joignable par SSH depuis le LAN et depuis Internet.
Page 10 sur 12

Monday 07 April 2003


La machine est une debian et est maintenu jour via apt, aussi la machine devra pour pouvoir aller
tlcharger via FTP et HTTP les mises jours sur par exemple ftp.fr.debian.org.
On veut mettre en place un proxy transparent sur un serveur ddi (192.168.0.2) situ dans la
DMZ, que faudrait il changer dans notre script ?

HELP : Un firewall bloque tout par dfaut


HELP : Un script firewall commence toujours par effacer toutes les rgles(par dfaut ou
cres par un utilisateur) qui pourraient tre actives
HELP : La gnration de log d'iptables est un atout majeur si les logs gnrs sont
clairs,prcis et lisibles
HELP : Le renvoi d'un TCP RST peut tre utile parfois pour amliorer les temps de rponses
HELP : Un certain nombre de restrictions sont accessibles via /proc/sys/net/ voir dans les
sources du kernel Documentation/networking/ip-sysctl.cfg
HELP : L'utilisation du suivi de connexion sur un systme scuris est recommand car
mme s'il induit une charge suprieur pour le routeur il est trs pratique
HELP : Attention la gnration de log qui peuvent occuper un volume qui pourrait saturer
le disque
HELP : La cration de ses propres chanes est avantage dont on peut difficilement se pass.
HELP : Un script firewall doit tre un maximum modulable(il est tout fait possible et mme
conseill d'y dclarer des variables, par exemple LAN=192.168.0.0/24), facilitant ainsi
grandement d'ventuels futures modifications
HELP : Un script non test est un mauvais script
HELP : Il est courant d'attaquer un serveur dans une DMZ en se servant d'une machine
vrol du LAN, il est donc trs important de scuriser les changes entre le LAN et la
DMZ, tout autant que ceux entre Internet et nos 2 rseaux.
[1] : en vrit le paquet n'arrive pas, physiquement parlant, dans la chane mais dans un souci de facilit de
comprhension je me suis permis cette lgre vulgarisation.
[2] : Type de Service : 8 bits
Le Type de Service donne une indication sur la qualit de service souhaite, qui reste cependant un paramtre
"abstrait". Ce paramtre est utilis pour "guider" le choix des paramtres des services actuels lorsqu'un
datagramme transite dans un rseau particulier. Certains rseaux offrent un mcanisme de priorit, traitant
prfrentiellement un tel trafic par rapport un trafic moins prioritaire (en gnral en acceptant seulement de
vhiculer des paquets d'un niveau de priorit au dessus d'un certain seuil lors d'une surcharge momentane).
Principalement, le choix offert est une ngociation entre les trois contraintes suivantes : faible retard, faible taux
d'erreur, et haut dbit.
Bits 0-2 : Priorit.
Bit 3 : 0 = Retard standard, 1 = Retard faible.
Bits 4 : 0 = Dbit standard, 1 = Haut dbit.
Bits 5 : 0 = Taux d'erreur standard 1 = Taux d'erreur faible.
Bit 6-7 : Rserv.
Page 11 sur 12

Monday 07 April 2003


+ 0 1 2 3 4 5 6 7 +
+-----+-----+-----+-----+-----+-----+-----+-----+
| PRIORIT

| D | T | R | 0 | 0 |

+-----+-----+-----+-----+-----+-----+-----+-----+
Aide :
HELP : man iptables : INCONTOURNABLE
HELP : iptables --help, iptables -p TCP --help, iptables -p icmp --help etc
HELP : iptables -L : liste les rgles iptables actives
HELP : un certain nombre de paramtre sont activable via le systme de fichier virtuel /proc,
par exemple pour activer le port forwarding on s'y prends comme cela :
HELP : echo 1 > /proc/sys/net/ipv4/ip_forward
HELP : /etc/services(voir aussi /etc/protocols) : liste les services et leur numro de port
HELP : /usr/include/linux/icmp.h : liste des noms des diffrents type et code icmp
HELP : http://www.netfilter.org/documentation/HOWTO/fr/packet-filtering-HOWTO.html
HELP : http://christian.caleca.free.fr/netfilter/
HELP : D'une manire gnrale quand on ne comprends pas ce qui ce passe(pourquoi a
marche ? pourquoi a marche pas ?) on place une rgle de log et on regarde les logs
ainsi cres

Page 12 sur 12