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

0
18
jan.
2018

Sommaire

Introduction

Si vous disposez d'une "Box internet" (un routeur de votre Fournisseur d'Accès 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.
Ce problème n'est pas un bug mais la disparition d'une fonctionnalité (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 pour 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 ou github (abandonné))
#!/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 [ "$?" == "0" ]  && [ "$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) de la machine lié au hostname par exemple 192.168.1.42

  • [adresse_MAC] => l'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). 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. Tout les logiciels ne sont pas forcément capable de passer par un Tor Hidden Service sans un proxy (par exemple SSH). Les clients doivent aussi être capable de joindre le réseau Tor (pour android voir 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.

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. 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 :
Fixez l'adresse IP de votre où vos serveurs : [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
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, à vous de tester et me reporter si ca fonctionne ou non). Ici nous allons utiliser le réseau wifi 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.

  2. 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)

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

  • # portage android

    Posté par  . Évalué à 1 (+0/-0).

    Ce serait pas mal si quelqu'un pouvait aider à porter le script de la méthode 1 sur android (si c'est possible, sans besoin de root).

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.