D'après ce que j'ai compris, le DNS relie le nom de domaine à l'adresse IP du serveur sur lequel le site web est stocké, ce qui signifie que chaque serveur ne peut contenir qu'un seul site web ? Si ce n'est pas le cas, comment le fait d'appeler l'adresse IP du serveur permet-il de savoir quel site web je veux s'il y en a plusieurs sur le même serveur ?
Réponses
Trop de publicités?Fondamentalement, le navigateur inclut le nom de domaine dans la requête HTTP, de sorte que le serveur web sait quel domaine a été demandé et peut répondre en conséquence.
Demandes HTTP
Voici comment se déroule une requête HTTP typique :
-
L'utilisateur fournit une URL, sous la forme
http://host:port/path
. -
Le navigateur extrait la partie hôte (domaine) de l'URL et la traduit en adresse IP si nécessaire, dans un processus connu sous le nom de résolution du nom . Cette traduction peut s'effectuer par le biais du DNS, mais ce n'est pas obligatoire (par exemple, le serveur local de l
hosts
sur les systèmes d'exploitation courants contourne le DNS). -
Le navigateur ouvre une connexion TCP sur le port spécifié, ou par défaut sur le port 80, sur cette adresse IP.
-
Le navigateur envoie une requête HTTP. Pour HTTP/1.1, cela ressemble à ceci :
GET /path HTTP/1.1 Host: example.com
(Le
Host
est standard et obligatoire dans HTTP/1.1. Il n'était pas spécifié dans la spécification HTTP/1.0, mais certains serveurs le supportent quand même).
À partir de là, le serveur web dispose de plusieurs éléments d'information qu'il peut utiliser pour décider de la réponse à donner. Notez qu'il est possible pour un même serveur web d'être lié à plusieurs adresses IP.
- L'adresse IP demandée, à partir du socket TCP.
- L'adresse IP du client est également disponible, mais elle est rarement utilisée - parfois pour le blocage ou le filtrage.
- Le port demandé, à partir du socket TCP
- Le nom d'hôte demandé, tel que spécifié dans le fichier
Host
par le navigateur dans la requête HTTP. - Le chemin demandé
- Tout autre en-tête (cookies, etc.)
Comme vous semblez l'avoir remarqué, la configuration d'hébergement partagé la plus courante de nos jours place plusieurs sites web sur une seule combinaison adresse IP:port, ce qui ne laisse que Host
pour différencier les sites web.
C'est ce qu'on appelle un Hôte virtuel basé sur le nom au pays d'Apache, alors que Nginx les appelle Noms des serveurs dans les blocs de serveurs et IIS préfère Serveur virtuel .
Et le HTTPS ?
HTTPS est un peu différent. Tout est identique jusqu'à l'établissement de la connexion TCP, mais ensuite un tunnel TLS crypté doit être établi. L'objectif est de ne pas divulguer d'informations sur la demande.
Afin de vérifier que le serveur possède effectivement ce domaine, il doit envoyer un certificat signé par un tiers de confiance. Le navigateur va ensuite comparer ce certificat avec le domaine qu'il a demandé.
Cela pose un problème. Comment le serveur sait-il quel certificat d'hôte (site web) envoyer, s'il doit le faire avant la réception de la requête HTTP ?
Traditionnellement, ce problème était résolu par la mise en place d'une adresse IP (ou d'un port) dédiée pour chaque site Web nécessitant le HTTPS. Évidemment, cela devient problématique lorsque nous commençons à manquer d'adresses IPv4.
Entrez SNI (Indication du nom du serveur). Le navigateur transmet maintenant le nom d'hôte pendant les négociations TLS, de sorte que le serveur dispose de cette information suffisamment tôt pour envoyer le bon certificat. Du côté du serveur, la configuration est très similaire à celle des hôtes virtuels HTTP.
L'inconvénient est que le nom d'hôte est maintenant transmis en texte clair avant le cryptage et qu'il s'agit essentiellement d'une fuite d'informations. C'est généralement considéré comme un compromis acceptable, étant donné que le nom d'hôte est normalement exposé dans une requête DNS de toute façon.
Que se passe-t-il si vous demandez un site par adresse IP uniquement ?
Ce que fait le serveur lorsqu'il ne sait pas quel hôte spécifique vous avez demandé dépend de l'implémentation et de la configuration du serveur. En général, un site "par défaut", "catchall" ou "fallback" est spécifié pour fournir des réponses à toutes les demandes qui ne spécifient pas explicitement un hôte.
Ce site par défaut peut être un site indépendant (affichant souvent un message d'erreur) ou n'importe lequel des autres sites du serveur, selon les préférences de l'administrateur du serveur.
J'ai cette explication pour les personnes non techniques.
Jack, Jill et Joe vivent dans un dortoir, et ils n'ont pas de téléphone portable.
Dans le répertoire, ils sont tous répertoriés avec le même numéro. (A-record)
Vous composez le numéro, et quelqu'un décroche le téléphone ; vous dites "Je voudrais parler à Jill", et vous l'avez en ligne.
Au lieu d'un enregistrement A (numéro de téléphone/adresse IP) dans le répertoire, il peut simplement dire "Dormitory X", vous devez alors chercher plus loin le numéro du Dormitory X. C'est un enregistrement CNAME.
Si Jill n'est pas disponible, vous pouvez obtenir
-
404 Jill n'est pas là
-
410 Jill est morte.
-
301 Jill est installée chez Peter
-
302 Jill rend visite à Peter, appelez-le à la place
-
400 Je ne peux pas te comprendre.
-
401 Qui êtes-vous ? Quel est le mot de passe ? ou Nous n'acceptons pas les appels d'hommes après 22 heures.
-
402 Paiement requis (Vous êtes sûr que Jill est son vrai nom ;-) )
-
403 Non, ce n'est pas le bon mot de passe.
-
418 Jill est une théière :-)
-
429 Jill ne peut plus prendre d'appels.
-
451 Vous violez votre ordonnance restrictive.
-
500 Notre système téléphonique est en panne.
D'après ce que j'ai compris, le DNS relie le nom de domaine à l'adresse IP du serveur sur lequel le site web est stocké, ce qui signifie que chaque serveur ne peut contenir qu'un seul site web ?
Tout d'abord, vous devez comprendre qu'il existe un certain nombre de concepts distincts ici.
- Site web, un groupe de pages web qui forment un ensemble cohérent.
- Adresse IP, une adresse numérique (32 bits pour IPv4, 128 bits pour IPv6) utilisée par le protocole internet comme source ou destination du trafic.
- Serveur, une machine dont le travail consiste à répondre aux demandes des clients.
- Nom d'hôte, un nom utilisé pour identifier une machine dans le DNS (par exemple, "www.example.com" ou "en.wikipedia.org").
Il n'y a pas de relation univoque entre ces éléments. Un serveur peut avoir plusieurs adresses IP ; plusieurs noms d'hôtes peuvent pointer vers une adresse IP ; un nom d'hôte peut pointer vers plusieurs adresses IP. Plusieurs sites web peuvent être sous le même nom d'hôte. Un site web peut être réparti sur plusieurs noms d'hôtes.
Si ce n'est pas le cas, comment le fait d'appeler l'adresse IP du serveur permet-il de savoir quel site web je veux s'il y en a plusieurs sur le même serveur ?
À l'époque (HTTP 1.0 et avant), chaque nom d'hôte que le serveur voulait traiter différemment devait avoir sa propre adresse IP. C'était un véritable gaspillage.
HTTP 1.1 a ajouté le Host
" comme champ obligatoire dans la requête HTTP (il semble que certains fournisseurs l'aient déjà supporté comme une extension). Cela indique au serveur quel nom d'hôte a été demandé et lui permet donc de servir un contenu différent pour différents noms d'hôtes sur la même adresse IP. La prise en charge de HTTP 1.1 par les clients est désormais omniprésente.
Malheureusement, SSL (puis TLS) a ajouté une difficulté. L'établissement d'une session SSL/TLS nécessite que le serveur présente au client un certificat couvrant le nom d'hôte demandé, mais la requête HTTP n'arrive qu'après l'établissement de la session SSL/TLS.
Il est possible de faire en sorte qu'un certificat couvre plusieurs noms d'hôtes grâce à l'utilisation de l'attribut SubjectAltName
ou l'utilisation de caractères génériques dans le champ CommonName
champ. Cependant, cela pose des problèmes administratifs, surtout si les noms d'hôtes concernés sont sous des domaines de propriété différente.
TLS a donc introduit l'extension "indication du nom du serveur" (SNI). Avec cette extension, le client envoie le nom d'hôte demandé au serveur pendant la procédure de prise de contact TLS. Le serveur peut alors présenter le certificat approprié. Malheureusement, si les versions actuelles de toutes les principales implémentations SSL/TLS prennent en charge SNI, il a fallu longtemps pour que les anciennes versions ne soient plus utilisées.
La réponse est un peu plus compliquée que ne le laissent entendre certaines réponses. Lorsque vous effectuez une recherche DNS, vous DEVEZ obtenir une adresse IP ( A
pour IPv4, AAAA
pour IPv6). Il faut être capable d'ouvrir un socket sur TCP/IP pour communiquer, sinon tout échoue. Cette adresse peut représenter un serveur ou un équilibreur de charge. Elle peut même représenter un proxy. Si l'hôte est derrière CloudFlare, par exemple, l'adresse que vous obtenez est celle d'un serveur CloudFlare. Le véritable serveur se trouve ailleurs. Cela permet à l'hôte d'éviter des problèmes tels que les attaques par déni de service.
Hébergement virtuel est ce que vous demandez (certaines des autres questions ont abordé ce sujet, mais pas en détail). L'hébergement virtuel prend la demande web et regarde le nom de l'hôte (c'est-à-dire domaine.com) pour déterminer le site web à servir. Ainsi, dans le Serveur web Apache HTTP vous auriez une configuration comme celle-ci
<VirtualHost *:80>
ServerName www.domain.com
ServerAlias domain.com
DocumentRoot /var/www/domain.com
</virtualHost>
Ceci est simplifié par exemple. Nous disons donc à Apache d'écouter sur le port 80 de n'importe quelle IP (dans un hébergement moderne de machine virtuelle, l'IP de votre machine peut être différente de son IP réelle). Nous lui disons ensuite que c'est le domain.com
et le répertoire dans lequel il se trouve. Nous pouvons ensuite répéter ce bloc à l'infini pour demander à Apache de gérer différents sites web. Tous les serveurs web supportent ce type de système.
Une autre façon de gérer cela serait de dire au serveur web de diriger tout le trafic web vers un seul script de programmation (c'est-à-dire PHP, ASP.NET, etc.) et ensuite ce seul script déterminera quel site web et quelle page afficher.
En utilisant le DNS, vous pouvez attribuer autant de noms que vous le souhaitez à une adresse IP individuelle (dans vos fichier d'hôtes vous pouvez simplement séparer chaque nom par des espaces, par exemple). En utilisant un serveur DNS, vous pouvez également attribuer plusieurs adresses IP à un seul nom . Elle ne se limite pas à une relation de personne à personne.
Un serveur web sait quel site servir en en examinant l'URL demandée. Il regarde quel domaine a été demandé, quel port a été demandé et quel protocole a été utilisé. Cela n'a rien à voir avec le DNS et est géré par le protocole HTTP.
- Réponses précédentes
- Plus de réponses