[Tuto/HowTo] [GNU/Linux] apache2 Reverse Proxy : Rediriger du trafic vers un autre serveur à travers un tunnel SSH

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

[Tuto/HowTo] [GNU/Linux] apache2 Reverse Proxy : Rediriger du trafic vers un autre serveur à travers un tunnel SSH

Message par voxdemonix » ven. janv. 20, 2017 3:04 pm

musique d'entrain : BEST OF 2016! Techno & Hands Up Mega Mix | *2016* January #015 Best Remixes Of Popular Songs 2016 | New Dance Pop Charts Music Mix | Top 100 Electro House Hits
Tuto testé sur : Raspian 8 (jessie), Ubuntu 16.04 (xenial)

Rediriger du trafic vers un autre serveur
Si vous êtes derrière un NAT et que serveur1 occupe déjà les ports standard 80 et 443 vous avez sûrement envie de joindre serveur2 sans ouvrir d'autres ports ni complexifier l'URL pour vos utilisateurs.
Avec la technique que nous allons mettre en place les utilisateurs joindront serveur2 de façon invisible en passant par serveur1. Les données entre serveur1 et serveur2 seront chiffrées et encapsulées dans un tunnel SSH. Si votre réseau change de configuration (passe d'IPv4 à IPv6) la redirection continuera de fonctionner en transitant par Tor. Vous pouvez bien entend vous passer du tunnel SSh et directement joindre serveurDestination, SSH apporte juste plus de simplicité que TLS (https).
Ce tuto pars du principe que vous avez déjà configuré un vhost sur votre serveurDestination.
Pour ce faire nous allons :
  1. Mettre en place un tunnel SSH de serveur1 vers serveur2
  2. Modifier le fichier /etc/hosts afin d'ajouter les différents hostnames utilisé par serveur2 avec comme IP 127.0.0.1 à chaque fois
  3. Créer un vhost qui redirige le trafic vers ces hostnames


Farm Link Mise en place
Note : dans ce tuto serveurPasserelle sera le serveur qui recevra les requêtes d'internet, serveurDestination sera le serveur sur lequel se trouve votre webservice et qui doit recevoir les requêtes finales.
Note Bis : du point de vue de serveurDestination, les clients auront tous l'IP 127.0.0.1
Sur serveurDestination
  1. Installez les pré-requis
  2. Créez un hidden service SSH en lançant les commandes suivantes
    • Code : Tout sélectionner

      sudo su
      mkdir -p /var/lib/tor/hidden_service
      mkdir -p /var/lib/tor/hidden_service/ssh
      echo "HiddenServiceDir /var/lib/tor/hidden_service/ssh" >> /etc/tor/torrc
      echo "HiddenServicePort 22 127.0.0.1:22" >> /etc/tor/torrc
      chown debian-tor:root -R /var/lib/tor/hidden_service/
      chmod 700 -R /var/lib/tor/hidden_service/
      service tor restart
      cat /var/lib/tor/hidden_service/ssh/hostname
      Note : Penses à noter l'adresse en .onion que la dernière commande va te fournir, tu en aura besoin pour la suite.
      Si par la suite vous souhaitez la ré-afficher, entrez cette commande sur votre serveurDestination.
  3. Créez votre utilisateur dédié
  4. Éditez /etc/ssh/sshd/config
  5. Ajoutez les lignes suivantes pour restreindre le tunnel à 127.0.0.1
  6. Redémarrez le serveur SSH
Sur serveurPasserelle
Pré-requis
  • Installez les pré-requis
Liaison SSH
  1. Exporter la clés SSH
    • Code : Tout sélectionner

      sudo su
      ssh-copy-id -i ~/.ssh/id_rsa.pub user_tunnel_ssh@adresseserverDestination
      Note : si vous n'avez jamais créé de clés pour votre utilisateur root (admin) alors lancez les commandes suivantes Pour vérifier l’existence de la clés RSA de root entrez la commande suivante
  2. Vérifier que la connexion sans mot de passe fonctionne
  3. Rendre compatible le client ssh avec le réseau Tor
  4. Créer le script de démarrage qui va créer la liaison peu après le boot
  5. Ajouter le script suivant en adaptant ses variables
    • Code : Tout sélectionner

      #!/bin/bash
      #  -> WTFPL - infos script : https://www.0rion.netlib.re/forum4/viewtopic.php?f=79&t=503&p=1101#p1101
      # createur de tunnel SSH dynamique (LMan si possible si non Wan ou Tor suivant l'hostname indiqué par l'user)
      # -> v1.0 - code by voxdemonix <-
      
         #pour tester que la création de tunnel fonctionne vous pouvez adapter la ligne suivante puis la lancer dans votre shell
      #su myUser -c 'autossh -M 0 -q -N -o "ServerAliveInterval 60" -o "ServerAliveCountMax 3" -L 8080:127.0.0.1:8080 user_tunnel_ssh@HOSTNAME'
      
      
      ipServerDestinationLan="192.168.1.42" # l'adresse IP LAN de votre serverDestination
      adresseServerDestinationTor="monTorHiddenService.onion" # l'adresse en .onion de ton serverDestination que je t'ai dis de noter quelques paragraphes plus haut
      adresseMacServerDestination="00:00:00:00:00:00" #l'adresse mac de ton serverDestination (tapes ifconfig dans un terminal sur ton server pour la voir)
      UserLocalForSshTunneling="root" # l'user a utiliser sur serverPasserelle pour le montage du tunnel (dans ce tuto on utilise root afin d'empêcher un virus ayant piraté l'user principale d’exécuter des commandes sur le serveurDestination)
      UserRemoteForSshTunneling="user_tunnel_ssh" # l'user a utiliser côté serverDestination ( /!\ n'utilisez jamais root ni pi !)
      portEntree="80" # le port http d'entrée du tunnel
      portSortie="8080" # le port http du webservice sur serveurDestination (80 par défaut)
      portEntree_deux="8443" # le port http d'entrée du tunnel
      portSortie_deux="443" # le port http du webservice sur serveurDestination (80 par défaut)
      
      if [ ! "$SUDO_USER" ]; then
      exit 0
      fi
              # boucle qui permet d'attendre que le réseau soit connecté
      stop="0"
      while [ $stop -lt 1 ]
      do
      sleep 120       # temps d'attente entre chaque tentative
      
      _IP=$(hostname -I) || true
      if [ "$_IP" ]; then
              #printf "My IP address is %s\n" "$_IP"
              stop=1
      fi
      done
      
      ping $ipServerDestinationLan -c 1 >> /dev/null 2>&1
      macRecover=$(arp -n | grep -i -o $adresseMacServerDestination)
      
      if [ "$macRecover" == "$adresseMacServerDestination" ]; then
         su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$ipServerDestinationLan -f"
         
            su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree_deux:127.0.0.1:$portSortie_deux $UserRemoteForSshTunneling@$ipServerDestinationLan -f"
      else
         su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree:127.0.0.1:$portSortie $UserRemoteForSshTunneling@$adresseServerDestinationTor -f"
         
            su $UserLocalForSshTunneling -c "autossh -M 0 -q -N -o 'ServerAliveInterval 60' -o 'ServerAliveCountMax 3' -L $portEntree_deux:127.0.0.1:$portSortie_deux $UserRemoteForSshTunneling@$adresseServerDestinationTor -f"
      fi
      
      • ipServerDestinationLan="192.168.1.42" => l'adresse IP LAN de votre serverDestination
        adresseServerDestinationTor="monTorHiddenService.onion" => l'hostname WAN ou l'adresse Tor Hidden Service au choix
        adresseMacServerDestination="00:00:00:00:00:00" => l'adresse mac de ton serverDestination (tapes ifconfig dans un terminal sur ton server pour la voir)
        UserLocalForSshTunneling="root" => l'user a utiliser sur serverPasserelle pour le montage du tunnel (dans ce tuto on utilise root afin d'empêcher un virus ayant piraté l'user principale d’exécuter des commandes sur le serveurDestination)
        UserRemoteForSshTunneling="myUserServer" => l'user a utiliser côté serverDestination ( /!\ n'utilises jamais root ou pi !)
        portEntree="80" => le port d'entrée du tunnel
        portSortie="8080" => le port du webservice sur serveurDestination (80 par défaut)
  6. Accorder les bons droits sur le script
    • Code : Tout sélectionner

      sudo chown root:root /opt/scripts/creatTunnelForuser_tunnel_ssh.sh
      sudo chmod 755 /opt/scripts/creatTunnelForuser_tunnel_ssh.sh
  7. Éditer /etc/rc.local
  8. Ajouter la ligne suivante juste avant exit 0
Redirection apache2
  1. Activez les modules apache2 nécéssaire ()
  2. Ajoutez les hostnames utilisés par les webservices sur serverDestination (par exemple www.exemple.netlib.re) vers 127.0.0.1 dans vos fichier /etc/hosts
  3. Créez un vhost en lui donnant un nom reconnaissable
    • Code : Tout sélectionner

      sudo nano /etc/apache2/sites-available/vhost-redirection_www.exemple.netlib.re.conf
      Ajoutez la configuration suivante en l'adaptant
      • Code : Tout sélectionner

        <VirtualHost *:80>
        # infos : https://www.0rion.netlib.re/forum4/viewtopic.php?f=45&t=504
        
                        ServerName      www.exemple.netlib.re
        
                                #REDIRECTION VIA TUNNEL SSH
                        ProxyPass / http://www.exemple.netlib.re:8080/
                        ProxyPassReverse / http://www.exemple.netlib.re:8080/
        
                RewriteEngine On
                #si vous souhaitez forcer le passage par https, décommentez les deux lignes suivantes en enlevant les # en début de ligne
        #        RewriteCond %{HTTPS} off
        #        RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
                ServerAlias www.exemple.netlib.re
        
                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access-www_exemple_netlib_re.log combined
        </VirtualHost>
        
        
        <IfModule mod_ssl.c>
                <VirtualHost _default_:443>
                        ServerAdmin webmaster@localhost
                        ServerAlias www.exemple.netlib.re
                        DocumentRoot /var/www/html
                        ServerName      www.exemple.netlib.re
                        
                                #REDIRECTION VIA TUNNEL SSH
                        ProxyPass / https://www.exemple.netlib.re:8443/
                        ProxyPassReverse / http://www.exemple.netlib.re:8443/
                        SSLProxyEngine on
                        SSLProxyVerify none
                        SSLProxyCheckPeerCN off
                        SSLProxyCheckPeerName off
                        SSLProxyCheckPeerExpire off
                        ErrorLog ${APACHE_LOG_DIR}/error.log
                        CustomLog ${APACHE_LOG_DIR}/access-www_exemple_netlib_re.log combined
                                # FIN REDIRECTION VIA TUNNEL SSH
        
                        SSLEngine on
                        SSLCertificateFile      /etc/letsencrypt/live/www.exemple.netlib.re/fullchain.pem
                        SSLCertificateKeyFile /etc/letsencrypt/live/www.exemple.netlib.re/privkey.pem
        
                        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                                        SSLOptions +StdEnvVars
                        </FilesMatch>
                        <Directory /usr/lib/cgi-bin>
                                        SSLOptions +StdEnvVars
                        </Directory>
        
                </VirtualHost>
        </IfModule>
        Remplacez partout www.exemple.netlib.re par votre nom de domaine. N'indiquez pas directement 127.0.0.1 si non l'hostname ne sera pas envoyé se qui est problématique si vous utilisez un vhost par hostname ou que votre CMS n'autorise qu'un seul hostname (comme prestashop)
  4. Activez votre nouveau vhost
  5. Redémarrez apache2
~ 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 : Aucun utilisateur enregistré et 0 invité