Attribuer plusieurs IP à 1 entrée dans le fichier d'hôtes

29

J'ai un serveur Web qui se connecte à une base de données interne via un VPN. Il existe 2 adresses IP (principale et secondaire) dans la base de données à partir du serveur Web. Comment puis-je configurer mon fichier / etc / hosts pour que si l'adresse IP principale n'est pas disponible, l'adresse IP secondaire sera utilisée?

Est-ce que cela fonctionnerait pour mon fichier d'hôtes?

141.131.286.1   abc.efg.datastore.com   #primary

141.131.286.237 abc.efg.datastore.com   #secondary
Mike T
la source

Réponses:

26

Le fichier hosts ne fournit pas un tel mécanisme. Si vous répertoriez deux adresses IP pour le même nom, seule la première sera utilisée. Donc, il n'y a rien de tel que les IP primaires et secondaires.

En outre, le fichier hosts ne gère pas les URL. Il gère uniquement les noms comme ceux fournis dans la question. Une URL contient un chemin d'accès complet et un protocole tel que http://host/path/to/resource.

Khaled
la source
Titre et nom modifiés dans la question OP pour éliminer la confusion sur les URL / hôtes.
dmourati
14

Vous ne pouvez pas fournir de résilience ou d'équilibrage de charge à tour de rôle via le /etc/hostsfichier - il n'est pas conçu à cet effet.

Au lieu de cela , vos options sont ... (sans ordre particulier)

  1. Configurez votre réseau correctement, de sorte que les itinéraires changent lorsqu'un lien est abandonné
  2. Utilisez l'équilibrage de charge DNS à tour de rôle (pas A Good Idea TM ) à l'aide d'un service géré (par exemple, loaddns.com ou dnsmadeeasy.com, etc.)
  3. Utilisez un équilibreur de charge L3 local pour le trafic sortant (HAProxy?) Avec les back-ends définis si nécessaire
  4. Intégrez la résilience dans votre application Web elle-même
Ben Lessani - Sonassi
la source
L'équilibrage de charge à tour de rôle DNS n'est généralement pas résilient. L'un est sélectionné et les autres ne sont pas essayés.
Antti Rytsölä Circles Consult
Une autre option pourrait être d'utiliser netcat ou un autre logiciel pour transférer la connexion à une adresse IP. Modifiez ensuite le renvoi si une adresse IP est perdue.
Antti Rytsölä Circles Consult
1
@anttiR DNS RR seul n'a aucune résilience, mais il est utilisé via un fournisseur de services DNS géré. J'ai édité mes réponses et donné quelques exemples pour être plus clair.
Ben Lessani - Sonassi
Je doute que cela fonctionnerait très bien avec la base de données. Ils ont tendance à récupérer une adresse IP et à s'y tenir. Un site Internet, d'autre part, fonctionnerait très bien.
Antti Rytsölä Circles Consult
Cela dépendrait du résolveur de la machine hôte. Si le résolveur DNS est défini comme un service sans mise en cache - ou interroge directement la base de données des registraires DNS, cela fonctionnera. Mais comme je l'ai dit, ce n'est pas une bonne idée , c'est juste une idée .
Ben Lessani - Sonassi
3

/ etc / hosts ne prend pas en charge le round robin mais vous pouvez écrire un simple script bash pour remplacer sed une entrée balisée par un commentaire #RoundRobin (ou toute autre balise que vous souhaitez utiliser, il suffit de la refléter dans la ligne grep du script) .

#!/bin/bash
fqdnips=( $(nslookup sub.domain.com|grep Address:|awk -F\  '{ print $2 }'|grep -v '#') )

new=`printf "${fqdnips[@]}"`
old=`grep "#RoundRobin" /etc/hosts|awk -F\  '{ print $1 }'`
sed -i "s/$old/$new/g" /etc/hosts

Le script ci-dessus capture la sortie de nslookup pour sub.domain.com et la stocke dans un tableau. Il imprime ensuite la valeur la plus élevée dans $ new et récupère la valeur existante pour la balise #RoundRobin affectée dans / etc / hosts ... enfin, il effectue un remplacement sed

L'entrée du fichier / etc / hosts ressemblerait à ceci

127.0.0.1        localhost
::1              localhost
11.12.13.14      sub.domain.com      #RoundRobin

Enfin, placez ce script dans la crontab de la racine pour l'exécuter toutes les heures environ et vous aurez maintenant un round-robin / etc / host.

Cela est particulièrement utile si vous avez une page codée qui extrait des données d'une API et que la recherche DNS pour le serveur d'API entraîne beaucoup de temps d'arrêt dans l'exécution du script de la page ... entraînant une consommation élevée de CPU pour ce qui serait autrement semblent être une simple page. Pour éviter la recherche DNS coûteuse (en particulier si votre site en fait des centaines par minute pour un trafic important), vous devez utiliser / etc / hosts pour résoudre le nom de domaine complet du serveur d'API distant. Cela réduira considérablement l'utilisation du processeur pour extraire les données API et générer la page.

Satalink
la source
La mise en cache DNS ne soulagerait-elle pas votre cas de centaines de recherches par minute?
Xalorous
Je ne contrôle pas le serveur DNS, est-ce quelque chose que je peux configurer sur le serveur Web CentOS?
Satalink
0

Oui, ça marcherait.

Cependant, le mécanisme de recherche fait simplement la liste jusqu'à ce qu'il trouve une correspondance.

Ainsi, alors que la réponse à la question telle qu'elle est écrite est OUI, ce sera un défi. Mais rien d'insurmontable.

Essayez ceci: chacune de ces adresses IP doit vraiment avoir des noms différents.

SDsolar
la source
1
Non, ça ne marchera pas. La deuxième occurrence d'une valeur dans / etc / hosts ne serait jamais utilisée. Et s'il renomme la deuxième adresse IP avec un nom d'hôte différent, il doit maintenant faire quelque chose dans son application pour effectuer l'équilibrage de charge. Cela va être coûteux et compliqué, lorsque DNS ou DNS + Load Balancer est la bonne réponse.
Xalorous
0

Un moyen simple d'y parvenir serait d'utiliser simplement un service DNS public, comme AWS Route53. Vous pouvez entrer plusieurs adresses IP par enregistrement A avec priorité

abc.efg.datastore.com

10 141.131.286.1  
20 141.131.286.237 

Tant qu'aucun certificat n'est impliqué, cela fonctionne et n'est même pas contraire aux normes ou aux meilleures pratiques.

NSLookup ou d'autres requêtes de domaine renverront les deux adresses. Votre application doit pouvoir gérer cela. Et oui, le domaine doit être enregistré publiquement, pas seulement un nom d'hôte local.

bortran
la source
Les navigateurs seront en mesure de gérer cela, si 10 n'est pas disponible, il retombera sur 20. Cela dépend sûrement de l'application et il devrait également y avoir un point où vous vérifiez la disponibilité - si vous voulez vous déplacer pour configurer quelque chose de plus compliqué et coûteux avec équilibrage de charge.
bortran
Ales enregistrements n'ont pas de champ prioritaire. Certains services DNS faisant autorité ont une pondération d'enregistrement, mais cela se fait en incluant ou en excluant les enregistrements de manière probabiliste.
Matt Nordhoff
0

Facile à installer, veuillez suivre les instructions:

  1. installer dnsmasq
  2. éditez /etc/resolv.conf et définissez "nameserver 127.0.0.1" comme premier DNS
  3. ajouter un DNS normal comme alternative (google one par exemple) "nameserver 8.8.8.8" comme deuxième ligne
  4. assurez-vous que deux enregistrements requis se trouvent dans votre fichier / etc / hosts
  5. vérifiez maintenant avec un hôte de commande abc.efg.datastore.com

    qui devrait répondre à deux enregistrements avec RR-DNS donc si un nœud de la liste est en panne - votre application sera connectée à un autre
Ihor Kolodyuk
la source
1
La pile IP vérifie automatiquement le fichier d'hôtes avant de consulter DNS. Je crois que cela fait partie de la définition IP, mais je sais que Windows et Linux suivent tous les deux ce schéma. Il n'a pas besoin de dnsmasq, et s'il modifie son /etc/resolv.conf de cette manière, il perdra la connexion à son vrai serveur DNS.
Xalorous
pas vrai, il peut mettre plusieurs lignes dans resolv.conf pour que la ligne suivante puisse être "nameserver 8.8.8.8", par exemple, + nscd pour la mise en cache des enregistrements existants, cette approche résout exactement le problème décrit
Ihor Kolodyuk
Ce n'est pas ce que vous lui avez dit de faire. Vous lui avez dit de mettre son serveur de noms en boucle. Vous n'avez PAS dit d'ajouter un bouclage en tant que serveur de noms. Mais si l'hôte ne s'exécute pas nommé, ou même s'il l'est et qu'il n'écoute pas en boucle, les requêtes DNS à cette adresse resteront sans réponse. Le simple fait d'ajouter les adresses au fichier hosts permettra de les résoudre, mais s'ils ont le même nom d'hôte, seule la première sera utilisée et nous revenons au début. La réponse consiste à configurer un hôte virtuel dans DNS avec des alias pondérés ou à faire face à la base de données avec un équilibreur de charge.
Xalorous
C'est exactement ce que je lui ai dit, dnsmasq agit comme un proxy de serveur de noms. Cette approche fonctionne.
Ihor Kolodyuk