Les boxs internet gèrent souvent mal l’accès aux serveurs configurés par un service de DNS dynamique qui sont sur leurs réseaux. Sur Linux il est simple de résoudre le problème en ajoutant des entrées dans /etc/hosts
. Pour un portable cette solution n’est pas satisfaisante, car dès que l’on quitte le réseau de la box, la résolution devient bloquante. Une solution consiste à modifier le fichier /etc/hosts
en fonction du réseau sur lequel la machine est connectée.
La grande majorité des opérations se fait en super-utilisateur ; deux conséquences : il est facile de faire des erreurs et si on ne comprend pas ce que l’on fait, on ne le fait pas ! Ceci était dit, passons au travail…
Fichiers de configuration
Avant de faire une bêtise, le fichier /etc/hosts
est sauvegardé avec la commande cp /etc/hosts /etc/hosts.backup
. En cas de problème, on pourra revenir à la version initiale du fichier avec mv /etc/hosts.backup /etc/hosts
Configuration par défaut du réseau
Le fichier par défaut sera celui utilisé lorsque la machine n’est pas sur le réseau de la maison. Une copie du fichier hosts
initial est faite pour cela cp /etc/hosts /etc.hosts.default
Configuration du réseau pour la maison
Le fichier de configuration pour la maison est construit à partir du fichier par défaut, on fait donc une copie avec cp /etc/hosts /etc/hosts.home
. Il est ensuite édité (par exemple avec vim /etc/hosts.home
) pour ajouter les résolutions locales :
127.0.0.1 localhost 127.0.1.1 linux 192.168.5.3 serveur1.chezmoi.local 192.168.5.3 serveur2.chezmoi.local 192.168.5.3 serveur3.chezmoi.local # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
Les trois sites webs pointent vers le même serveur, c’est Nginx qui gère la résolution des différents sites.
Gestion des événements de NetworkManager
La gestion des cartes réseaux est assurée par NetworkManager sous la très grande majorité des systèmes Linux (en tout cas ça marche sur mon Linux Mint !). Une des qualités de NetworkManager est de proposer de gérer les événements associés aux changements d’états des cartes réseaux de manière très simple.
Les scripts traitant les événements doivent être placés dans le répertoire /etc/NetworkManager/dispatcher.d
. Le script peut être sauvegardé avec n’importe quel nom (pour respecter la notation générale, je l’ai sauvegardé sous le nom 02home
) mais il doit avoir les droits d’exécution pour tous les utilisateurs et doit être la propriété de root
(mais comme il faut être super utilisateur pour pouvoir écrire dans ce répertoire ça se fait tout seul…).
Les scripts de changement d’états de NetworkManager doivent traiter deux paramètres lors de l’appel qui sont le nom de la carte réseau concernée et le statut (arrêt, démarrage,…). La carte wifi de mon ordinateur est repérée par wlp1s0
et l’événement qui nous intéresse est la mise en marche de la carte (événement up
).
Le script est ensuite assez simple à écrire :
#!/bin/bash -e
IF=$1
STATUS=$2
if [[ $IF = "wlp1s0" ]] && [[ $STATUS = "up" ]]
then
wifi=`iwlist wlp1s0 scan | grep SSID`
if [[ $wifi == *"MonWifi"* ]]
then
cp /etc/hosts.home /etc/hosts
fi
else
#Use the normal host file
cp /etc/hosts.default /etc/hosts
fi
Le nom du réseau WiFi est obtenu avec la commande iwlist
et un grep
. On vérifie ensuite que le nom du réseau local (MonWifi
) est présent dans la chaîne. Dans ce cas, on copie le fichier de configuration pour la maison dans le fichier /etc/hosts
.
Si un autre événement (arrêt, …) se produit sur la carte, le fichier de configuration par défaut est recopié sur /etc/hosts
pour tout remettre à la configuration par défaut.
Bilan
Pour l’instant aucun problème ! Je suis toujours surpris par le côté « bien pensé » de Linux et la puissance de petits scripts tout simples…