Le moyen le plus simple de configurer plusieurs sous-domaines pour séparer les machines virtuelles exécutées sur un seul hôte

Problème:

Je prévois de mettre en place plusieurs ordinateurs invités centos, rhel ou ubuntu virtualisés sur un seul server hôte centos (probablement en utilisant KVM). Chaque machine virtuelle invitée exécute une instance d'une application Web + d'autres services / protocoles, et chaque machine virtuelle invitée doit être accessible depuis l'extérieur de l'hôte, sur n'importe quel port ouvert, comme si chacun d'entre eux était une boîte DNS distincte.

Je suis (apparemment) faible dans la mise en réseau tech / config, alors j'essaye simplement de find les premiers bords de ce problème. les principales approches que je dois examiner pour prendre pied sur ce point. Configuration réseau "pseudocode" si vous voulez. 🙂

Exemple:

Disons que je possède le domaine foo.com.

J'ai une machine CentOS physique DNSed en tant que guests.foo.com.

Sur cette machine hôte physique, j'ai trois machines virtuelles en cours d'exécution. Je veux que les machines virtuelles invitées soient accessibles en tant que 1.guests.foo.com, 2.guests.foo.com et 3.guests.foo.com. Les machines virtuelles invitées exécutent des dissortingbutions centos, rhel et ubuntu.

Chaque machine virtuelle doit répondre à n'importe quel port (ouvert localement), pas seulement au trafic http, mais aussi aux connections ssh et aux opérations git: protocol.

Où dois-je commencer, quelle est l'approche la plus élégante? Qu'est-ce que, grosso modo, l'hôte et les invités doivent minimalement mettre en place pour que cela fonctionne bien?

Remarque:

Je vais mettre à jour le text de la question + les commentaires que j'apprends plus.

La seule façon d'avoir plusieurs systèmes desservant le même port sur une adresse IP est si le protocole d'application fournit des informations supplémentaires qui aident le server à identifier le nom d'hôte auquel la request a été initialement destinée. Sans cela, tout le server peut déduire à la couche TCP / IP l'adresse IP et le port de destination, ce qui serait le même pour tous vos noms DNS.

La plupart des protocoles ne prennent pas en charge ce que vous voulez. HTTP est une exception, car HTTP / 1.1 inclut l'en Host: tête Host: qui indique au server quel nom d'hôte le client recherchait. Dans HTTP, ceci est appelé hébergement virtuel basé sur un nom . Cependant, SSL le casse à nouveau, et il y a donc une extension encore plus récente appelée Indication du nom du server qui apporte également ce support au protocole SSL. On peut s'attendre à ce que tous les systèmes fournissent un en Host: tête Host: ces jours-ci, mais SNI n'est toujours pas entièrement supporté partout.

Le protocole git ne fournit pas de nom d'hôte. Cependant, le nouveau transport HTTP intelligent de git est un excellent moyen d'exécuter git sur HTTP, ce qui vous permettrait de faire ce que vous voulez.

Indépendamment de ce que vous utilisez pour HTTP, la façon de le configurer consiste à exécuter un server proxy sur votre adresse IP principale qui utilise un hébergement virtuel basé sur le nom pour diriger les requêtes vers l'ordinateur correct.

Pour SSH, il n'y a vraiment pas beaucoup d'options autres que l'utilisation de différents ports. Vous pouvez créer votre propre «hôte de rebond» qui fonctionne un peu comme le server mandataire, sauf manuellement: les users se connectent d'abord à votre adresse IP principale et fournit un mini-shell qui leur permet d' ssh d'autres hôtes adresses). Vous aurez du mal à faire fonctionner ce protocole de manière transparente avec des protocoles non interactifs tels que SFTP ou d'autres connections automatisées. L'autre approche pourrait être de faire un server SSH qui utilisait des informations dans le nom d'user pour décider quel hôte se connecter automatiquement: par exemple, la command ssh [email protected] pourrait se connecter à votre adresse IP unique, puis un server SSH modifié il extrait le nom d'user et crée une nouvelle connection au username@machine1 d' username@machine1 . Je ne connais aucun logiciel existant qui vous aiderait à le faire; il aurait probablement besoin d'être écrit.


Bien sûr, si vous utilisez IPv6, vous pouvez donner à chaque machine un million d'adresses publiques et vous n'aurez pas besoin de ces astuces.