> les CGN [...] sont d'ores et déjà une réalité douloureuse dans de nombreux 
> pays d'Asie et peut-être demain sur d'autres continents
La contamination a déjà commencé: j'en ai croisé en prod avec pas mal de 
clients en Allemagne chez 2 operateurs, et bientôt aux pays bas, suisse et 
d'autres...

erik
-----Original Message-----
From: [email protected] [mailto:[email protected]] On Behalf Of 
Stephane Bortzmeyer
Sent: mercredi 1 mai 2013 11:04
To: [email protected]
Subject: [FRnOG] [TECH] RFC 6888: Common requirements for Carrier Grade NATs 
(CGNs)

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/


This message is for the designated recipient only and may contain privileged, 
proprietary, or otherwise confidential information. If you have received it in 
error, please notify the sender immediately and delete the original. Any other 
use of the e-mail by you is prohibited.

Where allowed by local law, electronic communications with Accenture and its 
affiliates, including e-mail and instant messaging (including content), may be 
scanned by our systems for the purposes of information security and assessment 
of internal compliance with Accenture policy.

______________________________________________________________________________________

www.accenture.com

---------------------------
Liste de diffusion du FRnOG
http://www.frnog.org/

Répondre à