Visualiser une révision

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

voxdemonix : révision n°16 (02 septembre 2018 23:42:36)

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 [gitlab](https://gitlab.com/voxdemonix/divers-script/raw/master/updateHost.bash) ou [github](https://github.com/voxdemonix/divers-script/blob/master/updateHost.bash) (abandonné))

```bash
#!/bin/bash
# Version : 1.2 ; Licence WTFPL ; coder 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
#		/path/scripts/updateHost.bash	192.168.1.42	00:11:22:33:44:55	www.linuxfr.org	10.8.0.1
# 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" "$ipWAN") -gt 0 ]; then
#		sed -i "/$ipWAN $hostnameMachine/d" $fileHosts
		sed -i "/$hostnameMachine/d" $fileHosts
	fi

        if [ $(CheckEntryInHosts "$hostnameMachine" "$ipLAN") -eq 0 ]; then
                echo "$ipLAN    $hostnameMachine" >> $fileHosts
        fi
else
        #        echo "tor/wan"
	# we remove the entry in /etc/hosts
#	sed -i "/$ipLAN	$hostnameMachine/d" $fileHosts
       sed -i "/$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, 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
```




Méthode 4 : Passer par le Hotspot Fon ou AutoFon du routeur
============================

**Note :** Testé sur FON Belgacom, fonctionne probablement avec d'autres opérateurs ([liste ici](https://fr.wikipedia.org/wiki/FON#Point_d'acc%C3%A8s_Fon), à vous de tester et me reporter si ca fonctionne ou non). Ici nous allons utiliser le réseau wifi [FON](https://fr.wikipedia.org/wiki/FON) qui peut provenir du même routeur que les serveurs mais opèrera depuis une autre adresse IP WAN. Le désavantage et que ça compte comme une connexion distante et peut donc participer à votre quota maximal chez votre opérateur (belgacom c'est 750Go/mois, Voo 250Go/mois).

1. **Connectez-vous tout simplement au réseau wifi _Fon_ ou _AutoFon_ de votre routeur (pour une connexion maximal sans tirer sur votre bande passante), ou celle de votre voisin le plus proche.**

1. **Comme adresse (hostname) pour vos services, entrez leur nom de domaine sur Internet (même si vous êtes connecté au même routeur, vous n'êtes pas dans le même LAN et ne pouvez joindre vos serveurs en entrant leur IP interne)**


Méthode 5 : en mettant en place un DNS paramétrable
===================================================

Note : côté défaut lorsque les machines changent de réseau il faut attendre qu'elles renouvellent leur cache DNS. En attendant se renouvellement, elles tenteront de joindre la mauvaise adresse.

1. Suivez ce tutoriel : [[Tuto/HowTo] Mettre en place un serveur DNS aux noms de domaines parametrable (Rogue DNS)](https://linuxfr.org/wiki/tuto-howto-mettre-en-place-un-serveur-dns-aux-noms-de-domaines-parametrable-rogue-dns)

1. Configurez votre routeur pour que tout les clients du réseau LAN utilise ce serveur DNS.