Visualiser une révision

Outrepasser les problèmes de hairpinning (boucle local) sur GNU/Linux

voxdemonix : révision n°2 (18 janvier 2018 19:24:12)

Introduction
============

Si vous disposez d'une "Box internet" (un routeur de votre [Fournisseur d'Accès Internet](https://fr.wikipedia.org/wiki/Fournisseur_d%27acc%C3%A8s_%C3%A0_Internet)) il est plus que probable que vous n'arriviez pas à joindre le nom de domaine de votre serveur auto-hébergé lorsque vous êtes connecté sur le même réseau [LAN](https://fr.wikipedia.org/wiki/R%C3%A9seau_local).
Ce problème n'est pas un bug mais la disparition d'une fonctionnalité ([hairpinning](https://fr.wikipedia.org/wiki/Hairpinning)) volontairement supprimée des box afin de décourager l'auto-hébergement.
En résumé : si chez vous vous disposez d'une machine que vos amis joignent à l'adresse www.helloworld.com, vous, depuis votre réseau LAN, êtes obligé d'entrer son adresse IP fixe (192.168.1.42 par exemple) ou de faire vous-même la correspondance dans votre fichier _/etc/hosts_. Si vous utilisez l'adresse IP dans la barre d'adresse, vous perdez en sécurité (car vous êtes obligé de vérifier vous même les [certificats TLS](https://fr.wikipedia.org/wiki/Transport_Layer_Security) pour [https](https://fr.wikipedia.org/wiki/Https)).
Nous allons voir ici plusieurs méthodes (hacks) pour contrer ce problème.
Note pour la rédaction : se serait pas con d'ouvrir une page wiki pour la version android, windows etc


Méthode 1 : En automatisant la mise à jours du fichiers _/etc/hosts_ (méthode la plus simple).
==================================================================================

**Résumé :** cette méthode est très simple, on va utiliser un scripts et le planificateur de tâche (cron) afin d'automatiser la mise à jours du fichiers _/etc/hosts_
Le script s'appel de la façon suivante : 

  * _sudo /opt/scripts/updateHost.bash [adresse_IP_LAN] [adresse_MAC] [HOSTNAME] [ip wan (pas obligatoire)]_

Il se résume à une vérification de si la machine est présente sur le LAN ou non et d'éditer le fichiers /etc/hosts pour ajouter ou retirer la correspondance vers le nom de domaine spécifié.




Mise en place
-------------

#### Créez le fichiers _/etc/scripts/updateHost.bash_

```
sudo nano /etc/scripts/updateHost.bash
```

#### Collez le script suivant

```bash
#!/bin/bash
# Version : 1.1 ; Licence WTFPL ; Dev by VoxDemonix
# Infos : https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=765
# example : 
#		/path/scripts/updateHost.bash 192.168.1.42 00:11:22:33:44:55 www.linuxfr.org
# uncomment next line for debug
#set -x

ipLAN="$1" # IP Lan of the machine
macLan="$2" # mac address (tape ifconfig for check)
hostnameMachine="$3" # the domain name to insert
ipWAN="$4" # set only for force an ip	hostname in wan, unset by default.

fileHosts="/etc/hosts"



function CheckEntryInHosts {
#$hostnameMachine=$1
#$ipMachine=$2

	# check if entry is not already in the /etc/hosts
	if [ "$(cat $fileHosts | grep $1 | grep -o $2)" == "$2" ];then
		# detected
	        echo "1"
	else
		# not detected
	        echo "0"
	fi
}


	# check machine is on LAN
ping $ipLAN -c 2 >> /dev/null 2>&1
macRecover=$(arp -n | grep -i -o $macLan)
if [ "$macRecover" == "$macLan" ]; then
        #        echo "local/LAN"
	if [ $(CheckEntryInHosts "$hostnameMachine" "$ipLAN") -eq 0 ]; then
		sed -i "/$ipWAN	$hostnameMachine/d" $fileHosts
		echo "$ipLAN	$hostnameMachine" >> $fileHosts
	fi

else
        #        echo "tor/wan"
	# we remove the entry in /etc/hosts
	sed -i "/$ipLAN	$hostnameMachine/d" $fileHosts
	if [ ! -z $ipWAN ];then
		#user want force ip for wan
		if [ $(CheckEntryInHosts "$hostnameMachine" "$ipWAN") -eq 0 ]; then
			echo "$ipWAN	$hostnameMachine" >> $fileHosts
		fi
	fi
fi
```

#### Enregistrez et quittez en tapant _CTRL+X_

#### Rendez le script exécutable

```
sudo chmod +x /etc/scripts/updateHost.bash
```

#### Éditez le cron en admin (root) 

```
sudo crontab -e
```

#### Copiez-Collez le cron et adaptez les valeurs mises en exemple ici

```
*/5 * * * *	sudo /opt/scripts/updateHost.bash [adresse_IP_LAN] [adresse_MAC] [HOSTNAME] [ip wan (pas obligatoire)] 

```

* _[adresse_IP_LAN]_ => l'adresse IP en [LAN (réseau local)](https://fr.wikipedia.org/wiki/R%C3%A9seau_local) de la machine lié au hostname par exemple 192.168.1.42

* _[adresse_MAC]_ => l'[adresse MAC](https://fr.wikipedia.org/wiki/Adresse_MAC) de la machine lié au hostname. Par exemple  00:11:22:33:44:55

* _[HOSTNAME]_ => le nom de domaine de votre machine. Par exemple linuxfr.org

* _[ip wan (pas obligatoire)]_ => Non requis. Si vous souhaitez forcer une adresse ip lorsque connecté en [WAN (internet)](https://fr.wikipedia.org/wiki/R%C3%A9seau_%C3%A9tendu). Par exemple  10.8.0.42