next up previous contents Next: Revenons à pppd. Up: Netfilter avec Iptables. Previous: Syntaxe.   Table des matières  


42.2.2.5 Application à notre pare-feu.

Le fichier dans lequel les modifications de votre pare-feu Netfilter ont lieu s'appelle /etc/sysconfig/iptables (sous RedHat ou Debian) ou /etc/conf.d/local.start (sous Gentoo). Lorsque vous avez modifiez vos règles, n'oubliez pas de les sauvegardez et d'activer le pare-feu avec les commandes suivantes:

/etc/init.d/iptables save 
/etc/init.d/iptables restart 


La première opération consiste à effectuer de la redirection (ou forwarding) d'adresses:

# Permettre le ``forwarding'' et le changement dynamique d'adresses: 
echo 1 > /proc/sys/net/ipv4/ip_forward 
echo 1 > /proc/sys/net/ipv4/ip_dynaddr 
 

Ensuite, nous nettoyons toutes les tables et fermons totalement le pare-feu. A l'issue de cette manipulation, si vous utilisez la commande ping, rien ne devrait se passer entre la passerelle et le réseau LAN ni entre les postes du réseau LAN et la passerelle. Les pings de la passerelle vers l'internet (et vice-versa) ne fonctionneront pas. En outre, les pings des hôtes du LAN vers l'internet ne répondront pas (d'une part, il n'y a pas de règle de NAT entre le réseau local et l'internet; d'autre part, le FORWARD effectue un DROP sur tous les paquets).

# On vide les règles: 
iptables -F 
# Suppression des règles une à une: 
iptables -X 
 
# On fait pointer les règles sur DROP:  
iptables -P INPUT DROP 
iptables -P OUTPUT DROP 
iptables -P FORWARD DROP 
 
# On vide des règles pour ``nat'' et ``mangle'': 
iptables -t nat -F 
iptables -t nat -X 
iptables -t mangle -F 
iptables -t mangle -X 


A présent, nous permettons à la passerelle de s'auto-pinguer sur 127.0.0.1. Nous autorisons aussi que, de la passerelle, un ping soit possible vers les hôtes du réseau privé et inversément. A ce stade, rien d'autre n'est permis (notez qu'il n'est pas forcément vrai que le réseau local soit sûr).

# la passerelle peut émettre dans tous les sens: 
iptables -A INPUT -i lo -j ACCEPT 
iptables -A OUTPUT -o lo -j ACCEPT 
 
# le réseau est supposé sûr: 
iptables -A INPUT -i eth0 -j ACCEPT 
iptables -A OUTPUT -o eth0 -j ACCEPT 


Autorisons le NAT, à présent, en effectuant une traduction d'adresses pour tout paquet qui traverse la passerelle en sortant via ppp0 [Notez que le NAT peut être restreint à une plage d'adresses IP de votre réseau LAN]:

ou à une liste d'adresses définies:



# établissement du NAT: 
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 


Pour l'instant, les pings du réseau local vers l'internet ne sont pas fonctionnels car FORWARD effectue toujours un DROP sur tous les paquets. Nous allons donc accorder des autorisations sur le FORWARD. Pour réaliser cette opération, nous utilisons le mécanisme de conntrack (ou suivi de connexions). Quoiqu'un peu consommateur de ressources sur la passerelle, le suivi de connexion permet d'obtenir des informations sur toute connexion en cours:

NEW
paquet demandant une nouvelle connexion,

ESTABLISHED
paquet associé à une connexion déjà établie,

RELATED
nouvelle connexion liée à une connexion établie (par exemple, dans le cas d'une connexion FTP active),

INVALID
paquet associé à une connexion inconnue.
Il est possible de n'accepter -et ce dans les deux sens (depuis et vers l'internet)- que les connexions déjà établies ou en relation avec des connexions déjà établies et, de n'accepter de nouvelles connexions que depuis votre réseau vers l'internet. Avec cette manière de procéder, votre réseau local peut se connecter sur tout serveur de l'internet, mais aucune nouvelle connexion ne peut être établie depuis l'internet vers votre réseau.

Nous allons donc faire en sorte que toutes les connexions nouvelles, établies et associées à une connexion déjà établie qui entrent par eth0 (réseau local) et qui veulent sortir par ppp0 (vers l'internet) puissent passer. Nous allons aussi permettre que toutes les connexions établies ou associées à une connexion déjà établie qui entrent par ppp0 et veulent aller vers eth0 puissent passer.

# toute connexion sortant du LAN vers internet= acceptée: 
iptables -A FORWARD -i eth0 -o ppp0 -m state -state NEW, ESTALISHED,RELATED -j ACCCEPT 
 
# seules les connexions établies ou en relation = acceptées (d'internet vers LAN): 
iptables -A FORWARD -i ppp0 -o eth0 -m state -state ESTABLISHED,RELATED -j ACCEPT 


Remarquez donc, l'utilisation de l'option -state. A présent, si vous essayez la commande ping -c 5 www.yahoo.fr, vous devriez obtenir une réponse.

En résumé, à ce stade, les machines du réseau local accèdent à la passerelle. De la passerelle, vous accéderz au réseau LAN. De l'internet, nul n'accède à la passerelle (DROP en INPUT sur ppp0). En outre, depuis l'internet, il n'est possible d'accéder aux hôtes du LAN que via des connexions déjà établies et dont ils sont clients. Autrement dit, aucun serveur du réseau local n'est accessible depuis l'internet.

Lecture du suivi des connexions.

Avant d'ouvrir des ports, nous pouvons déjà apprendre comment décoder les messages de suivi de connexions (conntrack). Le fichier-clé est /proc/ip_conntrack. Il contient des informations analogues à celles-ci:

tcp 6 14 CLOSE_WAIT 
         src=192.168.0.10 dst=213.186.35.33 sport=1102 dport=80 
         src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1102 [ASSURED] use=1  
 
tcp 6 431991 ESTABLISHED 
         src=192.168.0.10 dst=213.186.35.33 sport=1103 dport=80 
         src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1103 [ASSURED] use=1 
 
tcp 6 73 TIME_WAIT 
         src=192.168.0.10 dst=213.186.35.33 sport=1104 dport=80 
         src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1104 [ASSURED] use=1 
 
tcp 6 82 SYN_SENT 
         src=192.168.0.10 dst=213.186.35.33 sport=1105 dport=80 [UNREPLIED] 
         src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1105 use=1 
 
tcp 6 51 CLOSE_WAIT 
         src=192.168.0.10 dst=213.186.35.33 sport=1106 dport=80 
         src=213.186.35.33 dst=80.8.130.97 sport=80 dport=1106 [ASSURED] use=1 


Pour comprendre ces informations, il faut savoir qu'une des machines du LAN possède l'adresse IP 192.168.0.10 et que la passerelle a pour adresse IP sur le LAN: 192.168.0.255. L'adresse IP de la passerelle sur l'internet est 80.8.193.97. Le client navigue sur un serveur HTTP (sport=80) dont l'adresse IP est 213.186.35.33. Le troisième champ de chaque nouvelle entrée est un ``timer''. L'entrée est effacée de la table /proc/ip_conntrack lorsque le nombre atteint zéro. Cette table étant en mémoire (sur le fichier virtuel /proc), son contenu évolue constamment. Par ailleurs, sur un réseau domestique, l'occupation de la mémoire sera négligeable. Il en va autrement de l'utilisation du suivi de connexions dans les réseaux de grandes entreprises.

Nous pouvons maintenant reprendre la construction du pare-feu afin d'y ouvrir des ports sélectivement. Bien qu'il ne soit pas nécessaire, le service auth peut être ouvert de manière que les services se connectant reçoivent un message d'échec au lieu d'attendre le délai d'interruption. Cependant, pour des raisons de sécurité, vous devriez commentez la ligne auth dans /etc/inetd.conf.

Supposons que vous souhaitiez installer un serveur DNS sur votre passerelle, un SMTP (pour envoyer du courrier depuis le LAN sans se préoccuper des disponibilités du SMTP du FAI) et un accès SSH afin d'administrer à distante votre serveur depuis l'internet. Que devez-vous ajouter comme règles?

S'il faut que votre serveur réponde aux requêtes DNS, il est nécessaire d'ouvrir une voie UDP (voir /etc/services). Votre serveur envoie une requête UDP à destination du port 53 d'un serveur DNS et attend une réponse sur un port supérieur à 1025 (en provenance de 53).

# Autoriser des requêtes DNS locales: 
iptables -A OUTPUT -o ppp0 -p udp -sport 1024: -dport 53 -m state -state \ 
                                               ! INVALID -j ACCEPT iptables -A INPUT -i ppp0 -p udp -sport 53 -dport 1024: -m state -state \ 
                                               RELATED,ESTABLISHED -j ACCEPT


Notez l'utilisation de ! qui ressemble à l'opérateur logique NON (qui veut dire en l'occurrence: sauf) et de dport signifiant port de destination.

A présent, concernant le serveur SMTP, nous savons qu'il écoute sur le port 25 et utilise TCP:

# Autoriser des envois SMTP locaux: 
iptables -A OUTPUT -o ppp0 -p tcp -sport 1024: -dport 25 -m state -state \ 
                                              ! INVALID -j ACCEPT iptables -A INPUT -i ppp0 -p tcp -sport 25 -dport 1024: -m state -state \ 
                                              RELATED,ESTABLISHED -j ACCEPT


Enfin, pour que vous puissiez accéder à votre passerelle depuis l'internet (en supposant que vous puissiez relever son adresse IP à tout instant), il faut garder à l'esprit qu'SSH écoute le port 22 et utilise TCP:

# Autoriser l'accès SSH depuis l'internet: 
iptables -A INPUT -p tcp -dport ssh -i ppp0 -j ACCEPT 
iptables -A OUTPUT -p tcp -sport ssh -o ppp0 -j ACCEPT


Sauvegardez vos règles:

/etc/init.d/iptables save


et activez votre pare-feu:

/etc/init.d/iptables start


Ensuite, vérifiez que les ports devant rester ouverts le sont bel et bien.

Pour verrouiller le parefeu de sorte à ce que plus rien ne passe:

/etc/init.d/iptables panic


next up previous contents Next: Revenons à pppd. Up: Netfilter avec Iptables. Previous: Syntaxe.   Table des matières  
1-01-2006