Avant de commencer à manquer d'adresses IPv4, nous n'utilisions pas (largement) le NAT. Chaque ordinateur connecté à Internet aurait sa propre adresse unique au monde. Lorsque le NAT a été introduit pour la première fois, il consistait à donner aux clients du fournisseur de services Internet une adresse réelle par périphérique utilisé / détenu par le client, à une adresse réelle à un client. Cela a résolu le problème pendant un certain temps (années) alors que nous étions supposés passer à IPv6. Au lieu de passer à IPv6, tout le monde (la plupart du temps) attendait que tous les autres basculent et ainsi (la plupart du temps) personne n’a déployé IPv6. Nous rencontrons à nouveau le même problème, mais cette fois-ci, une deuxième couche de NAT est en cours de déploiement (CGN) afin que les fournisseurs de services Internet puissent partager une adresse réelle entre plusieurs clients.
L’épuisement des adresses IP n’est pas un problème si le NAT n’est pas terrible, y compris dans le cas où l’utilisateur final n’a aucun contrôle sur celui-ci (Carrier Grade NAT ou CGN).
Mais je dirais que le NAT est terrible, en particulier dans le cas où l'utilisateur final n'en a pas le contrôle. Et (en tant que personne occupant un poste d'ingénieur / administrateur de réseau mais possédant un diplôme en génie logiciel), je dirais qu'en déployant la NAT au lieu d'IPv6, les administrateurs réseau ont transféré le poids de la résolution de l'épuisement des adresses de leur domaine aux utilisateurs finaux. et les développeurs d'applications.
Donc (à mon avis), pourquoi le NAT est-il une chose terrible et perverse à éviter?
Voyons si je peux lui rendre justice en expliquant ce qui se brise (et les problèmes que cela cause auxquels nous sommes devenus si habitués que nous ne réalisons même pas que cela pourrait être mieux):
- Indépendance de la couche réseau
- Connexions d'égal à égal
- Nom et localisation cohérents des ressources
- Routage optimal du trafic, les hôtes connaissant leur adresse réelle
- Suivre la source du trafic malveillant
- Protocoles réseau qui séparent les données et le contrôle en connexions distinctes
Voyons si je peux expliquer chacun de ces éléments.
Indépendance de la couche réseau
Les FAI sont censés simplement faire circuler les paquets de la couche 3 sans se soucier de ce qui se trouve dans les couches supérieures. Que vous transmettiez TCP, UDP ou quelque chose de mieux / plus exotique (SCTP peut-être? Ou même un autre protocole meilleur que TCP / UDP, mais qui reste obscur en raison d’un manque de prise en charge du NAT), votre FAI n’est pas supposé se soucier; tout est censé ressembler à des données.
Mais ce n'est pas le cas - pas lorsqu'ils mettent en œuvre la "deuxième vague" de NAT, NAT "Carrier Grade". Ensuite, ils doivent nécessairement examiner et prendre en charge les protocoles de couche 4 que vous souhaitez utiliser. À l'heure actuelle, cela signifie pratiquement que vous ne pouvez utiliser que TCP et UDP. D'autres protocoles seraient soit simplement bloqués / supprimés (dans la grande majorité des cas, selon mon expérience), soit simplement transférés au dernier hôte "à l'intérieur" du NAT utilisant ce protocole (j'ai déjà vu une implémentation qui le fait). Même le transfert vers le dernier hôte qui a utilisé ce protocole n’est pas un véritable correctif - dès que deux hôtes l’utilisent, cela se rompt.
J'imagine qu'il existe des protocoles de remplacement pour TCP et UDP qui n'ont actuellement pas été testés et qui n'ont pas été utilisés simplement à cause de ce problème. Ne vous méprenez pas, TCP et UDP étaient remarquablement bien conçus et il est étonnant de constater à quel point ils ont pu s'adapter à la manière dont nous utilisons Internet aujourd'hui. Mais qui sait ce que nous avons manqué? J'ai lu sur SCTP et ça sonne bien, mais je ne l'ai jamais utilisé parce que c'était impraticable à cause du NAT.
Connexions d'égal à égal
C'est un gros. En fait, le plus gros à mon avis. Si vous avez deux utilisateurs finaux, tous deux derrière leur propre NAT, quel que soit celui qui essaie de se connecter en premier, le NAT de l'autre utilisateur abandonnera son paquet et la connexion échouera.
Cela concerne les jeux, le chat audio / vidéo (comme Skype), l'hébergement de vos propres serveurs, etc.
Il existe des solutions de contournement. Le problème est que ces solutions coûtent soit du temps de développement, du temps et des inconvénients pour l'utilisateur final, soit des coûts d'infrastructure de service. Et ils ne sont pas infaillibles et se cassent parfois. (Voir les commentaires d'autres utilisateurs sur la panne subie par Skype.)
Une solution de contournement est la redirection de port, dans laquelle vous programmez le périphérique NAT pour qu'il transfère un port entrant spécifique à un ordinateur spécifique derrière le périphérique NAT. Des sites Web entiers sont consacrés à la procédure à suivre pour tous les différents périphériques NAT. Voir https://portforward.com/ . Cela coûte généralement du temps et de la frustration à l'utilisateur final.
Une autre solution consiste à ajouter la prise en charge d'éléments tels que la perforation de trous aux applications et à maintenir une infrastructure de serveur non derrière un NAT pour introduire deux clients NAT. Cela coûte généralement du temps de développement et place les développeurs dans une position de maintenance potentielle de l'infrastructure de serveur là où cela n'aurait pas été nécessaire auparavant.
(Vous vous souvenez de ce que j'ai dit sur le déploiement de NAT au lieu d'IPv6, transférant le poids du problème des administrateurs réseau aux utilisateurs finaux et aux développeurs d'applications?)
Nom / emplacement cohérent des ressources réseau
Parce qu'un espace d'adressage différent est utilisé à l'intérieur d'un NAT, puis à l'extérieur, tout service offert par un périphérique dans un NAT a plusieurs adresses pour l'atteindre, et le bon à utiliser dépend de l'endroit où le client y accède. . (Cela reste un problème même après que le transfert de port fonctionne.)
Si vous avez un serveur Web dans un NAT, disons sur le port 192.168.0.23, le port 80, et que votre périphérique NAT (routeur / passerelle) a une adresse externe de 35.72.216.228, et que vous configurez la redirection de port pour le port TCP 80. Vous pouvez accéder au serveur Web en utilisant le port 80.1 de 192.168.0.23 ou le port 80 de 35.72.216.228. Celui que vous devriez utiliser dépend du fait que vous soyez à l'intérieur ou à l'extérieur du NAT. Si vous êtes en dehors du NAT et utilisez l'adresse 192.168.0.23, vous ne pourrez pas vous rendre où vous vous attendez. Si vous êtes à l'intérieur du NAT et que vous utilisez l'adresse externe 35.72.216.228, vous pouvez aller où vous voulez, si votre implémentation NAT est avancée et prend en charge l'épingle à cheveux., mais le serveur Web qui répond à votre demande verra que la demande provient de votre périphérique NAT. Cela signifie que tout le trafic doit transiter par le périphérique NAT, même si le chemin derrière le NAT est plus court dans le réseau, ce qui signifie que les journaux sur le serveur Web deviennent beaucoup moins utiles car ils indiquent tous que le périphérique NAT est la source de la connexion. Si votre implémentation NAT ne prend pas en charge l'épingle à cheveux, vous n'obtiendrez pas ce que vous espériez.
Et ce problème s'aggrave dès que vous utilisez DNS. Du coup, si vous voulez que tout fonctionne correctement pour quelque chose hébergé derrière un NAT, vous voudrez donner différentes réponses sur l'adresse du service hébergé dans un NAT, en fonction de la personne qui le demande (AKA split horizon DNS, IIRC). Beurk.
Et tout cela en supposant que vous ayez quelqu'un de bien informé sur la redirection de port, le NAT en épingle à cheveux et le DNS fractionné. Qu'en est-il des utilisateurs finaux? Quelles sont leurs chances d'obtenir tout cela correctement lorsqu'ils achètent un routeur grand public et une caméra de sécurité IP et veulent le faire fonctionner?
Et cela m'amène à:
Routage optimal du trafic, les hôtes connaissant leur adresse réelle
Comme nous l’avons vu, le trafic NAT en épingle à cheveux avancé ne suit pas toujours le chemin optimal. Même dans le cas où un administrateur compétent configure un serveur et possède un NAT en épingle à cheveux. (Un DNS partagé, à horizon fractionné, peut conduire à un routage optimal du trafic interne entre les mains d'un administrateur réseau.)
Que se passe-t-il lorsqu'un développeur d'applications crée un programme tel que Dropbox et le distribue à des utilisateurs finaux non spécialisés dans la configuration d'équipements réseau? Plus précisément, que se passe-t-il lorsque je mets un fichier de 4 Go dans mon fichier de partage, puis que j'essaie d'accéder au prochain ordinateur? Transfère-t-il directement entre les machines ou dois-je attendre qu'il soit transféré sur un serveur cloud via une connexion WAN lente, puis attendre une seconde fois pour qu'il soit téléchargé via la même connexion WAN lente?
Pour une implémentation naïve, il serait chargé, puis téléchargé, en utilisant l'infrastructure de serveur Dropbox qui ne se cache pas derrière un NAT en tant que médiateur. Mais si les deux machines pouvaient se rendre compte qu'elles se trouvaient sur le même réseau, elles pourraient alors transférer directement le fichier beaucoup plus rapidement. Donc, pour notre première tentative d'implémentation moins naïve, nous pourrions demander au système d'exploitation quelles adresses IP (v4) ont la machine, puis vérifier cela par rapport à d'autres machines enregistrées sur le même compte Dropbox. Si cela se situe dans la même plage que nous, transférez simplement le fichier directement. Cela pourrait fonctionner dans beaucoup de cas. Mais même dans ce cas, il y a un problème: le NAT ne fonctionne que parce que nous pouvons réutiliser des adresses. Alors que se passe-t-il si l'adresse 192.168.0.23 et 192.168.0. 42 adresses enregistrées sur le même compte Dropbox sont-elles actuellement sur différents réseaux (comme votre réseau domestique et votre réseau de travail)? Vous devez maintenant utiliser l'infrastructure de serveur Dropbox pour la médiation. (En fin de compte, Dropbox a tenté de résoudre le problème en diffusant chaque client Dropbox sur le réseau local dans l’espoir de trouver d’autres clients. Mais ces émissions ne croisent aucun routeur que vous pourriez avoir derrière le NAT, ce qui signifie que ce n’est pas une solution complète. ,surtout dans le cas de la CGN .)
IP statiques
En outre, depuis que la première pénurie (et la vague de NAT) s'est produite lorsque de nombreuses connexions client ne sont pas toujours connectées (telles que l'accès à distance), les fournisseurs de services Internet peuvent mieux utiliser leurs adresses en allouant uniquement des adresses IP publiques / externes lorsque vous êtes réellement connecté. Cela signifiait que lorsque vous vous connectiez, vous disposiez de l’adresse disponible, au lieu de toujours obtenir la même adresse. Cela rend l'exécution de votre propre serveur encore plus difficile et le développement d'applications entre homologues plus difficiles, car elles doivent gérer le déplacement des homologues au lieu d'être à des adresses fixes.
Obscurcissement de la source du trafic malveillant
Dans la mesure où NAT réécrit les connexions sortantes comme si elles provenaient du périphérique NAT lui-même, tous les comportements, bons ou mauvais, sont convertis en une adresse IP externe. Je n'ai vu aucun périphérique NAT enregistrant chaque connexion sortante par défaut. Cela signifie que, par défaut, la source du trafic malveillant antérieur ne peut être attribuée qu'au périphérique NAT traversé. Bien que les équipements de classe entreprise ou opérateur puissent être configurés pour enregistrer chaque connexion sortante, je n’ai pas vu de routeurs consommateurs le faire. Je pense certainement qu'il sera intéressant de voir si (et pendant combien de temps) les FAI conserveront un journal de toutes les connexions TCP et UDP établies via les CGN au fur et à mesure de leur déploiement. De tels enregistrements seraient nécessaires pour traiter les plaintes d'abus et les plaintes DMCA.
Certaines personnes pensent que le NAT augmente la sécurité. Si c'est le cas, il le fait par l'obscurité. La suppression par défaut du trafic entrant imposée par NAT est identique à celle d'un pare-feu avec état. D'après ce que je comprends, tout matériel capable de faire le suivi de connexion nécessaire au NAT devrait pouvoir exécuter un pare-feu avec état, de sorte que le NAT ne mérite pas vraiment de points.
Protocoles utilisant une seconde connexion
Les protocoles tels que FTP et SIP (VoIP) ont tendance à utiliser des connexions séparées pour le contrôle et le contenu des données. Chaque protocole effectuant cette opération doit disposer d'un logiciel d'assistance appelé ALG (passerelle de couche d'application) sur chaque périphérique NAT traversé, ou contourner le problème avec un type de médiateur ou de perforation. D'après mon expérience, les ALG sont rarement, voire jamais, mis à jour et ont été à l'origine d'au moins deux problèmes liés au SIP que j'ai traités. À chaque fois que j'entends dire à quelqu'un que la VoIP ne fonctionne pas pour eux parce que l'audio ne fonctionne que dans un sens, je soupçonne instantanément que quelque part, il existe une passerelle NAT laissant tomber des paquets UDP dont elle ne sait pas quoi faire.
En résumé, le NAT a tendance à casser:
- protocoles alternatifs à TCP ou UDP
- systèmes peer-to-peer
- accéder à quelque chose hébergé derrière le NAT
- des choses comme SIP et FTP. Les ALG qui travaillent autour de cela posent encore aujourd'hui des problèmes aléatoires et étranges, en particulier avec SIP.
À la base, l’approche en couches adoptée par la pile de réseaux est relativement simple et élégante. Essayez d’expliquer cela à une personne novice en réseautique et ils supposent inévitablement que leur réseau domestique est probablement un bon réseau simple à essayer de comprendre. J'ai déjà constaté dans quelques cas l'idée assez intéressante (excessivement compliquée) de la façon dont fonctionne le routage en raison de la confusion entre adresses externes et internes.
Je soupçonne que sans NAT, la voix sur IP serait omniprésente et intégrée au RTPC, et que passer des appels depuis un téléphone portable ou un ordinateur serait gratuit (à l'exception de l'internet pour lequel vous avez déjà payé). Après tout, pourquoi devrais-je payer pour un téléphone alors que vous et moi pouvons simplement ouvrir un flux VoIP 64K et que cela fonctionne aussi bien que sur le réseau RTPC? Il semble qu'aujourd'hui, le problème numéro 1 du déploiement de la VoIP passe par les périphériques NAT.
Je suppose que nous ne réalisons généralement pas à quel point beaucoup de choses pourraient être simples si nous avions la connectivité de bout en bout interrompue par le NAT. Les gens continuent à envoyer des fichiers (ou Dropbox) eux-mêmes parce que le principal problème de la nécessité d’un médiateur existe lorsque deux clients se trouvent derrière NAT.