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

10

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 élément de redirection à appliquer aux demandes?

xetra11
la source
4
Le navigateur par défaut n'accède pas au port 8080. Est-ce une erreur de saisie de question?
Džuris
idée fausse de ce qu'est un DNS et de ce qu'il fait.
CONvid19
@ Džuris Na c'était une erreur de ma part de penser que 8080 est le défaut http au lieu de 80
xetra11

Réponses:

32

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-le à la place d'un proxy, mais vos clients verront la :8080partie dans leurs barres d'adresse après la redirection.
Sven
la source
10
Et si nous pouvions utiliser des enregistrements SRV et spécifier des ports pour les services ... Dommage que les navigateurs n'utilisent pas cela.
Jacob Evans
4
@JacobEvans: Les enregistrements SRV pour tout est un vieux rêve à moi. Cela rendrait les choses beaucoup plus faciles (sauf pour les administrateurs de pare-feu qui peuvent maintenant tout bloquer sauf 80 et 443)
Sven
Les enregistrements SRV fonctionnent très bien pour certains services, comme XMPP ... mais malheureusement pas très nombreux (et pas HTTP pour sûr)
Josh
Option 4: port en avant par un pare
Joel Coel
10

Les serveurs Web écoutent le port TCP 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.

    De plus, 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 NAT publique et du port 80 peut déjà être transmise à un autre serveur Web.

  • Vous pouvez placer un serveur proxy inverse devant votre serveur Web qui accepte le trafic sur le port TCP 80 et l'envoie à votre serveur Web sur le port TCP 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 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.

Tommiie
la source
J'ai déjà les infos dont j'ai besoin! J'ai confondu le port Web par défaut 80 avec 8080
xetra11
7

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 sur les ports, et il ne le fait presque jamais. Ainsi, bien que l'objectif de la question soit valide, et souvent fait, ce n'est pas réellement 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 demandes 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.

Redirection / mappage 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 que les différentes URL soient traitées 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 de remplacement différente (réorienter).

Celles-ci ont leurs utilisations et pourraient en principe gérer votre cas d'utilisation, mais elles 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 cette URL". Par exemple, vous pouvez utiliser le mappage d'URL de serveur Web pour permettre à un utilisateur d'interroger un forum à l'aide d'URL très anciennes, anciennes et actuelles (pour plus de commodité) en utilisant " https://example.com/index.php?area-=forum&topic = 2 ", également" https://example.com/forum.php?topic=2 "et également" https://forum.example.com?topic=2", et ne gérez cela qu'une seule fois, en mappant les deux premiers d'entre eux sur la troisième URL en interne, comme première étape du traitement de la requête. Comme cette cible affecte le chemin de la 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). Ainsi, le serveur Web devrait de toute façon écouter sur le port 80 pour obtenir la requête d'origine, afin de répondre avec la redirection / carte. Il devrait également é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. De plus, la redirection ne fonctionnerait que pour rediriger un port standard (80 ou 443) - vous ne pouviez pas rediriger le port 2000 vers 8080, car le client ne demanderait pas sur 2000 par défaut, en premier lieu, donc il ne serait jamais accéder au serveur Web, même s'il écoutait en 2000. Ce n'est peut-être pas 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 souhaitez 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 qui 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 au courant 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 une méthode simple et directe, 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.

Stilez
la source
J'entends souvent parler de redirection de mappage ou de réécriture? sont aussi ces solutions?
xetra11
Ce sont des modificateurs qui interviennent dans le serveur Web, lors du traitement de la commande du client. Donc, si le serveur Web le prend en charge, vous pouvez répondre automatiquement à toute demande sur le port 80, avec une redirection HTTP vers la même URL sur le port 8080 - après tout, la redirection HTTP / 80 -> HTTPS / 443 est à peu près la même chose. Mais il doit d'abord pouvoir recevoir la requête, afin qu'il ne fonctionne pas sur les ports pour lesquels il n'a pas été configuré pour écouter, et le client voit probablement l'URL modifiée: 8080. Le faire via le mappage de port le rend 100% invisible pour le client, car ils n'utilisent que le port 80 (8080 est 100% interne uniquement)
Stilez
J'ai ajouté une section "Rediriger / mapper dans le serveur Web" et développé la dernière section, pour couvrir votre question plus en détail. J'espère qu'ils aident!
Stilez
3

Tu ne peux pas.

Je veux dire, techniquement, cela pourrait être fait. 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 du 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 peut n'y avoir 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 à utiliser uniquement 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 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. Tout d'abord, examinons 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épondre aux 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. Ainsi, si une machine reçoit du trafic sur le port TCP 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 de numéros de "port source" et de "port de destination" peuvent garder une trace des données destinées à quel graphique, afin que ces conversations simultanées puissent se produire sans mélanger les données.

Maintenant, je pense 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 faire en sorte que DNS pointe vers un numéro de port, ce qui ne fonctionne pas bien simplement parce que cette fonctionnalité se trouve ne pas être 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é.

TOOGAM
la source
IPv6 est toujours bon à prendre en charge, mais n'aidera pas si, pour une raison quelconque, vous êtes maintenant autorisé à utiliser le port 80 (ou 443).
Paŭlo Ebermann
C'est vrai, mais si DNS réussissait à transmettre un numéro de port, cela ne fonctionnerait pas non plus autour d'un pare-feu qui bloque le trafic sur un numéro de port spécifique. En plus de cela, mon explication sur la façon d'utiliser IPv6 n'était vraiment qu'une partie de la réponse, et je pense que les parties précédentes de ma réponse répondent à la question.
TOOGAM