4. 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 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).

4.1. Fonctionnement minimal

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 udp1       17 8 src=198.168.200.22  dst=176.9.82.673  sport=36322 dport=123
   src=176.9.82.67 dst=aaa.bbb.ccc.74 sport=123 dport=36322 mark=0 zone=0 use=2
ipv4     2 tcp      6 113 TIME_WAIT5  src=203.0.113.1 dst=203.0.113.4 sport=38940
   dport=226  src=203.0.113.4 dst=203.0.113.1 sport=22 dport=38940 [ASSURED]
   mark=0 zone=0 use=2

1

Protocole de transport utilisé.

5

État de la connexion TCP.

2

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

3

Adresse IPv4 destination. Il s'agit d'une adresse publique sur l'Internet.

6

Le numéro de port destination du paquet identifie service Internet utilisé : SSH.

4

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.

4.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> -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