1.Routage et firewalling

Transcription

1.Routage et firewalling
1.Routage et firewalling
1.1. Introduction
Nous allons voir comment adapter Linux comme passerelle et filtrer les paquets grâce à iptables et les
options du noyau (/proc). La passerelle sera capable d’interconnecter plusieurs réseaux tout en
laissant passer seulement les paquets que nous aurons définis.
1.2. Présentation d'Iptables
Iptables est un firewall complet et très puissant fonctionnant sous Linux (noyaux 2.4), il remplace
Ipchains qui fonctionnait sur les noyaux 2.2.
Iptables permet de faire du firewalling stateful (à états), de la translation de port et d'adresse mais
aussi du filtrage au niveau de la couche 2 (adresse MAC) et beaucoup d'autres choses (modification
des paquets à la volée ...).
1.3. Installation
Iptables doit être installé dans /sbin/iptables si ce n'est pas le cas (iptables est installé de base dans les
distributions récentes) il faut télécharger Iptables sur www.netfilter.org/download.html et
télécharger la dernière version.
Il faut ensuite se placer dans le répertoire où Iptables à été téléchargé et exécutez les commandes
suivantes :
# tar jxvf iptables-x.y.z.tar.bz2
# cd iptables-x.y.z
# make KERNEL_DIR=<<chemin_vers_les_sources_du_noyaux>>
# make install KERNEL_DIR=<<chemin_vers_les_sources_du_noyaux>>
Par défaut les sources se trouvent dans /usr/src/linux-2.4.x/ ou /usr/src/linux (lien symbolique)
Exemple :
# make KERNEL_DIR=/usr/src/linux-2.4.21/
.....compilation....
# make install KERNEL_DIR=/usr/src/linux-2.4.21/
.....compilation.....
1.4. Options de compilation du noyau
Iptables agit au niveau du noyau il est donc necessaire d’activer certaines options à la compilation (en
du ou en modules).
Lors de la configuration du noyau il faut activer l’option « Network packet filtering » dans la section
« Networking options », il faut ensuite aller dans la sous section « Netfilter configuration » et activer
les options nécessaires suivant ce que requiert le firewall.
1.5. Vérification
Iptables doit être installé dans /sbin/iptables, il suffit donc de taper simplement iptables en root.
Pour vérifier que iptables est bien disponible avec toutes les options :
# iptables -L
Vous devriez obtenir un message ressemblant à ceci :
ades:~# iptables -L
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
Ou sinon :
iptables v1.2.3: can't initialize iptables table `filter': ...
Perhaps iptables or your kernel needs to be upgraded.
Si on a besoin de pouvoir forwarder les paquets IP (dans la plupart des cas), il sera nécessaire
d'exécuter cette commande (par défaut ip_forward est initialisé à 0) :
echo 1 > /proc/sys/net/ipv4/ip_forward
1.6. Fonctionnement d’Iptables
Une table est constituée d'un nombre arbitraire et illimité de chaînes. Une chaîne est une suite de
règles qui sont constituées d'un modif (pattern) qui reconnaît des paquets selon des critères (matches),
et d'une décision appelée cible (target) qui agit lors de la reconnaissance du paquet décrit
précédemment dans la règle. Dès qu'une règle matche un paquet, elle est déclenchée et la suite de la
chaîne est ignorée.
1.6.1.Les tables
- Table NAT (Network Address Translation) : Table utilisée pour la translation d'adresse ou de port.
Il y a 2 types de chaînes : PREROUTING : paquets entrants sur le firewall et POSTROUTING pour les
paquets sortants du firewall.
Il existe 3 targets : MASQUERADE, SNAT et DNAT (expliquées plus bas dans l'article).
- Table FILTER : Ceci est la table par défaut lorsque on ne spécifie aucune table. Elle contient toutes
les règles de filtrage : INPUT pour les paquets entrants, OUPUT pour les paquets sortants et
FORWARD pour les paquets traversants le firewall.
Les différentes cibles sont : ACCEPT, DENY, REJECT, DROP (expliquées plus bas dans l'article).
-Table Mangle : Cette table permet de modifier les paquets, elle est très peu utilisée et ne sera pas
développée dans ce cours.
1.6.2.Les cibles
Lorsqu'un paquet correspond au motif de reconnaissance d'une règle, une décision est prise (Voir ci
dessous)
SNAT
Permet de modifier l'adresse source du paquet.
DNAT
Permet de modifier l'adresse de destination du paquet.
MASQUERADE
La passerelle (la machine où est installée Iptables) transforme les paquets sortants pour donner
l'illusion qu'ils sortent de celle-ci par un port alloué dynamiquement ; lorsque la passerelle reçoit une
réponse (d'Internet par exemple) sur ce port, elle utilise une table de correspondance entre le port et
les machines du réseau local qu'elle gère pour lui faire suivre le paquet.
Policy ACCEPT :
Permet d'accepter un paquet si la règle est vérifiée.
Policy DROP :
Permet de rejeter le paquet avec un retour d'erreur à l'expéditeur si la règle est vérifiée
Policy DENY :
Permet de rejeter le paquet sans retour d'erreur à l'expéditeur si la règle est vérifiée.
1.6.3.Les commandes principales
Iptables est un logiciel qui fonctionne uniquement en ligne de commande, nous allons donc présenter
les principales commandes :
-L --list : affiche les règles d'une chaîne
Exemples :
# iptables -L
# Affiche toutes les règles de toutes les
chaînes de la table FILTER.
# iptables -L OUTPUT
# Affiche toutes les règles de la chaîne
OUTPUT.
-A --append : Ajoute une règle à la fin de la chaîne spécifie.
Exemple :
# iptables -A OUTPUT option
de la chaîne OUTPUT.
# Ajoute la règle 'option' à la fin
-D --delete : Supprime une chaîne. Il y a 2 manières de supprimer une règle soit en stipulant le numéro
de cette règle soit en recopiant la règle.
Exemple :
# iptables -d OUTPUT --dport 22 -j DROP
# Supprime la règle
OUTPUT -dport 22 (ssh) -J DROP
# iptables -d OUTPUT 1
# Supprime la première règle
de la chaîne OUTPUT
-I --insert : permet d'insérer une règle dans une chaîne.
Exemple :
# iptables -I OUTPUT 1 --dport 22 -j DROP
# Insère la règle -dport 22 -j DROP avant la règle 1 (cette règle devient donc la
première) .
-R --replace : remplace la règle spécifiée par une autre règle.
Exemple :
# iptables -R OUTPUT 1 # Remplace la première règle de la chaîne
OUTPUT par -dport 22 -J DROP.
F --flush : Permet d'effacer toutes les règles d'une chaîne.
Exemple :
# iptables -F
chaînes.
# iptables -F INPUT
INPUT.
#
Efface toutes les règles de toutes les
#
Efface toutes les règles de la chaîne
-P --policy : spécifie au noyau la Target à appliquer par défaut à une chaîne
Exemple :
# iptables -P OUTPUT DENY
# utilise la target DENY par défaut
si aucune règle ne s'applique au paquet
-N --new-chain : Permet de créer une nouvelle chaîne.
Exemple :
# iptables -N TOTO
# Créer une nouvelle chaîne TOTO.
-X --delete-chain : Supprime la chaîne spécifiée.
Exemple :
# iptables -X TOTO
# Supprime la chaîne TOTO.
1.6.4.Commandes pour filtrer
Précision :
- Les adresse et masque de sous réseau peuvent être spécifiées de cette manière : 192.168.0.7/24 ce
qui équivaut à 192.168.0.7 255.255.255.0
- Le "!" signifie le contraire (comme en programmation).
-i --in-interface : spécifie l'interface réseau (eth1 par exemple) d'entrée.
Exemple :
# iptables -A INPUT -p udp -i eth1 -J DENY # interdit le protocole
UDP sur l'interface eth1 (en en
trée).
-p –protocol : spécifie un protocole udp,tcp... ou all (pour tous les protocoles)
Exemple :
# iptables -A INPUT -p icmp -J ACCEPT # Autorise le protocole ICMP
(ping) en entrée.
-s --source : Spécifie une adresse source à matcher
Exemple :
# iptables -A OUTPUT -p udp -s 192.168.1.8 -J ACCEPT
# Autorise
l’hôte 192.168.1.8 à sortir du firewall (pour le protocole UDP).
-d --destination : Spécifie une adresse de destination.
Exemple :
# iptables -A FORWARD -p udp -d 192.168.1.1 -J ACCEPT
renvoie (Forward) tous les paquets udp vers 192.168.1.1
#
Ceci
--sport -source-port : Spécifie le port source (ou une plage de port avec l’option -m multiport)
Exemple :
# iptables -A INPUT -p tcp --sport 80 -J ACCEPT
port 90 (Web) en entrée.
#
Accepte
le
# iptables -A INPUT -p tcp -m multiport --sport 80,21,22 -J ACCEPT
# Accepte le port 80,21,22 en entrée.
--dport --destination-port : Spécifie le port de destination (ou une plage de port avec l’option -m
multiport).
Exemple :
# iptables -A INPUT -p tcp --dport 21 -J ACCEPT
le port 21 (FTP) en entrée.
# Accepte
# iptables -A OUPUT -p tcp -m multiport --dport 6667,6668 -J
DROP # Refuse les ports 6667 et 6668 et sortie (Pas d’IRC).
-i --in-interface : Spécifie une interface d’entrée.
Exemple :
# iptables -A INPUT -p udp -i eth0 -J DROP #
UDP en entrée sur l’interface eth0.
Refuse
le
protocole
-o --out-interface : Spécifie une interface de sortie.
Exemple :
# iptables -A OUTPUT -p tcp --dport 22 -o eth0 -J DENY
#
Refuse
le ssh (port standard) en sortie de l’interface eth0 (si eth0 est
reliée au web alors les clients ne pourront pas se connecter en ssh
sur internet.)
--mac-source : spécifie une adresse MAC a matcher
Exemple :
# iptables -A --mac-source 00-08-6C-E0-1B-BE -J DROP
l’adresse MAC 00-08-6C-E0-1B-BE en entrée.
# Interdit
--icmp-type : Spécifie un type de paquet ICMP a matcher.
Exemple :
# iptables -A INPUT -p icmp --icmp-type 16 -j DROP
--state : spécifie l'état du paquet à matcher dont voici les état possibles :
NEW : Paquet demandant une nouvelle connexion
ESTABLISHED : Paquet associé à une connexion déjà établie
RELATED : Nouvelle connexion liée (FTP par exemple)
INVALID : Connexion inconnue.
Voir la partie "Exemples concrets" pour un exemple d'utilisation des states.
Les Logs :
--log-level : Spécifie le level des logs
--log-prefix : Spécifie un préfix dans le fichier de log.
Voir la partie "Exemples concrets" pour un exemple d'utilisation des logs.
Règles NAT :
--to-destination :
Utiliser avec la cible DNAT, permet de spécifier l'adresse de destination de la translation.
Exemple :
# iptables -t nat -A PREROUTING -s 193.236.52.36 -p tcp --dport
5660 -j DNAT --to-destination 192.168.0.7:5660
Route les paquets venant de 193.236.52.36 en tcp (port 5660) vers
l'adresse privée 192.168.0.7 (port 5660 également).
--to-source :
Utiliser avec la cible SNAT, permet de spécifier l'adresse source de la translation.
S'utilise de la même manière que --to-destination.
1.7. Exemples concrets
Nous admettrons que le réseau local est 192.168.0.0/24 et qu’Internet est relié par l'interface eth0.
Ces différents exemples résument les commandes étudiées précédemment ce qui signifie que vous
devez avoir assimiler les commandes précédentes pour comprendre ces exemples.
Application des politiques par défaut (Indispensables pour un firewall digne de ce nom) :
# iptables -P INPUT -j DROP
# iptables -P OUTPUT -j DROP
# iptables -P FORWARD -j DROP
-> met les chaînes INPUT, OUTPUT, FORWARD à DROP (on refuse tout par défaut).
Pour tout accepter sur l'interface lo (indispensable) :
# iptables -A INPUT -i lo -j ACCEPT
# iptables -A OUTPUT -o lo -j ACCEPT
Pour tout accepter sur le réseau local :
# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT
# iptables -A OUTPUT -d 192.168.0.0/24 -j ACCEPT
# iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
Pour router les paquets (partager la connexion) :
Il faut activer le forwarding ->
# iptables -F FORWARD
# iptables -A FORWARD -j ACCEPT
Il faut ensuite cacher les machines se situant derrière le firewall :
# iptables -A POSTROUTING -t nat -o eth0 -j MASQUERADE
Note : N'oubliez pas d'activer le forwarding au niveau système :
# echo 1 > /proc/sys/net/ipv4/ip_forward
Pour logger tout ce qu'on refuse (DROP) :
#
#
#
#
#
#
iptables
iptables
iptables
iptables
iptables
iptables
-N
-A
-A
-A
-A
-A
LOG_DROP # On crée une nouvelle chaîne
LOG_DROP -j LOG --log-prefix ' DROPING PAQUET : '
LOG_DROP -j DROP
INPUT -j LOG_DROP
OUTPUT -j LOG_DROP
FORWARD -j LOG_DROP
Pour accepter les requêtes DNS :
# iptables -A INPUT -i eth0 -p tcp --sport 53 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --dport 53 -j ACCEPT
# iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
# iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT
Pour pouvoir surfer :
# iptables -A INPUT -i eth0 -p tcp --sport 80 -m state --state
ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --dport 80 -m state --state
NEW,ESTABLISHED -j ACCEPT
Pour autoriser le ssh :
De même que pour surfer, il suffit juste de préciser le port 22 au lieu du port 80.
De même pour le SMTP (port 25), POP 3 (port 110), IMAP (143 et 220), IRC (port 6667, 6668), CVS
(port 2401), HTTPS (port 443), Counter-Strike (port 27015)...
Tous ces ports sont évidemment les ports par défaut des différents protocoles, ils peuvent changer
suivant la configuration des services, les ports par défaut sont mentionnés dans le fichier /
etc/services.
Pour activer le FTP :
Vous pouvez remarquer que je n'ai pas stipulé le FTP, en effet le protocole FTP a besoin de quelques
manipulations supplémentaires.
Il faut charger les modules ip_conntrack_ftp et ip_nat_ftp (si vous natez vos connections FTP).
Pour activer les modules :
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
Il n’y a pas besoin de taper ces commandes si ces modules sont compilés "dur" dans le kernel (option
[*]) ou si il sont chargés au démarrage (fichier /etc/modules.conf).
Il faut ensuite taper ces commandes :
# iptables -A INPUT -i eth0 -p tcp --sport 21 -m state --state
ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --dport 21 -m state --state
NEW,ESTABLISHED -j ACCEPT
- on établit la connexion sur le port 21 (port par défaut).
# iptables -A INPUT -i eth0 -p tcp --sport 20 -m state --state
ESTABLISHED,RELATED -j ACCEPT
# iptables -A OUTPUT -o eth0 -p tcp --dport 20 -m state --state
ESTABLISHED -j ACCEPT
-> Pour que le serveur puisse établir la connexion pour les données (en mode actif).
# iptables -A INPUT -i eth0 -p tcp --sport 1024::65535 --dport
1024::65535 -m state --state ESTABLISHED -j ACCEPT
# iptables -A INPUT -o eth0 -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).