web-dev-qa-db-fra.com

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

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'IP primaire n'est pas disponible, l'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
30
Mike T

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 tels que http://Host/path/to/resource.

25
Khaled

Vous ne pouvez pas fournir de résilience ou d'équilibrage de charge à tour de rôle via le /etc/hosts fichier - 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. Utiliser l'équilibrage de charge à tour de rôle DNS (pas une bonne idée) 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
14

/ 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.

3
Satalink

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 une commande Host 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
1
Ihor Kolodyuk

Oui, plusieurs adresses IP dans/etc/hosts fonctionnent. Exemple et test;

> echo "192.168.0.141 test
192.168.0.142 test
192.168.0.143 test" >> /etc/hosts

> Dig test +short
192.168.0.141
192.168.0.142
192.168.0.143
0
user1133275

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, cela va être un défi. Mais rien d'insurmontable.

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

0
SDsolar

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.

0
bortran

Notez qu'au moins sur macOS, contrairement à ce que disent les autres réponses, le résolveur système retournera toutes les entrées associées à un nom d'hôte dans/etc/hosts au lieu de s'arrêter au premier.

0
zneak