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 d'autres routeurs via un protocole de routage dynamique tel qu'OSPF.
-
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 3.3, « Activation de la fonction routage »), la fontion de camouflage est simple à mettre en œuvre :
#
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Cette règle réalise une traduction d'adresse source. Tout paquet
IPv4 sortant par l'interface
eth1
voit son adresse
IPv4 source réécrite avec
l'adresse IPv4 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).
#
lsmod | grep nat | fmt -t -w80
nf_nat_masquerade_ipv4 16384 1 ipt_MASQUERADE
iptable_nat 16384 1
nf_nat_ipv4 16384 1 iptable_nat
nf_nat 28672 2 nf_nat_masquerade_ipv4,nf_nat_ipv4
nf_conntrack 131072 7
nf_conntrack_ipv4,ipt_MASQUERADE,nf_conntrack_netlink,nf_nat_masquerade_ipv4,xt_conntrack,nf_nat_ipv4,nf_nat
libcrc32c 16384 2 nf_conntrack,nf_nat
ip_tables 24576 2 iptable_filter,iptable_nat
Le suivi d'état des échanges réseau 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/nf_conntrack
du système de fichiers virtuel du noyau Linux.
#
cat /proc/net/nf_conntrack | fmt -t -w80
ipv4 2 udp 17 8 src=198.168.200.2 dst=176.9.82.67 sport=36322 dport=123
src=176.9.82.67 dst=aaa.bbb.ccc.7 sport=123 dport=36322 mark=0 zone=0 use=2
ipv4 2 tcp 6 113 TIME_WAIT src=203.0.113.1 dst=203.0.113.4 sport=38940
dport=22 src=203.0.113.4 dst=203.0.113.1 sport=22 dport=38940 [ASSURED]
mark=0 zone=0 use=2
Protocole de transport utilisé. |
|
État de la connexion TCP. |
|
Adresse IPv4 source. Cette adresse correspond à un poste client appartenant au périmètre Accès. |
|
Adresse IPv4 destination. Il s'agit d'une adresse publique sur l'Internet. |
|
Le numéro de port destination du paquet identifie service Internet utilisé : SSH. |
|
L'adresse IPv4 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 IPv4 que les décisions d'acheminement sont prises. Dans le cas de la traduction d'adresses par camouflage, l'adresse IPv4 retour est réécrite avec l'adresse IPv4 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> -m conntrack --ctstate RELATED,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 -m conntrack --ctstate 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 /etc/iptables/
, on active les règles avec une
commande du type iptables-restore
</etc/iptables/rules.v4
.
# Filtrage réseau du périmètre Accès # #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # Tables de traduction d'adresses #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ *nat :PREROUTING ACCEPT [0:0] :POSTROUTING ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A POSTROUTING -o eth1 -p tcp --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 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # . toutes les communications internes sont autorisées -A INPUT -i lo -m conntrack --ctstate NEW -j ACCEPT -A INPUT -i eth0.200 -m conntrack --ctstate NEW -j ACCEPT # . administration du Routeur GNU/Linux avec SSH -A INPUT -i eth0 -p tcp -m tcp --syn --dport 22 -m conntrack --ctstate NEW -j ACCEPT # . services de gestion du commutateur vers le Routeur GNU/Linux -A INPUT -i eth0 -p udp -m multiport --dports 69,123,162,514 -m conntrack --ctstate NEW -j ACCEPT # . poubelle propre -A INPUT -m conntrack --ctstate 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 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT # . communications des hôtes du périmètre Accès -A FORWARD -i eth0.200 -s 192.168.200.0/24 -m conntrack --ctstate NEW -j ACCEPT # . poubelle propre -A FORWARD -m conntrack --ctstate 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