http://www.bortzmeyer.org/6888.html
----------------------------
Auteur(s) du RFC: S. Perreault (Viagenie), I. Yamagata, S. Miyakawa (NTT
Communications), A. Nakagawa (Japan Internet Exchange (JPIX)), H. Ashida (IS
Consulting G.K.)
----------------------------
Qu'on les approuve (ce qui n'est pas mon cas) ou pas, les CGN, ces gros
routeurs NAT installés dans le réseau du FAI et gérant des centaines ou
des milliers de clients, sont d'ores et déjà une réalité douloureuse
dans de nombreux pays d'Asie et peut-être demain sur d'autres
continents. Pour limiter les dégâts qu'ils causent, ce RFC 6888 pose un
certain nombre de règles que *devraient* respecter ces CGN.
D'abord, qu'est-ce qu'un CGN ? Fonctionnellement, il ressemble au petit
routeur NAT (RFC 2663) que vous avez chez vous. Comme lui, il fait du
NAPT ("Network Address and Port Translation"), c'est-à-dire qu'il
traduit dynamiquement des adresses IP du réseau interne vers celles
utilisées à l'extérieur (et vice-versa pour les paquets dans l'autre
sens). La grosse différence avec le petit routeur ou "box" chez vous
est qu'il travaille pour de nombreux clients du FAI. Au lieu que
l'adresse IP externe soit partagée uniquement entre les membres de
votre cercle de famille, elle sera partagée avec des centaines
d'inconnus.
Avec le CGN, il y a souvent « double NAT », une fois dans le CPE et une
fois dans le CGN. Mais ce n'est pas obligatoire. Lorsqu'il y a double
NAT, on parle souvent de NAT444 <http://www.bortzmeyer.org/nats.html>
(deux traductions, d'IPv4 en IPv4).
Sur cette image, on voit
du double NAT. Un FAI gère un CGN. Les adresses IP publiques du FAI,
allouées par son RIR sont ici 198.51.100.0/25. Ce sont celles qui
seront vues, par exemple, par les sites Web où se connectent les
clients du FAI. Le FAI n'a pas assez d'adresses IP publiques pour son
réseau interne et il utilise donc le 10.0.0.0/8 du RFC 1918. Prenons
maintenant le client 1 : son réseau local a des adresses dans la plage
192.168.3.0/24. Les paquets seront donc émis avec ces adresses, NATés
une première fois par la machine CPE 2, vers l'adresse 10.0.5.22. Ils
seront ensuite NATés une seconde fois par le CGN.
Le CGN a des conséquences, par exemple dans le domaine légal (vous
pourrez voir les agents de la HADOPI débarquer chez vous parce qu'un
autre utilisateur du même CGN a téléchargé illégalement, cf. RFC 6269).
Et cela limite sérieusement les activités que vous pourrez avoir sur
l'Internet. Par exemple, un moyen courant d'accepter les connexions
entrantes, normalement interdites par le NAPT, est de configurer sa
"box" pour rediriger tel numéro de port vers tel service sur le réseau
local (par exemple pour faire fonctionner des applications pair-à-pair
<http://www.bortzmeyer.org/emule-ports-linux.html>). Le routeur CGN
étant partagé entre de nombreuses personnes qui ne se connaissent pas,
cela n'est plus possible. Contrairement au routeur NAT à la maison, le
CGN n'est *pas* géré par les abonnés, qui ne peuvent pas modifier sa
configuration.
D'autre part, la simple taille du CGN en fait un engin compliqué et
fragile, et sa panne affecte bien plus de clients que le redémarrage
d'une "box". Enfin, ayant moins de ports sources à sa disposition par
client, par rapport au routeur de la maison ou du SOHO, il risque plus
souvent de tomber à cours, si les clients font beaucoup de connexions
sortantes.
Mais, alors, pourquoi met-on des CGN ? Juste pour embêter les clients ?
En fait, les FAI n'ont pas forcément beaucoup le choix. La pénurie
d'adresses IPv4
<http://www.bortzmeyer.org/epuisement-adresses-ipv4.html>, bien que
niée par beaucoup de négationnistes, est réelle depuis de nombreuses
années. Par exemple, cela fait longtemps qu'on ne peut plus avoir une
adresse IP par machine à la maison. Mais, jusqu'à récemment, on pouvait
encore avoir une adresse IP publique par foyer. Désormais, l'espace
d'adressage IPv4 disponible se resserrant chaque jour, ce n'est même
plus le cas. S'il n'y a pas d'adresse IPv4 publique disponible pour
chaque client, le CGN est la seule solution pour pouvoir continuer à
faire de l'IPv4 (passer à IPv6 ferait moins de travail mais les acteurs
du marché sont frileux).
Cela, c'était la raison avouable pour mettre des CGN. Il y en a une
moins avouable, c'est que le CGN, grosse machine centrale et point de
passage obligatoire pour tous les abonnés, est bien en phase avec la
mentalité des opérateurs telco traditionnels. C'est ainsi que, dans
l'Internet mobile où les libertés sont bien plus limitées, et
l'utilisateur bien plus restreint dans ce qu'il a le droit de faire,
tous les opérateurs 3G ont déployé cette solution depuis longtemps,
refusant de donner une adresse IPv4 publique à chaque abonné, même
avant l'épuisement complet des réserves. Comme le note prudemment le
RFC, « "there are driving forces other than the shortage of IPv4
addresses" ».
À noter qu'un RFC décrit le déploiement de CGN comme une des techniques
pouvant aider à la transition vers IPv6 : RFC 6264. Le CGN est un des
composants de la solution DS-Lite, décrite dans le RFC 6333 et ce
composant doit donc suivre les règles données plus loin.
Maintenant qu'on a présenté les CGN, que contient ce RFC ? Il liste des
conseils qui, s'ils étaient appliqués, rendraient les CGN un peu moins
insupportables. Comme le note la section 1, la publication de ce RFC ne
signifie *pas* que l'IETF approuve ou même accepte les CGN, simplement
que, puisqu'ils existent, autant essayer de limiter leurs effets
négatifs. Comme un CGN est un routeur NAT, les précédents documents du
groupe de travail Behave <http://tools.ietf.org/wg/behave>, concernant
tous les types de NAT, s'appliquent aussi au CGN : RFC 4787, RFC 5382
et RFC 5508 notamment.
Les section 3 à 5 représentent donc le cœur de ce RFC. Elles
contiennent les recommandations spécifiques pour les CGN. Chacune est
nommée REQ-n où n est un numéro d'ordre. Ainsi, REQ-1 dit que, pour
chaque protocole de transport, le CGN doit suivre les recommandations
spécifiques à ce protocole (RFC 4787 pour UDP, RFC 5382 pour TCP, RFC
5508 pour ICMP, et RFC 5597 pour DCCP). Notons que les autres
protocoles de transport (comme SCTP) ont donc de sérieuses chances de
ne pas fonctionner au travers du CGN.
Exigence suivante, REQ-2, qui dit que le comportement de l'"IP address
pooling" doit être "paired". Cela signifie quoi ? Qu'une machine donnée
doit toujours obtenir la même adresse IP externe (un CGN, contrairement
au petit routeur NAT de la maison, a en général plusieurs adresses IP
externes à sa disposition). Cela limite les risques de casser les
applications. Le RFC 4787, section 4.1, donne les détails sur ce
concept de "paired".
À propos du nombre d'adresses externes disponible pour le CGN : REQ-3
exige que ces adresses puissent être en nombre quelconque et dans des
plages non-contigües (avec l'épuisement des adresses IPv4, il sera de
plus en plus dur de trouver des plages contigües).
REQ-4 traite un problème spécifique aux CGN, que n'avaient pas les
petits routeurs NAT de la maison : il faut pouvoir limiter le nombre de
ports utilisables par un utilisateur donné. Dans le NAPT, il y a moins
d'adresses externes que d'adresses internes. On se sert donc des ports
pour désambigüer. Un seul utilisateur gourmand pourrait lancer plein de
sessions et épuiser à lui seul la plage de ports disponibles (cela peut
même être volontaire, pour faire un déni de service, cf. section 8).
C'est pour se protéger contre cette attaque que REQ-4 exige une
limitation, configurable, par client. Le RFC recommande aussi qu'on
puisse limiter le rythme de création de sessions par utilisateur. C'est
nécessaire pour protéger les autres utilisateurs, mais c'est un des
gros inconvénients du CGN, qui casse sérieusement la transparence du
réseau et le principe de bout en bout. Les routeurs NAT cassaient ces
principes mais uniquement entre membres d'un même foyer ou d'un même
SOHO. Avec le CGN, on dépend de gens dont on ne connait rien.
Même chose avec REQ-5, consacrée à d'autres ressources partagées dans
le CGN, comme sa mémoire. Un CGN a des problèmes d'équité que n'ont pas
les routeurs NAT classiques, vue son utilisation entre personnes qui
n'ont rien en commun a priori.
Parfois, les cibles que vise l'utilisateur sont situées dans le réseau
du FAI, et donc atteignables sans traduction d'adresse. Pour ce cas,
REQ-6 demande que le CGN puisse être configuré pour ne pas traduire si
la destination est dans une liste d'adresses configurées par
l'administrateur réseaux.
Lorsqu'un routeur NAT accepte des paquets entrants du moment qu'il a,
dans sa table des traductions, une entrée pour ce couple {adresse,port}
de destination, indépendemment de l'adresse IP source d'émission, on
dit qu'il fait du "Endpoint-Independent Filtering" (RFC 4787, section
5 ?). REQ-7 souhaite que ce soit le comportement du CGN, car il casse
moins d'applications (notamment jeux en ligne et pair-à-pair) que le
"Address-Dependent Filtering" (où les paquets sont refusés si l'adresse
source n'est pas celle dans l'entrée de la table).
REQ-8 légifère sur la réutilisation d'un port externe lorsqu'il n'est
plus utilisé. Par défaut, il devrait rester réservé pendant deux
minutes, le "Maximum Segment Lifetime" de TCP (RFC 793, section 3.3),
après lequel on est sûr que le paquet ne traîne plus dans le réseau.
Cela permet d'éviter une collision entre une ancienne correspondance et
une nouvelle, qui utiliserait le même port externe et recevrait par
erreur de vieux paquets. Des exceptions sont prévues, notamment :
* Si le CGN met en œuvre la machine à états de TCP, il peut savoir
quand une connexion est terminée et réutiliser alors tout de suite le
port,
* Si certains ports sont statiquement affectés, ils restent utilisables
en permanence.
REQ-9 est plus ambitieux car il exige quelque chose qui n'existe pas
dans les CGN actuels : un mécanisme permettant à l'utilisateur de
changer les affectations de port, et que ce mécanisme soit de
préférence PCP ("Port Control Protocol", RFC 6887). Aujourd'hui, sur
les petits routeurs NAT de la maison ou du SOHO, ce mécanisme
d'affectation manuelle des correspondances {adresse externe, port
externe} -> {adresse interne, port interne} est typiquement fait par
l'interface Web d'administration du routeur, ou bien par UPnP. La
disparition d'un tel mécanisme dans les CGN actuels est un des plus
gros problèmes que posent les CGN. IL était donc nécessaire de le
rétablir, pour que toutes les applications puissent bien fonctionner.
Mais PCP est encore très récent et peu déployé.
REQ-10 concerne plutôt les besoins de l'opérateur plus que ceux des
simples utilisateurs : il demande que les routeurs CGN soient gérables
(MIB du RFC 4008, etc).
Une autre exigence, REQ-11 concerne le traitement des erreurs. Si un
routeur CGN ne peut pas créer une corrrespondance entre adresse+port
externe etinterne, il doit jeter le paquet et devrait renvoyer un
message ICMP "Destination unreachable" / code 1 ("Host unreachable").
et déclencher une "trap" SNMP. Le « devrait » (et pas « doit ») est
parce que ces deux types de messages peuvent légitimement avoir un
débit limité.
Pourquoi "Host unreachable" et pas "Communication administratively
prohibited" comme c'était le cas dans le RFC 5508, section 6 ? Parce
que le code 1 ("Host unreachable") est une erreur « douce » (cf. RFC
1122) et ne coupera pas les connexions TCP en cours entre les mêmes
machines (RFC 5461).
En outre, le RFC interdit de supprimer des entrées existantes dans la
table de correspondances, ce qui permettrait pourtant de faire de la
place pour de nouvelles connexions. C'est parce que la plupart des
applications gèrent beaucoup mieux une impossibilté à établir une
connexion qu'une perturbation ou une interruption d'une connexion en
cours (RFC 5508, section 6).
Un bon routeur CGN devrait pouvoir journaliser son activité. La section
4 encadre cette tâche. La principale question qui se pose est
l'identification des clients, si une adresse IP externe est repérée
pour son comportement abusif (envoi de spam, écriture d'un commentaire
de blog défavorable aux autorités, partage de fichiers musicaux, et
autres crimes). Le site distant va noter que « 192.0.2.42 a fait
quelque chose de mal » et les enquêteurs vont chercher la personne qui
est derrière cette adresse. En raison du CGN, des dizaines ou des
centaines de personnes peuvent avoir utilisé cette adresse. Pour que
l'enquêteur ait la moindre chance de retrouver le coupable, il faut que
le site distant journalise, non seulement l'adresse IP source (comme
c'est typiquement le cas aujourd'hui), mais aussi le port source
<http://www.bortzmeyer.org/loguer-adresse-et-port.html> (cf. RFC 6302).
*Et* il faut que le routeur CGN ait journalisé ses correspondances,
protocole de transport, adresse+port internes, adresse+port externes et
heure exacte. (C'est une obligation légale dans certains pays, par
exemple en France avec la LCEN.)
Non seulement c'est très Big Brother comme comportement mais, en plus,
cela peut rapidement produire une énorme quantité de données, ce qui ne
va pas faciliter la tâche de l'opérateur. C'est pour cela que REQ-12
demande que ce ne soit *pas* activé par défaut, à la fois pour
préserver la vie privée des utilisateurs et pour éviter de remplir les
disques durs.
Et, au fait, comment allouer aux utilisateurs cette ressource limitée,
les numéros de ports externes ? La section 5 formule trois exigences.
Le problème est que les trois sont contradictoires. REQ-13 dit qu'il
faudrait chercher à maximiser l'utilisation des ports (ils sont en
nombre limités, 65 536 par adresse IP), REQ-14 (qui a suscité beaucoup
de discussions dans le groupe de travail) qu'il faudrait minimiser le
nombre d'entrées produites dans le journal, par exemple en allouant
toute une plage de ports par adresse IP, et REQ-15 que, pour des
raisons de sécurité, il faudrait rendre difficile pour un attaquant la
prédiction des ports sélectionnés (RFC 6056). Pas de miracle, ces trois
exigences ne peuvent pas être satisfaites simultanément et un routeur
CGN doit donc choisir lequel est le plus important pour lui.
---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/