Deux numéros apparaissent dans la même conversation, et aucun des deux n'est faux. Le journal du serveur montre le listener qui offre le service, l'ordinateur portable montre la socket qui a envoyé le datagramme, et un routeur intermédiaire peut réécrire le second en sortie. Comparer les extrémités de la conversation est plus utile que comparer les chiffres. La comparaison ci-dessous tient séparés le listener, la socket du client et la source traduite, parce qu'ils répondent à des questions différentes.

Deux numéros qui décrivent des extrémités opposées

Le port configuré du serveur est la destination que le client appelle. Il est fixé par la politique, figure dans le profil et doit être ouvert côté serveur. Le port source du client est choisi localement, généralement dans la plage éphémère, et existe pour que la réponse ait où atterrir. Il peut changer à chaque reconnexion, et rien dans la conception ne dépend de sa stabilité.

Un routeur intermédiaire peut réécrire cette source dans sa propre correspondance 'NAT'. C'est pourquoi le numéro observé sur le serveur n'a souvent aucun rapport avec celui choisi par l'ordinateur portable.

Où le numéro source change en sortie

Prenez un exemple IPv4 inventé : un client derrière un routeur qui traduit, un serveur avec un seul listener 'UDP' et un unique datagramme qui traverse les deux. Le tableau nomme chaque extrémité et ce qui lui arrive, plutôt que de rejouer le paquet en trois points d'observation.

EndpointWhat stays fixedWhat changes on reconnectWho owns it
Server listenerThe service port and the address the profile namesNothing; the listener does not follow the clientThe server operator
Client socketThe destination it dialsThe local source port, chosen per socketThe client, or its operating system
Translated sourceUsually the public address of the routerThe port, and sometimes the address after a network switchThe NAT device or the upstream carrier

La destination est constante sur chaque ligne, et seule l'identité de la source change. Exigences d'UDP NAT distinguent une adresse et un port internes de la correspondance externe, ce qui est exactement l'écart entre la deuxième et la troisième ligne. Un routeur peut conserver le port source du client ou en choisir un autre ; la conservation n'est pas quelque chose qu'une application doit supposer.

Lisez les trois extrémités depuis les hôtes eux-mêmes

Les listes ci-dessous viennent de trois machines différentes et, ensemble, montrent toute la conversation. Exécutez la première sur le serveur, la deuxième sur le client et la troisième là où la correspondance existe. Une seule ligne de journal ne montre jamais les trois.

ss -lunp 'sport = :1194'
ss -unp | grep 1194
conntrack -L -p udp | grep 1194

La première liste prouve que le serveur est lié au port du service et indique quel processus le possède. La deuxième montre la socket locale du client et la destination qu'il a appelée. La troisième montre la correspondance créée par le routeur, et c'est le seul endroit où la source traduite apparaît. Lisez-les dans cet ordre et les deux numéros cessent de sembler contradictoires.

Ce qu'une reconnexion change, et ce qu'elle ne change pas

Certains routeurs conservent le port source du client lorsqu'il est libre, d'autres en attribuent un différent à chaque fois. Les deux comportements sont normaux, et une application qui exige le premier se cassera sur le second. Un changement de correspondance après une reconnexion ou un changement de réseau n'est pas une panne du serveur : le client ouvre une nouvelle socket, le routeur attribue ce qu'il a, et le serveur voit une nouvelle source sur le même listener. Ce qui serait une panne, c'est d'attendre du serveur qu'il accepte du trafic adressé à un port client arbitraire.

Les clients OpenVPN de la communauté obtiennent ce comportement grâce à nobind, qui laisse le système d'exploitation choisir le port local ; le port distant vient toujours du profil. Le lier explicitement est un choix délibéré, pas une exigence du protocole. Le serveur continue d'offrir une extrémité pendant que les clients choisissent leurs propres identités locales.

Étiquetez les couches séparément dans l'enregistrement

À l'intérieur du tunnel se déroule une seconde conversation avec ses propres ports. Une requête HTTPS portée par le tunnel a pour destination TCP 443, tandis que la connexion chiffrée extérieure utilise UDP 1194, si bien que changer le port source extérieur ne change rien au service intérieur.

Même à la couche extérieure, le protocole compte. UDP 1194 et TCP 1194 sont des extrémités différentes, et un listener 'TCP' ne recevra jamais un datagramme UDP parce que le numéro correspond. Lorsque vous documentez un déploiement, étiquetez le listener du serveur, la socket du client et la source traduite comme trois choses distinctes, et ajoutez le transport à chacune.

Ensuite, laissez la politique suivre les rôles. Le serveur ouvre le transport prévu sur son listener et authentifie toujours le pair ; le pare-feu du client admet les réponses à son propre échange sortant sans publier de service entrant. Un filtre sans état a besoin de la direction de retour écrite explicitement, et c'est la raison pratique pour laquelle la distinction compte au-delà des schémas soignés.

Articles similaires