IpTables par l’exemple
Copie de lâarticle: http://www.lea-linux.org/cached/index/Reseau-secu-iptables.html
Introduction
Cet article prĂ©sente de façon pratique la mise en place dâun firewall / proxy sur une machine GNU/Linux tournant avec un noyau 2.4 (au moins).
Pour des informations plus thĂ©oriques sur les firewall/proxies, vous pouvez lire lâarticle firewall.
PrĂ©sentation dâIpTables
IpTables est une solution complĂšte de firewall (noyau 2.4) remplaçant ipchains (noyau 2.2) tournant sous le systĂšme GNU/Linux. IpTables permet de faire du firewalling stateful (Ă Ă©tats), de la translation de port et dâadresse, du filtrage au niveau 2 et beaucoup dâautres choses que nous nâallons pas aborder comme le âMangleâ ou modification des paquets Ă la volĂ©e (atchoum).
IpTables est fiable et dispose de trĂšs nombreuses options qui permettent de faire du filtrage trĂšs fin.
Une prĂ©cision: on parle souvent de « iptables » par abus de langage, alors que le nom du logiciel est « Netfilter ». Netfilter est le module qui fournit Ă GNU/Linux les fonctions de pare-feu, de partage de connexions internet (NAT) et dâhistorisation du trafic rĂ©seau. iptables est en fait juste lâoutil qui permet Ă un administrateur de configurer Netfilter en mode utilisateur. iptables-restore et iptables-save sont deux commandes associĂ©es qui permettent de sauvegarder/restaurer la configuration Netfilter.
Licence de NetFilter
NetFilter est sous licence libre GPL,
1/ Installation
1.1/ Prérequis
IpTables est installé en standard sur de nombreuses distributions GNU/Linux récentes (kernel 2.4.x. ou supérieur).
IpTables a besoin au minimum dâun noyau 2.4 compilĂ© avec des options spĂ©ciales. Ceci ne pose pas de problĂšmes avec les noyaux 2.4 gĂ©nĂ©riques des principales distributions.
1.2/ Options de compilation du kernel
Si vous dĂ©sirez re-compiler votre kernel, il faut spĂ©cifier les options nĂ©cessaires au fonctionnement dâiptables.
Les options suivantes doivent ĂȘtres activĂ©es en module (M) ou dans le kernel (Y) :
CONFIG_PACKET
CONFIG_NETFILTER
CONFIG_IP_NF_CONNTRACK
CONFIG_IP_NF_FTP
CONFIG_IP_NF_IRC
CONFIG_IP_NF_IPTABLES
CONFIG_IP_NF_FILTER
CONFIG_IP_NF_NAT
CONFIG_IP_NF_MATCH_STATE
CONFIG_IP_NF_TARGET_LOG
CONFIG_IP_NF_MATCH_LIMIT
CONFIG_IP_NF_TARGET_MASQUERADE
et éventuellement :
CONFIG_IP_NF_COMPAT_IPCHAINS pour garder la compatibilité avec ipchains.
CONFIG_IP_NF_COMPAT_IPFWADM pour garder la compatibilité avec ipfwadm.
CONFIG_IP_NF_TARGET_REDIRECT indispensable, pour les proxies transparents par exemple.
CONFIG_IP_NF_MATCH_MAC permet de matcher avec les adresses MAC.
Ne pas oublier le support rĂ©seau et TCP/IP et compiler le kernel comme dâhabitude :
make dep && make clean && make bzImage && make modules && make modules_install
1.3/ Installation
RĂ©cupĂ©rer le package netfilter et lâinstaller comme dâhabitude avec apt-get, urpmi, emergeâŠ
Notons que sur les versions inférieures a Red Hat 7.1, il faut compiler un kernel 2.4 car iptables ne supporte pas les kernels 2.2.x. La compilation de iptables est complexe. Le mieux est de lire le fichier INSTALL du package des sources.
1.4/ Chargement des modules
Dans le cas ou les options iptables du kernel ont été compilées en modules, il est nécessaire de charger ces modules avant de pouvoir utiliser iptables :
# modprobe ip_tables
selon les besoins, on peut éventuellement charger les modules suivants :
# modprobe ip_nat_ftp
# modprobe ip_nat_irc
# modprobe iptable_filter
# modprobe iptable_mangle
# modprobe iptable_nat
Si on a besoin de pouvoir rediriger (forward) les paquets IP arrivant sur un interface rĂ©seau (connectĂ©e par exemple Ă Internet) vers une autre interface rĂ©seau (connectĂ©e par exemple au rĂ©seau local), il sera nĂ©cessaire, dans la plupart des cas, dâexĂ©cuter cette commande :
# echo 1 > /proc/sys/net/ipv4/ip_forward
afin de lâindiquer au noyau.
Nota Bene : tous les modprobe semblent inutiles car le kernel les chargent automatiquement si lâon se sert de lâune des fonctionnalitĂ©s dâiptables.
2/ Présentation
2.1/ Les tables
* Table NAT (Network Address Translation) : Table utilisĂ©e pour la translation dâadresse ou la translation de port.
Il a 2 types de chaĂźnes# : PREROUTING qui permet de spĂ©cifier âĂ lâarrivĂ©e du firewallâ et la chaĂźne POSTROUTING qui permet de spĂ©cifier âĂ la sortie du firewallâ. Il existe 3 targets (ou cibles) : DNAT*, SNAT* et MASQUERADE*.
* Table FILTER : Câest la table par dĂ©faut lorsque lâon en spĂ©cifie pas.
Cette table contient toutes les rÚgles de filtrage, il existe 3 types de chaßnes : FORWARD pour les paquets passant par le firewall, INPUT pour les paquets entrant et OUTPUT pour les paquets sortants. Les cibles disponibles sont : ACCEPT, DENY, DROP, REJECT °.
* Table Mangle : Câest la table qui contient les rĂšgles pour la modification de paquets.
Elle est peu utilisée et ne sera pas décrite dans cet article.
A noter : Les rĂšgles sont Ă©valuĂ©es dans lâordre, par dĂ©faut la table FILTER est vide et donc accepte tout. Aucune rĂšgle de translation dâadresse nâest prĂ©sente par dĂ©faut.
# chaĂźne
une chaĂźne est une suite de rĂšgles, qui sont prises dans lâordre ; dĂšs quâune rĂšgle sâapplique Ă un paquet, elle est dĂ©clenchĂ©e, et la suite de la chaĂźne est ignorĂ©e.
* SNAT
permet de modifier lâadresse source du paquet.
* DNAT
permet de modifier lâadresse destination du paquet.
* MASQUERADE
Une passerelle (gateway) transforme les paquets sortants passant par elle pour donner lâillusion quâils sortent de la passerelle elle-mĂȘme par un port allouĂ© dynamiquement ; lorsque la passerelle recoit une rĂ©ponse sur ce port, elle utilise une table de correspondance entre le port et les machines du rĂ©seau privĂ© quâelle gĂšre pour lui faire suivre le paquet.
° policy ACCEPT
permet dâaccepter un paquet grĂące Ă la rĂšgle vĂ©rifiĂ©e.
° policy DROP
Rejet dâun paquet sans message dâerreur si la rĂšgle est vĂ©rifiĂ©e (ânon ! jâen veux pas mais je dis rien Ă lâexpediteurâ).
° policy REJECT
Rejet avec un retour de paquet dâerreur Ă lâexpediteur si la rĂšgle est verifiĂ©e (âun paquet recommandĂ© de La Poste refusĂ© par son destinataireâ).
° policy LOG
Affiche le resultat vers la sortie standard
peut etre associe a un prĂ©fixe pour une meilleure lisibilitĂ© (un prĂ©fixe pour les paquets rejetes,un autre pour les paquets forwardĂ©s etcâŠ)
Exemple : -j LOG âlog-prefix â[IPTABLES DROP] : â
2.2/ Les commandes
IpTables nâest pas livrĂ© avec une interface graphique ; les commandes et les rĂšgles sont passĂ©es en ligne de commande. Le mieux est dâĂ©crire des scripts (Ă rajouter dans /etc/rc.d/init.d) qui permettent dâappliquer toutes les rĂšgles dâun seul coup, dĂšs le dĂ©marrage du GNU/Linux.
2.2.1/ Commandes principales
-A âappend : Ajoute la rĂšgle Ă la fin de la chaĂźne spĂ©cifiĂ©e
Exemple :
# iptables -A INPUT âŠ
-D âdelete : Permet de supprimer une chaĂźne. On peut lâutiliser de 2 maniĂšres, soit en spĂ©cifiant le numĂ©ros de la chaĂźne a supprimer, soit en spĂ©cifiant la rĂšgle Ă retirer.
Exemples :
# iptables -D INPUT âdport 80 -j DROP
# iptables -D INPUT 1
-R âreplace : Permet de remplacer la chaĂźne spĂ©cifiĂ©e.
Exemple :
# iptables -R INPUT 1 -s 192.168.0.1 -j DROP
-I âinsert : Permet dâajouter une chaĂźne dans un endroit spĂ©cifiĂ© de la chaĂźne.
Exemple :
# iptables -I INPUT 1 âdport 80 -j ACCEPT
Si aucun chiffre nâest spĂ©cifiĂ© Ă la suite (#iptables -I INPUT âdport 80 -j ACCEPT), la rĂšgle est ajoutĂ©e au dĂ©but de la chaĂźne spĂ©cifiĂ©e
-L âlist : Permet dâafficher les rĂšgles.
Exemples :
# iptables -L # Affiche toutes les rĂšgles des chaĂźnes de FILTER
# iptables -L INPUT # Affiche toutes les rĂšgles de INPUT (FILTER)
-F âflush : Permet de vider toutes les rĂšgles dâune chaĂźne.
Exemple :
# iptables -F INPUT
-N ânew-chain : Permet de crĂ©er une nouvelle chaĂźne.
Exemple :
# iptables -N LOG_DROP
-X âdelete-chain : Permet dâeffacer une chaĂźne.
Exemple :
# iptables -X LOG_DROP
-P âpolicy : Permet de spĂ©cifier au noyau la politique par dĂ©faut dâune chaĂźne DENY, ACCEPT, REJECT, DROP âŠ
Exemple :
# iptables -P INPUT DROP
2.2.2/ Commandes pour matcher
Remarques :
Le â!â peut ĂȘtre utilisĂ© pour certaines commandes afin de spĂ©cifier le contraire (on peut le traduire par âsaufâ). Par exemple une commande qui doit refuser tout trafic TCP sauf ce qui provient de lâadresse IP 10.42.42.42 sera traduite par la commande suivante :
Exemple :
# iptables -A INPUT -p tcp âsource ! 10.42.42.42 -j DROP
Les adresses IP peuvent optionnellement ĂȘtre spĂ©cifiĂ©es avec le masque associĂ© sous la forme [adresse ip]/[masque].
-j (jump) : DĂ©fini lâaction Ă prendre si un paquet rĂ©pond aux critĂšres de cette rĂšgle: ACCEPT, LOG, DROPâŠ
Exemple :
# iptables -A INPUT -p icmp -j DROP
-p âprotocol : SpĂ©cifier un protocole : tcp, udp, icmp, all (tous)
Exemple :
# iptables -A INPUT -p icmp -j DROP
-s âsource : SpĂ©cifier une adresse source Ă matcher
Exemple :
# iptables -A INPUT -p tcp -s 192.168.42.42 -j ACCEPT
-d âdestination : SpĂ©cifier une adresse destination
Exemple :
# iptables -A FORWARD -p tcp -d 10.1.0.1 -j ACCEPT
-i âin-interface : SpĂ©cifier une interface dâentrĂ©e
Exemple :
# iptables -A INPUT -p icmp -i eth0 -j DROP
-o âout-interface : SpĂ©cifier une interface de sortie
Exemple :
# iptables -A OUTPUT -p icmp -o eth0 -j DROP
-f âfragment : Paquet fragmentĂ©
Exemple :
# iptables -A INPUT -p icmp -f -j DROP
âsport âsource-port : SpĂ©cifier le port source ou une plage de ports, fonctionne aussi en udp, -m multiport permet de
spécifier plusieurs ports à matcher.
Exemples :
# iptables -A INPUT -p tcp âsport 80 -j ACCEPT
# iptables -A INPUT -p udp âsport 80 -j DROP
# iptables -A OUTPUT -p tcp -m multiport âsport 3128,21,1000 -j DROP
# iptables -A OUTPUT -p tcp âsport 1024:2042 -j ACCEPT
âdport âdestination-port : SpĂ©cifier le port destination ou une plage de ports, fonctionne aussi en udp, -m multiport
permet de spécifier plusieurs ports a matcher.
Exemples :
# iptables -A INPUT -p tcp âdport 110 -j DROP
# iptables -A INPUT -p udp âdport 110 -j DROP
# iptables -A INPUT -p tcp -m multiport âdport 110,4242,119 -j DROP
# iptables -A INPUT -p tcp âsport 4925:4633 -j ACCEPT
âtcp-flags : SpĂ©cifier un flag tcp Ă matcher : SYN ACK FIN RST URG PSH ALL NONE
Exemple :
# iptables -A INPUT -p tcp âdport 42 âtcp-flags SYN,ACK -j ACCEPT
âicmp-type : SpĂ©cifier un type de paquet icmp Ă matcher
Exemple :
# iptables -A INPUT -p icmp âicmp-type 8 -j DROP
âmac-source : SpĂ©cifier lâadresse MAC Ă matcher
Exemple :
# iptables -A INPUT âmac-source 42.42.AA.42.42.AA -j DROP
En cas dâerreur, il peut-ĂȘtre nĂ©cessaire de spĂ©cifier le module mac, exemple :
# iptables -A INPUT -m mac âmac-source 42.42.AA.42.42.AA -j DROP
âstate : Permet de spĂ©cifier lâĂ©tat du paquet Ă matcher parmi les Ă©tats suivants :
ESTABLISHED : paquet associé à une connexion déjà établie
NEW : paquet demandant une nouvelle connexion
INVALID : paquet associé à une connexion inconnue
RELATED : Nouvelle connexion mais liée, idéal pour les connexions FTP
Exemples :
# iptables -A INPUT -i eth0 -p tcp âdport 80 -m state âstate NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp âsport 80 -m state âstate ESTABLISHED -j ACCEPT
Spécificités NAT :
âto-destination : UtilisĂ© en target pour le DNAT, permet de spĂ©cifier lâadresse de destination de la translation, on peut Ă©galement spĂ©cifier un port sâil est diffĂ©rent du port source.
Exemples :
# iptables -t nat -A PREROUTING -d 42.12.42.12 -p tcp âdport 110 -j DNAT âto-destination 192.168.1.2:6110
# iptables -t nat -A PREROUTING -d ! 42.12.42.12 -p tcp âdport 80 -j DNAT âto-destination 192.168.2.1:3128
âto-source : UtilisĂ© pour en target pour le SNAT, permet de spĂ©cifier lâadresse source de la translation.
Spécificités pour les LOGS :
âlog-level : Level, niveau de log
Exemple : Cf. chapitre 3
âlog-prefix : Permet de spĂ©cifier un prĂ©fixe pour les logs.
Exemple : Cf. chapitre 3
2.2.3/ Quelques exemples :
Les exemples qui suivent supposent que vous ĂȘtes reliĂ©s Ă internet par modem via lâinterface ppp0 (mais en remplaçant ppp0 par eth0 – par exemple, on peut adapter les exemples pour dâautres type de liaisons) et que votre rĂ©seau local est 192.168.1.0/24 (classe C).
* Pour fixer les politiques par dĂ©faut (cad: ce qui se passe quand aucune rĂšgle ne correspond – ne matche pas), ici, on refuse tout (normal, on fait un firewall, oui ou non ?) :
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
* Pour logguer tout ce quâon jette :
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG âlog-prefix â[IPTABLES DROP] : â
iptables -A LOG_DROP -j DROP
Les trois derniĂšres rĂšgles doivent ĂȘtre :
iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP
Enfin (pour loguer le trafic autorisé), recommencer en remplaçant -j DROP, par -j ACCEPT et a la place de -j LOG_DROP il faut mettre -j LOG_ACCEPT
* Pour accepter tout ce qui se passe sur lâinterface lo (sinon ce nâest pas la peine dâactiver le rĂ©seau !) :
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
* Pour accepter tout ce qui se passe sur le réseau local 192.168.1.0 :
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A OUTPUT -d 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT
* Pour accepter les résolutions de nom (ie: le dns) :
iptables -A INPUT -i ppp0 âprotocol udp âsource-port 53 -j ACCEPT
iptables -A OUTPUT -o ppp0 âprotocol udp âdestination-port 53 -j ACCEPT
iptables -A INPUT -i ppp0 âprotocol tcp âsource-port 53 -j ACCEPT
iptables -A OUTPUT -o ppp0 âprotocol tcp âdestination-port 53 -j ACCEPT
* Pour accepter le traffic web (on veut surfer!) :
iptables -A INPUT -i ppp0 âprotocol tcp âsource-port 80 -m state âstate ESTABLISHED -j LOG_ACCEPT
iptables -A OUTPUT -o ppp0 âprotocol tcp âdestination-port 80 -m state âstate NEW,ESTABLISHED -j LOG_ACCEPT
La premiĂšre ligne pour accepter ce qui entre sur notre interface ppp0 sur le port 80 (le port http) si câest une connexion dĂ©jĂ Ă©tablie, la seconde pour accepter ce qui sort sur ppp0 sur le port 80 si câest une nouvelle connexion ou si câest une connexion dĂ©jĂ Ă©tablie.
Pour autoriser le ssh, il faut prĂ©ciser le port 22; pour autoriser lâirc, le port 6667 (ou celui que vous utilisez pour vous connecter Ă votre serveur); pour le smtp (envoi dâemails), le port 25; pour le pop3 (rĂ©ception dâemails), le port 110; pour le imap (rĂ©ception dâemails), les ports 143 et 220 (imap3) ; pour le cvs, le port 2401 ; pour le https, le port 443. De maniĂšre gĂ©nĂ©rale, le numĂ©ros de port se trouvent dans /etc/services.
* Pour le ftp câest un peu plus complexe. Dâabord, il faut charger le module : ip_conntrack_ftp (câest lui qui suit – track en anglais – les connexions ftp) et, si vous natez (en utilisant le masquerading par exemple) vos connexions ftp vers dâautres postes le module : ip_nat_ftp :
modprobe ip_conntrack_ftp
# éventuellement : modprobe ip_nat_ftp
Ensuite, il faut taper les commandes suivantes :
iptables -A INPUT -i ppp0 -p tcp âsport 21 -m state âstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp âdport 21 -m state âstate NEW,ESTABLISHED -j ACCEPT
Cela pour que la connexion puisse sâĂ©tablir. Ensuite (et câest la quâon a besoin de ip_conntrack_ftp) :
iptables -A INPUT -i ppp0 -p tcp âsport 20 -m state âstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp âdport 20 -m state âstate ESTABLISHED -j ACCEPT
Pour que serveur puisse établir la connexion pour les données (en mode actif). Et enfin :
iptables -A INPUT -i ppp0 -p tcp âsport 1024:65535 âdport 1024:65535 -m state âstate ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o ppp0 -p tcp âsport 1024:65535 âdport 1024:65535 -m state âstate ESTABLISHED,RELATED -j ACCEPT
Pour que le serveur puisse établir la connexion pour les données (en mode passif). Ici aussi ip_conntrack_ftp est nécessaire.
* Pour partager une connexion, il faut que le forwarding soit activé dans le noyau (echo 1 > /proc/sys/net/ipv4/ip_forward), puis il faut autoriser iptable à faire le forwarding :
iptables -F FORWARD
iptables -A FORWARD -j ACCEPT
et enfin, cacher les machines forward-ées par le firewall :
iptables -A POSTROUTING -t nat -o ppp0 -j MASQUERADE
Sur chaque machine devant ĂȘtre cachĂ©e par le firewall (ou devant partager la connexion avec la machine qui est connectĂ©e Ă internet), il faut ajouter une route par defaut :
route add default gw 192.168.1.1
Si la machine connectĂ©e Ă internet a comme ip : 192.168.1.1. Il suffit avec une redhat/mandrake dâĂ©diter :
/etc/sysconfig/network
et dâajouter dedans :
GATEWAY=192.168.1.1
puis de redémarer le réseau :
/etc/rc.d/init.d/network restart
3/ Application par lâexemple
Nous allons mettre en place un firewall / proxy.
Pour cet exemple, le firewall aura la connexion à Internet (interface eth2) et disposera de 2 pattes sur des réseaux privés (eth0 et eth1) :
* il fait office de proxy sur le port 3128 pour un réseau qui aura ainsi un accÚs internet
* et une DMZ* (âzone dĂ©militarisĂ©eâ) sur laquelle il y a un ensemble de serveurs disponibles de lâextĂ©rieur dont un serveur web qui a pour adresse 192.168.1.2 Ă©coutant sur le port 80 en TCP.
_____Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â eth1 .-> —+——+——+—
_/Â Â Â Â _Â Â Â Â Â Â Â Â ____Â Â Â Â /Â Â Â Â [PC1]Â [PC2]Â [PC3]
(         ) eth2 |   |<–‘  rĂ©seau local 198.168.2.0
( INTERNET )<—->|Fire|
(_Â Â Â Â Â Â Â _) ppp0 |wall|
______/       |____|<–.  DMZ serveurs 198.168.1.0
eth0Â Â Â Â [WEB]Â [NEWS] [FTP]
‘-> —+——+——+—
ASCIIArt (c) Jice
La classe dâadresse IP 192.168.2.0 correspond au rĂ©seau interne sur lâinterface eth1.
La classe dâadresse IP 192.168.1.0 correspond a la DMZ sur lâinterface eth0.
Lâinterface de la connexion Internet est ppp0 sur lâinterface eth2.
* DMZ, ou zone démilitarisée
Sous-rĂ©seau dans lequel des serveurs accessibles depuis internet sont en adressage privĂ© (classe dâadresse IP rĂ©servĂ©e comme 192.168.x.x) derriĂšre un firewall.
3.1/ Le script init.d
Nous allons écrire un script qui permettra de charger automatiquement au démarrage de la machine ou sur demande les rÚgles du firewall qui seront stockées dans le fichier /etc/firewall.sh.
Le script de dĂ©marrage sera nommĂ© /etc/init.d/firewall. Bien sĂ»r, on nâoubliera pas dâexĂ©cuter un chmod +x sur les 2 scripts que nous allons crĂ©er au long de ce chapitre.
Go !
Fichier de chargement /etc/init.d/firewall :
#!/bin/bash
#
# Lancement du script de Firewall
# Arnaud de Bermingham. /etc/init.d/functions
RETVAL=0
# Fonction pour le lancement du firewall
start() {
echo -n âApplication des rĂšgles IpTables: â
/etc/firewall.sh
RETVAL=0
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/firewall
echo
}# Fonction pour arrĂȘter le firewall (on flush)
stop() {
echo -n âFlush des rĂšgles IpTables: â
/etc/flush_iptables.sh
RETVAL=0
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/firewall
echo
}case $1 in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
status)
/sbin/iptables -L
/sbin/iptables -t nat -L
RETVAL=0
;;
*)
echo âUsage: firewall {start|stop|restart|status}â
RETVAL=1
esacexit
Câest tout simple non ?
3.2/ Le script pour vider (flusher) les rĂšgles
Et maintenant : /etc/flush_iptables.sh.
#!/bin/sh
#
# Script pour vider les rĂšgles iptables
# Arnaud de Bermingham
# duracell@apinc.org#
# On remet la police par défaut à ACCEPT
#
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT#
# On remet les polices par défaut pour la table NAT
#
iptables -t nat -P PREROUTING ACCEPT
iptables -t nat -P POSTROUTING ACCEPT
iptables -t nat -P OUTPUT ACCEPT#
# On vide (flush) toutes les rĂšgles existantes
#
iptables -F
iptables -t nat -F#
# Et enfin, on efface toutes les chaĂźnes qui ne
# sont pas Ă defaut dans la table filter et natiptables -X
iptables -t nat -X# Message de fin
echo â [termine]âBon, on va enfin commencer les choses sĂ©rieuses : le script du firewall đ
3.3/ Les prérequis pour le script du firewall et création des tables pour les logs
Le script sera commenté au fur et à mesure, afin de décrire chaque étape.
#!/bin/sh# script /etc/firewall.sh
# Firewall dâexemple a but pĂ©dagogique
# Arnaud de Bermingham
# duracell@apinc.org# Activation du forwarding
# Câest pas pour faire joli, on aura des rĂšgles
# de forward et il faut bien que les paquets
# traversent la machine, donc on met ce fichier Ă 1echo 1 > /proc/sys/net/ipv4/ip_forward
# Alors la, on va appliquer quelques astuces
# pour empĂȘcher les attaques de type spoofing
# et bloquer les réponses ICMP du firewall,
# comme ça câest trĂšs propre. Attention, le
# fait de bloquer le trafic ICMP sur
# le firewall bloque les pings.# Je veux pas de spoofing
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]
then
for filtre in /proc/sys/net/ipv4/conf/*/rp_filter
do
echo 1 > $filtre
done
fi# pas de icmp
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts# On va utiliser iptables. Si on lâa compilĂ© en module
# dans le kernel, il faut charger le module ip_tables.modprobe ip_tables
# on va charger quelques modules supplémentaires pour
# gĂ©rer la translation dâadresse, lâIRC et le FTP
# Tu me fait 4 pompes. Chef oui chef !modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe iptable_filter
modprobe iptable_nat# Pour faire bien, on va vider toutes les rĂšgles
# avant dâappliquer les nouvelles rĂšgles de firewalliptables -F
iptables -X# On va rajouter 2 nouvelles chaĂźnes.
# Ceci permettra dâajouter des nouvelles cibles qui
# auront la possibilité de loguer ce qui se passe.# La on logue et on refuse le paquet,
# on rajoute un préfixe pour pouvoir
# sây retrouver dans les logs
iptables -N LOG_DROP
iptables -A LOG_DROP -j LOG
âlog-prefix â[IPTABLES DROP] : â
iptables -A LOG_DROP -j DROP# ici, on logue et on accepte le paquet,
# on rajoute un préfixe pour pouvoir
# sây retrouver dans les logs
iptables -N LOG_ACCEPT
iptables -A LOG_ACCEPT -j LOG
âlog-prefix â[IPTABLES ACCEPT] : â
iptables -A LOG_ACCEPT -j ACCEPT# On veut faire un firewall efficace,
# donc la politique a appliquer est de tout
# refuser par défaut et rajouter une a une
# les rĂšgles que lâon autorise.
# Bien sur, on a RTFM un peu et on a vu que
# lâoption -P permet de dĂ©finir
# la cible par défautiptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP# Pour éviter les problÚmes, on va tout accepter sur
# la machine en local (interface lo).
# Je déconseille de retirer cette rÚgle car
# ça pose pas mal de problÚmes et ça peut
# faire perdre la main sur la machineiptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT# Bon, la partie initialisation et préparation est
# terminĂ©e, passons aux choses sĂ©rieuses# Comme on lâa dit dans la prĂ©sentation de
# lâarchitecture rĂ©seau, le firewall fait
# également office de proxy grùce par exemple
# à un squid installé dessus. On va donc
# accepter que le proxy ait une connexion
# internet directe. Tant quâĂ faire, on va
# mettre des états pour que ça soit bien sécuriséiptables -A OUTPUT -o ppp0 -m state
âstate NEW,ESTABLISHED -p tcp âdport 80 -j ACCEPT
iptables -A INPUT -i ppp0 -m state
âstate ESTABLISHED -p tcp âsport 80 -j ACCEPT# Maintenant, on va faire en sorte que le
# proxy soit totalement transparent pour le LAN
# bénéficiant de la connexion internet.
# Lâastuce consiste a rediriger toutes les
# requĂȘtes ayant un port de destination 80
# vers le port 3128 du proxy, ici câest le
# firewall (qui est sur le firewall et qui
# a lâadresse IP 192.168.2.1 ).
# Une rÚgle de NAT suffira largement pour faire ça.iptables -t nat -A PREROUTING -i eth1 -p tcp
âdport 80 -j DNAT âto-destination 192.168.2.1:3128# Bon, câest pas trop compliquĂ© ! Maintenant
# on sait que lâon a un serveur web sur la DMZ
# (la machine dâadresse IP 192.168.1.2) sur
# le port 80. On souhaite que toutes les requĂȘtes
# provenant dâinternet arrivant sur lâadresse IP
# publique du serveur ( ici 42.42.42.42 ) soit
# redirigées sur le serveur web de la DMZ.
# Rien de bien compliquĂ©. Dans lâexemple,
# on peut retirer le :80 de la target
# âto-destinationiptables -t nat -A PREROUTING -d 42.42.42.42
-p tcp âdport 80 -j DNAT âto-destination 192.168.1.2:80# Câest bien tout ça ! mais le problĂšme câest
# que les chaĂźnes de la table FILTER sont toutes
# Ă DENY, donc tout ceci ne fait rien du tout.
# On va donc passer a la configuration du
# firewall proprement dit.# On va quand mĂȘme accepter les connexions ssh
# (port 22) provenant dâune machine (la votre en
# lâoccurrence, on va dire 192.168.2.42) vers le
# firewall pour pouvoir modifier les rĂšgles
# facilement pour bien surveiller, on vas quand
# mĂȘme loguer les connexions provenant de mon IP
# et Ă destination du ssh du firewalliptables -A INPUT -i eth1 -s 192.168.2.42 -m state
âstate NEW,ESTABLISHED -p tcp âdport 22 -j LOG_ACCEPT
iptables -A OUTPUT -o eth1 -d 192.168.2.42 -m state
âstate ESTABLISHED -p tcp âsport 22 -j LOG_ACCEPT# On veut que le LAN connectĂ© Ă lâinterface
# eth1 ait un accĂšs complet Ă internet.
# La rĂšgle de NAT qui permettait dâavoir
# un proxy transparent sera automatiquement
# appliquĂ©. Lâinterface correspondant
# Ă la connexion internet est ici ppp0iptables -A FORWARD -i eth1 -o ppp0 -j ACCEPT
iptables -A FORWARD -o eth1 -i ppp0 -j ACCEPT# Maintenant on donne le droit au LAN de
# consulter les pages web du serveur de la DMZiptables -A FORWARD -i eth1 -o eth0 -p tcp
âdport 80 -m state âstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp
âsport 80 -m state âstate ESTABLISHED -j ACCEPT# Maintenant il nây a plus quâĂ dire au firewall
# dâautoriser Ă transmettre des paquets TCP Ă
# destination du port 80 provenant de lâadresse
# IP publique (i.e. dâinternet) vers le serveur
# web de la DMZ que nous avons naté précédemment.iptables -A FORWARD -i ppp0 -o eth0 -p tcp
âdestination-port 80 -m state âstate NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o ppp0 -i eth0 -p tcp
âsource-port 80 -m state âstate ESTABLISHED -j ACCEPT# Maintenant il ne reste plus grand chose Ă faire !
# Il faut permettre Ă lâensemble du LAN de dialoguer
# sur internet avec la mĂȘme adresse IP sinon, bien
# évidemment ça ne marchera pas (à moins que vous
# ayez 30 adresses ip !).
# Une petite rĂšgle de NAT avec un -j MASQUERADE
# suffira (masquerade = dialoguer avec lâadresse
# IP publique sur firewall)iptables -t nat -A POSTROUTING
-s 192.168.2.0/24 -j MASQUERADE# Il faut également que le serveur web de la DMZ
# soit masqueradé sinon, le serveur
# dialoguera sur internet avec son IP privéeiptables -t nat -A POSTROUTING
-s 192.168.1.0/24 -j MASQUERADE# Toutes les rĂšgles qui nâont pas passĂ© les
# rĂšgles du firewall seront refusĂ©es et loguĂ©esâŠ
# facile :iptables -A FORWARD -j LOG_DROP
iptables -A INPUT -j LOG_DROP
iptables -A OUTPUT -j LOG_DROP# Pour faire zoli
echo â [Termine]â# câest enfin fini
Et voilĂ ! le firewall de compĂštâ est prĂȘt et fonctionnel.
Ceci était bien évidemment un exemple, vous pouvez dÚs à présent préparer votre propre firewall personnalisé !
Vous pouvez lâadapter Ă vos besoins, votre connexion vers internet (par ADSL par exemple), etc.
Cette page est issue de la documentation âprĂ©-wikiâ de LĂ©a a Ă©tĂ© convertie avec HTML::WikiConverter. Elle fut créée par Arnaud de Bermingham le 12/11/2001.