Visualiser une révision

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

voxdemonix : révision n°12 (24 janvier 2018 20:32:38)

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 script 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 fichier _/etc/scripts/updateHost.bash_

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

#### Collez le script suivant (ou via [github](https://github.com/voxdemonix/divers-script/blob/master/updateHost.bash))

```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 misent 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



Méthode 2 : Passer par un Tor Hidden Service (méthode la plus polluante)
====================================

**Résumé :** cette méthode est assez simple aussi mais nécessite d’être connecté non seulement à internet mais aussi au réseau [tor](https://fr.wikipedia.org/wiki/Tor_(r%C3%A9seau)). Tout les logiciels ne sont pas forcément capable de passer par un [Tor Hidden Service](https://www.torproject.org/docs/onion-services) sans un proxy (par exemple SSH). Les clients doivent aussi être capable de joindre le réseau [Tor](https://fr.wikipedia.org/wiki/Tor_(r%C3%A9seau)) (pour android voir [orbot](https://guardianproject.info/apps/orbot/))

#### Installez Tor

```
sudo apt-get install -y tor
```

#### Créez le dossier qui va accueillir la clé privé et l'hostname.onion de votre hidden service (il faudra recommencer pour chaque serveur/port)

```
sudo mkdir -p /var/lib/tor/hidden_service/cozycloud
```

#### Accordez dessus les bons droits (il faudra recommencer pour chaque serveur)

```
sudo chown debian-tor:root -R /var/lib/tor/hidden_service/cozycloud
chmod 700 -R /var/lib/tor/hidden_service/cozycloud
```

#### Ajoutez les informations dans le fichier _/etc/tor/torrc_  (il faudra recommencer pour chaque serveur)

```
sudo echo "HiddenServiceDir /var/lib/tor/hidden_service/cozycloud" >> /etc/tor/torrc
sudo echo "HiddenServicePort 80 127.0.0.1:80" >> /etc/tor/torrc
```

#### Redémarrez le service tor

```
sudo service tor restart
```

#### Affichez votre nom de domaine.onion

```
sudo cat /var/lib/tor/hidden_service/cozycloud/hostname
```

#### Maintenant dans vos clients utilisez ce nom de domaine. Vos clients doivent obligatoirement être capable de se connecter au réseau [Tor](https://fr.wikipedia.org/wiki/Tor_(r%C3%A9seau)).


Méthode 3 : Passer par un VPN
============================

**Résumé :** Ici on va se baser sur une technique expliquée il y a quelques temps. Il suffit d'installer un serveur OpenVPN (ndlr : remplacer par une meilleure alternative quand tuto dispo), puis de ré-utiliser un script similaire à la méthode 1 pour faire correspondre les [hostnames](https://fr.wikipedia.org/wiki/Nom_de_domaine). Cette méthode à l'avantage de permettre d'oublier https et son système de certificat trusté (les communications dans le VPN étant chiffrées).

ndlr : remplacer OpenVPN par une meilleure alternative quand tuto dispo


#### Donc dans un premier temps installez OpenVPN sur une machine en suivant les tutos en fonction de votre machine/distro : 

  * Pour Raspbian (sur Raspberry Pi) : [[Tuto/HowTo] Monter un serveur VPN avec PiVPN sur Raspbian](https://linuxfr.org/forums/linux-debian-ubuntu/posts/tuto-howto-monter-un-serveur-vpn-avec-pivpn-sur-raspbian)

  * Pour Ubuntu-Minimal (sur Odroid-XU4) : [[Tuto/HowTo] [GNU/Linux] Monter un serveur OpenVPN sur Odroid (Ubuntu Minimal) avec PiVPN](https://www.0rion.netlib.re/forum4/viewtopic.php?f=14&t=621)

#### Fixez l'adresse IP de votre où vos serveurs : [[Tuto/HowTo] Fixer ip des clients sur openvpn](https://linuxfr.org/forums/linux-debian-ubuntu/posts/tuto-howto-fixer-ip-des-clients-sur-openvpn)

#### Enfin, suivez cette méthode : [[Tuto] Se connecter à son OpenVPN depuis son LAN et WAN malgré routeur pas compatible hairpinning](https://linuxfr.org/wiki/tuto-se-connecter-a-son-openvpn-depuis-son-lan-et-wan-malgre-routeur-pas-compatible-hairpinning)

#### Dernièrement, ajoutez dans votre fichier _/etc/hosts_ la correspondance entre vos noms de domaine et leur adresse IP fixe à l'intérieur du VPN.

```
sudo echo "10.8.0.42	pensée-profonde.com" >> /etc/hosts
```