Debian logo [inetdoc.LINUX]

5. Interconnexion et filtrage réseau

L'étude du filtrage réseau avec le noyau Linux sort du cadre de ce document. Il faut consulter les versions françaises du Guide Pratique du Filtrage de Paquets sous Linux 2.4 et du Guide Pratique du NAT sous Linux 2.4 pour obtenir les informations nécessaires.

D'un point de vue général, on dispose de deux solutions distinctes pour interconnecter les périmètres réseau administrés avec l'Internet.

  • Partager la table de routage des périmètres administrés avec les routeurs de l'Internet via un protocole de routage tel qu'OSPF. Consulter le guide Initiation au routage, 3ème partie pour obtenir des exemples complets d'exploitation du protocole de routage OSPF avec les services du logiciel GNU/Linux Quagga.

  • Camoufler les périmètres administrés derrière une adresse IP publique accessible depuis l'Internet. Cette opération est réalisée avec les fonctions de filtrage réseau du noyau Linux : netfilter pour la partie kernelspace et iptables pour la partie userspace.

C'est la seconde proposition qui offre le plus de facilités de contrôle immédiat sur les flux réseau. L'outil de camouflage (masquerading) généralement utilisé est appelé traduction d'adresses (Native Address Translation ou NAT).

5.1. Fonctionnement minimal

Après avoir activé le routage au niveau noyau (voir Section 4.3, « Activation de la fonction routage »), la fontion de camouflage est simple à mettre en oeuvre :

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

Cette règle réalise une traduction d'adresse source. Tout paquet IP sortant par l'interface eth1 voit son adresse IP source réécrite avec l'adresse IP de l'interface.

L'exécution de la règle entraîne le chargement des modules de gestion de la traduction d'adresses et du suivi dynamique de communication (stateful inspection).

# dmesg |grep ip_
ip_tables: (C) 2000-2002 Netfilter core team
ip_conntrack version 2.1 (4095 buckets, 32760 max) - 248 bytes per conntrack
# lsmod |grep ip
iptable_filter          3200  0
ipt_MASQUERADE          3712  1
iptable_nat            23516  2 ipt_MASQUERADE
ip_conntrack           44728  2 ipt_MASQUERADE,iptable_nat
ip_tables              22528  3 iptable_filter,ipt_MASQUERADE,iptable_nat
ipv6                  255936  12

Le suivi dynamique de communication consiste à conserver une empreinte de paquet sortant de façon à identifier les paquets retour relatifs à cette «demande». Les empreintes sont stockées dans la table /proc/net/ip_conntrack du système de fichiers virtuel du noyau Linux.

# cat /proc/net/ip_conntrack
tcp1     6 431999 ESTABLISHED2 src=192.168.200.23 dst=192.168.200.14 \
         sport=33450 dport=225 packets=417 bytes=31133 \
         src=192.168.200.1 dst=192.168.200.2 \
         sport=22 dport=33450 packets=306 bytes=111969 [ASSURED] mark=0 use=1
tcp      6 431999 ESTABLISHED src=192.168.200.26 dst=64.236.34.47 \
         sport=33449 dport=808 packets=7075 bytes=368009 \
         src=64.236.34.4 dst=aaa.bbb.ccc.79 \
         sport=80 dport=33449 packets=9219 bytes=12839148 [ASSURED] mark=0 use=1

1

Protocole de transport utilisé.

2

État de la connexion TCP.

3 6

Adresse IP source. Cette adresse correspond à un poste client appartenant au périmètre Accès.

4 7

Adresses IP destination. Dans le premier cas, la communication est interne au réseau du périmètre Accès. Dans le second cas, il s'agit d'une adresse sur l'Internet.

5 8

À partir du port destination du paquet sortant on peut identifier le service Internet utilisé : SSH et HTTP. Plus loin sur la même ligne, on retrouve les adresses IP source et destination attendues.

9

L'adresse IP destination attendue pour un paquet retour est l'adresse publique du Routeur GNU/Linux. Cette ligne montre bien que le routeur à la connaissance des réseaux internes et du réseau public. C'est à partir de ces correspondances d'adresses IP que les décision d'acheminement sont prises. Dans le cas de la traduction d'adresses par camouflage, l'adresse IP retour est réécrite avec l'adresse IP de l'hôte du périmètre Accès.

Si cette configuration a le mérite d'illustrer le fonctionnement du routage inter-VLAN de façon simple, elle ne correspond pas à un niveau de contrôle d'accès suffisant. L'objet de la section suivante est justement de chercher à augmenter ce niveau de contrôle.

5.2. Meilleur contrôle d'accès

Dans un premier temps, il faut garantir que tous les paquets IP non autorisés sont bloqués ; ce qui revient à appliquer la règle «tout ce qui n'est pas autorisé est interdit».

La traduction de cette règle en termes de configuration revient à jeter tous les nouveaux paquets par défaut sur les «chaînes» d'entrée et de traversée des interfaces réseau

# iptables -P INPUT DROP
# iptables -P FORWARD DROP

En toute rigueur, il faudrait faire de même avec la chaîne de sortie  OUTPUT. Cette présentation ayant pour but premier d'illustrer les concepts, ajouter les traitements de la chaîne OUTPUT ne ferait qu'alourdir les scripts sans apporter d'élément nouveau.

Dans un deuxième temps, il faut affiner la configuration du suivi de communication dynamique. La règle d'or du filtrage avec la fonction stateful inspection, c'est la description la plus fine possible du premier paquet qu'on autorise à passer.

La traduction de cette règle en termes de configuration contient 2 parties :

  • Un bloc de règles qui organise le suivi de communication pour chaque chaîne sur laquelle on appliqué la politique par défaut DROP.

    -A <CHAINE> -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT
    -A <CHAINE> -p tcp -m state --state ESTABLISHED -m tcp ! --syn -j ACCEPT
    -A <CHAINE> -p tcp -m state --state RELATED -m tcp --syn -j ACCEPT
    -A <CHAINE> -p icmp -m state --state ESTABLISHED -j ACCEPT
    
  • Des règles spécifiques à chaque flux autorisé. C'est à la rédaction de ces règles qui correspondent au premier paquet autorisé qu'il faut apporter le plus grand soin. Un exemple pour les paquets IP émis depuis le périmètre Accès sur la chaîne FORWARD :

    -A FORWARD -i eth0.200 -s 192.168.200.0/24 \
       -p tcp -m tcp --syn --sport 1024: -m state --state NEW -j ACCEPT
    -A FORWARD -i eth0.200 -s 192.168.200.0/24 \
       -p udp -m udp --sport 1024: -m state --state NEW -j ACCEPT
    -A FORWARD -i eth0.200 -s 192.168.200.0/24 \
       -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
    

Voici une version intermédiaire de script de configuration du filtrage pour le périmètre Accès. En supposant que le fichier des règles est stocké dans le répertoire /var/lib/iptables/, on active les règles avec une commande du type iptables-restore </var/lib/iptables/active.

# Configuration type du filtrage réseau 
# 
# !!Attention!! Toutes les lignes coupées avec '\' doivent être réalignées
# avant de pouvoir utiliser ce script avec la commande iptables-restore
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Tables de traduction d'adresses
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -o eth1 -p tcp --tcp-flags SYN,RST SYN \
               -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu
-A POSTROUTING -o eth1 -j MASQUERADE 
COMMIT
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# Tables de filtrage
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
#
# -> Chaîne INPUT
# . suivi de communication
-A INPUT -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p tcp -m state --state ESTABLISHED -m tcp ! --syn -j ACCEPT
-A INPUT -p tcp -m state --state RELATED -m tcp --syn -j ACCEPT
-A INPUT -p icmp -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p icmp --icmp-type destination-unreachable -m state --state RELATED -j ACCEPT
-A INPUT -p icmp --icmp-type time-exceeded -m state --state RELATED -j ACCEPT
# . toutes les communications internes sont autorisées
-A INPUT -i lo -m state --state NEW -j ACCEPT 
-A INPUT -i eth0.200 -m state --state NEW -j ACCEPT 
# . administration du Routeur GNU/Linux avec SSH
-A INPUT -i eth1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT 
# . services de gestion du commutateur vers le Routeur GNU/Linux
-A INPUT -i eth0 -s 192.168.2.1 -p udp \
         -m multiport --dports 69,123,162,514 -m state --state NEW -j ACCEPT 
# . poubelle propre
-A INPUT -m state --state INVALID -j DROP
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
#
# -> Chaîne FORWARD
# . suivi de communication
-A FORWARD -p udp -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A FORWARD -p tcp -m state --state ESTABLISHED -m tcp ! --syn -j ACCEPT
-A FORWARD -p tcp -m state --state RELATED -m tcp --syn -j ACCEPT
-A FORWARD -p icmp -m state --state ESTABLISHED -j ACCEPT
-A FORWARD -p icmp --icmp-type destination-unreachable \
           -m state --state RELATED -j ACCEPT
-A FORWARD -p icmp --icmp-type time-exceeded -m state --state RELATED -j ACCEPT
# . communications des hôtes du périmètre Accès
-A FORWARD -i eth0.200 -s 192.168.200.0/24 \
           -p tcp --syn --sport 1024: -m state --state NEW -j ACCEPT
-A FORWARD -i eth0.200 -s 192.168.200.0/24 \
           -p udp --sport 1024: -m state --state NEW -j ACCEPT
-A FORWARD -i eth0.200 -s 192.168.200.0/24 \
           -p icmp --icmp-type echo-request -m state --state NEW -j ACCEPT
# . poubelle propre
-A FORWARD -m state --state INVALID -j DROP
-A FORWARD -p tcp -j REJECT --reject-with tcp-reset
-A FORWARD -p udp -j REJECT --reject-with icmp-port-unreachable
COMMIT