[Tuto/HowTo] Se connecter à son OpenVPN depuis son LAN et depuis internet malgré routeur/box pas compatible hairpinnning

Avatar du membre
voxdemonix
Messages : 1336
Enregistré le : lun. févr. 02, 2015 7:28 pm

[Tuto/HowTo] Se connecter à son OpenVPN depuis son LAN et depuis internet malgré routeur/box pas compatible hairpinnning

Message par voxdemonix » lun. sept. 11, 2017 1:58 pm

musique d'ambiance : Electro Blues & Swing Monster Mix Lost Frequencies - Live at Tomorrowland 2017


Introduction
  • Les box des FAI sont souvent de vrai merde. En effet, lorsque vous tentez d'accéder à votre nom de domaine depuis votre réseau LAN, le routeur préfère vous rediriger sur une de ces pages plus tôt que d'effectuer la redirection comme s'il traitait une requête provenant d'internet. Ce problème provient d'une non compatibilité (volontaire) avec le hairpinning.
    Les Fournisseurs d'Accès Internet utilisent diverses excuses pour se justifier, comme la sécurité par exemple. Mais en réalité ils ajoutent ce défaut afin de décourager l'auto-hébergement pour diverses raisons (entre autre, encourager à utiliser les services centralisé de leur "collaborateurs" (facebook), diminuer leur frais en limitant le nombre de câble nécessaire (petit jusqu'à client et gros jusqu'à google, et fuck la fibre optique).
    Il est à noter que vous pouvez jeter la box de votre FAI à la poubelle et la remplacer par un routeur du marché qui n'aura pas ce problème. Si vous faites cela vous n'aurez plus besoin de suivre ce tutoriel :P
    Voyons donc ensemble comment contourner le problème de hairpinning pour se connecter à notre serveur OpenVPN.

Mise en place sur le client
Note : pour ce tuto je pars du principe que votre OpenVPN est déjà installé et le port ouvert sur le routeur du réseau du serveur (par défaut 1194).
  1. Copiez le fichier de configuration de votre client OpenVPN, nous allons ajouter _LAN dans le titre du nouveau fichier
    • Code : Tout sélectionner

      sudo cp /etc/openvpn/monUser.ovpn cp /etc/openvpn/monUser_LAN.ovpn 
  2. Éditez la copie qui nous servira pour le LAN
    • Code : Tout sélectionner

      sudo nano /etc/openvpn/monUser_LAN.ovpn
      A la ligne commençant par "remote", rajoutez _LAN dans le nom de domaine (ou remplacez le nom de domaine par l'IP LAN statique de votre serveur OpenVPN).
  3. Ensuite éditez votre fichier /etc/hosts afin d'y indiquer la correspondance entre notre nouveau nom de domaine dédié au LAN et l'adresse IP du serveur OpenVPN.
  4. Créez le script de lancement /opt/scripts/vpnSwitcher.bash (CTRL+X pour sauver & quitter)
  5. Puis collez le script suivant et adaptez le à votre config
    Note : source du script
    • Code : Tout sélectionner

      #!/bin/bash
      # -- vpnSwitcher --
      #  -> WTFPL - infos script : https://www.0rion.netlib.re/forum4/viewtopic.php?f=9&t=646&p=1460#p1460
      # -> code by voxdemonix <-
      # -> V1.11 (2017/09/11) <-
      # uncomment next line for debug
      #set -x
      
      if [ ! "$SUDO_USER" ]; then
      echo "!!! i need root !!!"
      exit 0
      fi
      
          #SCRIPTS OPTIONS
      LANG="fr" # notification service ; accept : fr, usa (default)
      notificationType="notify" # accept : echo; notify, nothing. Notify not work with root user.
      
          # NETWORK OPTIONS
      INTERFACE="tun"
      hostnameVpnLAN="192.168.1.69" # (VPN1 hostname) l'adresse IP locale (LAN) de votre serveur OpenVPN
      MacVpnLocal="69:69:69:69:69:69" #l'adresse mac de votre serveur OpenVPN (tapez ifconfig dans un terminal sur votre server)
      
          # VPN OPTIONS
      fichierOvpnLAN="/etc/openvpn/myUser_LAN.ovpn" # (VPN1) le PATH de votre fichier de conf .ovpn en LAN
      fichierOvpnNotLAN="/etc/openvpn/myUser.ovpn" # (VPN2) le PATH de votre fichier de conf .ovpn pour les connnexions WAN/SSH
      openVpn1Param=" " # add options (ex: --route-nopull) for openvpn connexion to server 1 (lan)
      openVpn2Param=" " # add options (ex: --route-nopull) for openvpn connexion to server 2 (ssh/tor/wan)
      
          # SSH OPTIONS
      hosnameVpnNotLAN="blablablablablabla.onion" # (VPN2 hostname)
      UserLocalForSshTunneling="daenerys" # l'user a utiliser sur votre ordinateur pour le montage du tunnel (celui qui a exporté sa clés)
      UserRemoteForSshTunneling="proxy-ssh" # l'user a utiliser côté server ( /!\ n'utilisez jamais root !)
      portEntree="1194" # le port sur le pc local, par défaut 1194 (tcp)
      portSortie="1194" # le port sur le serveur, par défaut 1194 (tcp)
      sshLanEnable=0  # 0 for disable ; 1 for enable : enable or disable the ssh tunneling in LAN
      sshNotLanEnable=0 # 0 for disable ; 1 for enable : enable or disable the ssh tunneling in Wan | Tor
      
      
      
                  # NOTIFICATION SYSTEM
      function vpnNotification {
              # $1 = message ID (watch switch/case);
              # $2 = hostnameVPN
          message=""
          #hostnameVPN=$(cat "$2" | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
          hostnameVPN=$2
      
          case $LANG in
              fr )
                      case $1 in
                          VpnDisabled )
                                  message="Connexion VPN fermée ($hostnameVPN)"
                              ;;
                          VpnConnecting )
                                  message="Connexion VPN en cours ($hostnameVPN)"
                              ;;
                          VpnEnabled )
                                  message="VPN Connecté ! ($hostnameVPN)"
                              ;;
                          SshStop )
                                  message="Tunnel SSH STOP ($hostnameVPN)"
                              ;;
                          SshStart )
                                  message="Tunnel SSH START ($hostnameVPN)"
                              ;;
                          * )
                                  message="message inconnu"
                              ;;
                      esac
                  ;;
              usa | *)
                      case $1 in
                          VpnDisabled )
                                  message="VPN Connection Close ($hostnameVPN)"
                              ;;
                          VpnConnecting )
                                  message="VPN Connection in progress ($hostnameVPN)"
                              ;;
                          VpnEnabled )
                                  message="VPN Connected ! ($hostnameVPN)"
                              ;;
                          SshStop )
                                  message="SSH Tunneling STOP ($hostnameVPN)"
                              ;;
                          SshStart )
                                  message="SSH Tunneling START ($hostnameVPN)"
                              ;;
                          * )
                                  message="unknow message"
                              ;;
                      esac
                  ;;
          esac
      
      
          case $notificationType in
              echo)
                      echo "$message"
                  ;;
              notify)
                      notify-send "$message"
                  ;;
              nothing | *)
                  ;;
          esac
      }
      
      function quitOpenVPN {
              # $1 = ovpn ( $fichierOvpnLAN, $fichierOvpnNotLAN)
              # $2 = hostnameVPN ( $hostnameVpnLAN, $hosnameVpnNotLAN)
              ovpn=$1
              hostVPN=$2
                  #stop VPN
              if [ $(pkill -c -f $ovpn) -gt 0 ]; then
      		hostnameVPN=$(cat $ovpn | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
      		vpnNotification "VpnDisabled" $hostnameVPN
              fi
                  #stop ssh
      #        if ps -aux | grep "[a]utossh" | grep "$hostVPN"  | grep -v "grep" >> /dev/null 2>&1; then
      #            for pid in `ps -ef | grep "[a]utossh" | grep "$hostVPN"  | grep -v "grep" | awk '{print $2}'` ; do kill $pid ; done
      		if [ $(pkill -c -f "autossh.*$UserRemoteForSshTunneling@$hostVPN") -gt 0 ]; then
                  vpnNotification "SshStop" $hostVPN
              fi
              sleep 1
      }
      
      function startOpenVPN {
              # $1 = hostname VPN ($hostnameVpnLAN, $hosnameVpnNotLAN)
              # $2 = ovpn ($fichierOvpnLAN, $fichierOvpnNotLAN)
              # $3 = ssh enable (1) or not (0) ($sshLanEnable, $sshNotLanEnable)
              # $4 = OpenVpn Param ($openVpn1Param, $openVpn2Param)
      
              hostVPN=$1
              ovpn=$2
              sshChoice=$3
              openvpnParam=$4
      
                      # SSH TUNNELING
                  if [ $sshChoice == 1 ]; then
                          # kill oprevious ssh tunneling
                      for pid in `ps -ef | grep "[a]utossh" | grep "$hostVPN" | awk '{print $2}'` ; do kill $pid ; done
                          # creat new ssh tunneling
                      su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$hostVPN -f"
      		        if ps -aux | grep "[a]utossh" | grep "$hostVPN"  | grep -v "grep" >> /dev/null 2>&1; then
      		            vpnNotification "SshStart" $hostVPN
      		        fi
                  fi
      
                      # START OpenVPN
                  openvpn --daemon $openvpnParam --config $ovpn
      
                      # NOTIFICATIONS
                  hostnameVPN=$(cat $ovpn | grep "remote " | sed 's/remote //g' | sed 's/ [[:digit:]]\+//g')
                  vpnNotification "VpnConnecting" $hostnameVPN
      
                      # boucle qui permet de verifier si le VPN se connecte bien
              stop=0
              while [ $stop -lt 10 ]
              do       # temps d'attente entre chaque tentative
                  if ifconfig | grep -iq $INTERFACE; then
                          vpnNotification "VpnEnabled" $hostnameVPN
                          stop=10
                          exit
                  fi
                      sleep 5
                     stop=$((stop+1))
              done
      
      }
      
      
      
              # boucle qui permet d'attendre que le réseau soit connecté
      stop="0"
      while [ $stop -lt 1 ]
      do
      	sleep 3       # temps d'attente entre chaque tentative
      
      	_IP=$(hostname -I) || true
      	if [ "$_IP" ]; then
      	        stop=1
      	fi
      done
      
      if ps -aux | grep "[o]penvpn" >> /dev/null 2>&1; then
          #Connexion VPN active
      
                  # vpn server 1
              quitOpenVPN $fichierOvpnLAN $hostnameVpnLAN
                  # vpn server 2
              quitOpenVPN $fichierOvpnNotLAN $hosnameVpnNotLAN
      
      
      else
      
              ping $hostnameVpnLAN -c 2 >> /dev/null 2>&1
              macRecover=$(arp -n | grep -i -o $MacVpnLocal)
      
              if [ "$macRecover" == "$MacVpnLocal" ]; then
              #        echo "local/LAN/First VPN"
                  startOpenVPN $hostnameVpnLAN $fichierOvpnLAN $sshLanEnable $openVpn1Param
      
              else
              #        echo "tor/wan/second VPN"
                  startOpenVPN $hosnameVpnNotLAN $fichierOvpnNotLAN $sshNotLanEnable $openVpn2Param
      
              fi
      
      fi
      
      Éditez les valeurs suivantes
      • hostnameVpnLAN="192.168.1.69" => (VPN1 hostname) l'adresse IP locale (LAN) de votre serveur OpenVPN
        MacVpnLocal="69:69:69:69:69:69" => l'adresse mac de votre serveur OpenVPN (tapez ifconfig dans un terminal sur votre server)
        fichierOvpnLAN="/etc/openvpn/myUser_LAN.ovpn" => (VPN1) le PATH de votre fichier de conf .ovpn en LAN
        fichierOvpnNotLAN="/etc/openvpn/myUser.ovpn" => (VPN2) le PATH de votre fichier de conf .ovpn pour les connnexions WAN/SSH
  6. Sauvez et quittez avec CTRL+X, puis rendez votre fichier exécutable
  7. Lancez ensuite le script afin de le tester
  8. S'il fonctionne correctement, ajoutez le au démarrage du client soit via /etc/rc.local soit via cron
  9. Ajoutez enfin la ligne suivante (CTRL+X pour sauver et quitter)




Farm Link
~ Infernalis Creatorem ~
  • Rejoins le côté obscure, on a des cookies !
Donation Bitcoin : 1N8QGrhJGWdZNQNSspm3rSGjtXaXv9Ngat
Donation Dash : XmowiBRku3tsEREp7PhpheY4TgeLLDyKdM

Qui est en ligne

Utilisateurs parcourant ce forum : CommonCrawl [Bot] et 0 invité