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).
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 tcp6 431999 ESTABLISHED
src=192.168.200.2
dst=192.168.200.1
\ sport=33450 dport=22
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.2
dst=64.236.34.4
\ sport=33449 dport=80
packets=7075 bytes=368009 \ src=64.236.34.4 dst=aaa.bbb.ccc.7
\ sport=80 dport=33449 packets=9219 bytes=12839148 [ASSURED] mark=0 use=1
|
Protocole de transport utilisé. |
|
|
État de la connexion TCP. |
|
|
Adresse IP source. Cette adresse correspond à un poste client appartenant au périmètre Accès. |
|
|
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. |
|
|
À 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. |
|
|
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.
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
Vous êtes ici :