web-dev-qa-db-fra.com

Mon enregistrement DNS ne peut pointer que vers une adresse IP. Comment puis-je atteindre un port?

Je suis relativement nouveau dans l'administration de réseau et je suis donc déjà ravi d'avoir réussi à configurer un enregistrement DNS.

Maintenant, je suis un peu confus, car je voudrais avoir cette URL:

http://www.example.org:8080/fetch/characters/

être effectivement atteint par cette

http://www.example.org/fetch/characters/

Ainsi, les utilisateurs peuvent accéder au service sur le port 8080 sans avoir à définir explicitement le port.

Comment puis-je faire ceci? Ai-je besoin d'une application spéciale sur mon serveur? Ou tout autre élément de redirection à appliquer aux demandes?

10
xetra11

Les enregistrements DNS ne peuvent pas pointer vers des ports (à quelques exceptions près, qui ne s'appliquent pas ici).

Si vous disposez d'un service Web en écoute sur le port 8080 et que vous souhaitez l'atteindre sans spécifier ce port, vous avez 3 options:

  • Faites-le écouter réellement sur le port 80 (ou 443 avec https).
  • Configurez tout ce qui écoute déjà sur le port 80 pour transférer les requêtes à votre service sur le port 8080 (proxy inverse).
  • Si vous pouvez vivre avec une redirection, utilisez-la à la place d'un proxy, mais vos clients verront le :8080 partie dans leurs barres d'adresse après la redirection.
32
Sven

Les serveurs Web écoutent TCP port 80 par défaut. Si vous ne voulez pas taper explicitement le numéro de port dans l'URL, vous avez quelques options:

  • Vous pouvez reconfigurer votre serveur Web pour utiliser le port 80 au lieu du port 8080. Ceci est recommandé pour les serveurs Web comme nginx ou Apache mais pas pour les serveurs Web comme Gunicorn. Cette option n'est également pas toujours possible car ce port peut déjà être utilisé par un autre serveur Web.

    En outre, lorsque votre serveur se trouve derrière une passerelle NAT, il ne possède pas l'adresse IP publique et la combinaison de cette adresse publique NAT adresse et port 80 peut déjà transmis à un autre serveur Web.

  • Vous pouvez placer un serveur proxy inverse devant votre serveur Web qui accepte le trafic sur TCP port 80 et l'envoie à votre serveur Web sur TCP port 8080 Cela fonctionnera également si le port 80 est déjà utilisé. Placez simplement le serveur proxy inverse devant les deux serveurs Web, en les faisant tous les deux écouter des ports autres que 80.

Afin de fournir une aide meilleure et plus détaillée sur l'option qui pourrait être la meilleure et les limitations, etc., nous devons en savoir plus sur votre configuration. Espérons que cette explication ait déjà un peu clarifié les choses.

10
Tommiie

Réponse simple, liée au niveau de la question

Ignorant les utilisations exotiques du DNS et inversant également la recherche DNS (non pertinent pour la question), presque toute utilisation du DNS est de la forme:

  1. Le client envoie le nom de domaine (entièrement qualifié ou autre) à un serveur DNS
  2. Le serveur DNS renvoie des informations de domaine à partir de ses enregistrements. Généralement, les informations clés demandées sont soit l'adresse IP pour communiquer avec le Web/e-mail sur ce domaine, soit l'adresse IP d'un autre serveur DNS mieux à même de fournir ces informations.

Une fois que le client a contacté le serveur, le serveur lui-même prendra le relais et le système DNS disparaîtra de l'image.

Cela signifie que le système DNS n'a pas besoin de fournir des informations de port, et il ne le fait presque jamais. Ainsi, bien que l'objectif de la question soit valide et souvent fait, ce n'est pas le système DNS qui le fait. C'est pourquoi vous ne pouvez pas vous en sortir :)

L'idée est qu'une fois que votre client peut localiser la machine ou le serveur spécifique qu'il recherche, il appartient à cette machine d'écouter sur tous les ports qu'il choisit et d'accepter/refuser/répondre à tous les protocoles sur tous les ports configurés.

Par exemple, les services Web HTTP sont généralement fournis sur le port 80. Cela signifie qu'une fois que le client connaît l'IP d'une machine, il peut supposer que l'envoi d'un message au port 80 entraînera la lecture/la réponse de ce message par le service Web de cette machine. Mais il ne doit pas en être ainsi. Si le serveur est configuré pour écouter les requêtes Web entrantes sur le port 9000, tout client capable d'accéder au port 9000 pourra accéder à son service Web. Si le serveur se trouve derrière un proxy/NAT/routeur qui redirige le port 10000 vers le port 9000 et que le client envoie une demande Web sur le port 10000, le serveur la recevra sur le port 9000 et répondra également.

Rediriger/mapper au sein du serveur Web

Vous avez posé des questions sur le mappage de redirection ou la réécriture dans un commentaire. Ce sont des fonctions qu'un serveur Web peut effectuer. Fondamentalement, vous pouvez configurer le serveur Web (ou la plupart/plusieurs serveurs Web) pour gérer la façon dont il gère l'URL qu'il reçoit dans une demande. Ainsi, il peut modifier en interne l'URL à la réception pour gérer différentes URL de la même manière, ou corriger les fautes de frappe courantes (mappage), ou il peut en fait répondre pour dire au client lui-même de demander une deuxième fois, en utilisant une URL différente de remplacement (réorienter).

Ceux-ci ont leurs utilisations et pourraient en principe gérer votre cas d'utilisation, mais ils ne semblent pas être la "bonne" solution pour vous, pour ces raisons:

  1. Je ne pense pas que la cartographie aiderait du tout . Le mappage est presque totalement interne au serveur Web, il dit "traiter cette URL comme si c'était que URL ". Par exemple, vous pouvez utiliser le mappage d'URL de serveur Web pour permettre à un utilisateur d'interroger un forum en utilisant des URL très anciennes, anciennes et actuelles (pour la commodité de l'utilisateur) en utilisant " https://example.com/index.php? area- = forum & topic = 2 ", aussi" https://example.com/forum.php?topic=2 "et aussi" https: //forum.example .com? topic = 2 ", et ne gérez cela qu'une seule fois, en mappant les deux premiers sur la troisième URL en interne, comme première étape du traitement de la requête. Comme ces cibles affectent le chemin de requête et non l'IP/port, le mappage n'est pas très utile pour la gestion des ports, et dans votre cas, le client ne demande jamais du tout 8080.
  2. La redirection fonctionnerait, mais peut ne pas être ce que vous voulez . La redirection dans le serveur Web dépend du serveur Web qui reçoit réellement la requête (car ce sont des fonctions internes du serveur Web). Le serveur Web devrait donc écouter le port 80 de toute façon pour obtenir la requête d'origine, afin de répondre avec la redirection/carte. Il faudrait aussi écouter sur le port 8080. Fonctionnellement, il faudrait une règle de redirection pour indiquer à tout client interrogeant le port 80, pour l'interroger à nouveau à l'aide de l'URL ": 8080", qui ne ressemble pas à ce que vous voulez faire. L'utilisateur verrait également la nouvelle URL contenant ": 8080", alors qu'il semble que vous souhaitiez qu'elle soit "transparente" et non affichée.
  3. La redirection ne fonctionnerait également que pour rediriger un port standard (80 ou 443) - vous ne pouviez pas rediriger le port 2000 vers 8080, car le client ne voulait pas t interroge sur 2000 par défaut, en premier lieu, de sorte qu'il n'atteindra jamais le serveur Web, même s'il écoutait en 2000. Cependant, cela pourrait ne pas être un problème pour vous.

Cependant, si vous voulez une redirection "intelligente", où seules certaines requêtes sont redirigées vers 8080, cela pourrait être la voie à suivre, car la redirection peut inclure une logique pour décider quelles URL doivent être redirigées, tandis que le mappage de port (ci-dessous) mapperait tout.

Comment le faire correctement

La réponse à votre question est que vous voulez que le serveur Web réponde aux demandes Web que le client envoie au port par défaut (80/443), mais que le serveur reçoit réellement sur le port 8080.

Cela signifie que, comme vous pouvez le voir, vous avez besoin de quelque chose entre les deux mappe les ports entre le client et le serveur . De cette façon, le client envoie sur le port 80 (port par défaut utilisé par les navigateurs Web), mais il est en réalité reçu sur le port 8080 par le serveur Web. Bien sûr, vous devrez configurer le serveur Web pour écouter sur le port 8080, car ce n'est pas standard, mais c'est facile et tout serveur Web devrait pouvoir spécifier ses ports d'écoute.

La façon la plus courante de le faire serait dans le routeur/pare-feu, via le mappage de port.

En termes simples, pour ce faire, le routeur se voit imposer une règle selon laquelle tout ce qui a reçu une adresse IP de destination et un port de destination = 80 doit être transmis au LAN avec le port de destination changé à 8080 à la place. Ni le serveur Web ni le client ne seront conscients du changement (il est géré à 100% par le routeur), il sera donc 100% transparent pour les deux. Le client n'aura pas ": 8080" dans son URL et n'aura pas besoin de rediriger quoi que ce soit, car il interroge le port 80, et le serveur Web peut ignorer le port 80 et écouter uniquement sur 8080, car il n'obtient jamais de requêtes sur le port 80 .

Si vous voulez un moyen simple et direct, semblable à ce que ferait un "DNS pour les ports", c'est probablement l'équivalent le plus proche de ce que vous demandez dans votre question.

7
Stilez

Tu ne peux pas.

Je veux dire, techniquement, cela pourrait être fait. Le DNS est célèbre pour pouvoir soumettre un nom de domaine et obtenir une adresse IP. Cependant, j'ai étudié un peu le protocole DNS, et vraiment DNS est techniquement capable d'agir comme un mécanisme de requête/réponse pour bien plus que des noms de domaine et des adresses IP. Une approche possible serait d'utiliser un enregistrement de ressource DNS qui n'est pas le type A ou AAAA typique, tel qu'un enregistrement TXT (qui est techniquement juste du texte et pourrait être utilisé pour n'importe quoi)) ou peut-être un enregistrement SRV, ou tout autre type d'enregistrement de ressource plus récent que vous choisissez.

Si vous créez votre propre logiciel (client et serveur), il n'y a peut-être aucune raison technique de ne pas faire une telle chose, sauf que vous savez que certaines personnes utilisent des sociétés d'hébergement DNS et les limitent à n'utiliser que certains types d'enregistrement. C'est regrettable, car les personnes qui gèrent leurs propres serveurs DNS ont certainement assez de flexibilité pour de telles choses.

Cependant, si vous ne créez pas votre propre protocole de mise en réseau (par exemple, si vous souhaitez utiliser HTTP), vous risquez de rencontrer un problème majeur, à savoir que les logiciels existants n'utiliseront pas votre solution personnalisée, sauf si vous utilisez solutions déjà établies. Ce sera la barrière. Pas une impossibilité technique. Une barrière sociale: pouvez-vous convaincre tout le monde de faire les choses à votre façon?

Maintenant que j'ai expliqué pourquoi vous ne pouvez pas faire cela, cependant, j'ai peut-être une solution pour ce que vous recherchez. Voyons d'abord pourquoi nous avons même des adresses IP et des ports.

Les adresses IP et les ports font des choses différentes. L'adresse IP a pour but de réaliser les objectifs des couches 2 et 3 du modèle OSI de communications réseau. Le but de l'adresse IP est d'identifier à quel ordinateur le trafic est censé aller. Le fait que nous puissions utiliser un numéro de port à cette fin, en demandant aux pare-feu/routeurs d'enquêter sur les numéros de port afin d'effectuer NAPT (Network Address Port-based Translation, également parfois appelé PNAT ou simplement NAT), est une technique plus récente qui utilise un ressource (information), mais ne faisait pas partie de la conception originale. Si nous nous éloignons de cet "abus" des numéros de port pendant une minute et considérons la conception originale, nous pourrons peut-être trouver une solution plus simple. De par la conception d'Internet, les machines devaient être trouvées à l'aide d'adresses IP.

Le but d'un "numéro de port", utilisé par TCP et UDP et certaines alternatives, est de pouvoir suivre les conversations individuelles. Cela permet d'aligner la communication avec les programmes en cours d'exécution. Donc, si une machine reçoit du trafic sur TCP port 80, la machine saura que le trafic réseau est destiné à être utilisé par le programme qui est le serveur Web. Si un navigateur Web télécharge plusieurs graphiques simultanément, des combinaisons des numéros de "port source" et de "port de destination" peuvent garder une trace de quelles données sont destinées à quel graphique, de sorte que ces conversations simultanées peuvent avoir lieu sans mélanger les données.

Maintenant, je suppose que vous avez accès à un serveur DNS, et il vous semble que vous pensez que l'administration DNS serait pratique pour pouvoir gérer un peu plus le routage du trafic. Mais DNS ne semble pas pouvoir vous aider à obtenir un numéro de port. Que pouvez-vous faire?

Considérez IPv6. IPv6 vous permet d'avoir beaucoup plus d'adresses IP. De plus, contrairement à certaines implémentations d'IPv4, les appareils qui utilisent IPv6 peuvent généralement facilement prendre en charge plusieurs adresses IPv6 actives en même temps. Donc, si vous souhaitez avoir trois protocoles réseau différents sur un même ordinateur, vous pouvez attribuer au moins trois adresses IPv6 différentes au même ordinateur. Et puis, vous pouvez faire les manigances de routage que vous aimez avec ces adresses IPv6.

Ensuite, vous pouvez utiliser le type d'enregistrement de ressource AAAA pour attribuer un nom à cette adresse IPv6, que votre conception de réseau peut traiter comme étant effectivement dédiée au service spécifique sur l'ordinateur spécifique que vous souhaitez.

Wallah, vous avez maintenant DNS pointant efficacement sur le logiciel, et vous avez atteint cet objectif sans avoir besoin d'essayer de vous baser sur DNS pour pointer vers un numéro de port, ce qui ne fonctionne pas bien simplement parce que cette fonctionnalité n'est pas courante prise en charge.

Objection possible:
Et si vous vous sentez coincé avec IPv4 et pensez que IPv6 n'est pas pris en charge, je vous encourage à essayer de résoudre ce problème. Ce problème sera probablement plus facile à résoudre (peut-être en utilisant une sorte de tunneling), et finira probablement par être un correctif plus gratifiant une fois que vous l'avez implémenté.

3
TOOGAM