HTTP-Tunnel, ou comment encapsuler dans des paquets HTTP
HTTP-Tunnel sert à encapsuler des paquets d'un autre protocole (FTP, SSH, etc) dans des paquets HTTP. Ceci permet de passer à travers de certains pare-feux ou proxys qui bloquent les paquets, notamment sur des réseaux sécurisés d'entreprise.
Pré-requis
- Disposer des droits d'administration.
- Disposer d'une connexion à Internet configurée et activée.
Voir aussi SSH et Crokscrew https://forum.ubuntu-fr.org/viewtopic.php?id=213500 , une solution plus simple uniquement coté client pour passer le proxy. Pour avoir des tunnels, l'emploi des tunnels SSH est alors plus sure puisque automatiquement crypté.
Installation
Fonctionnement
Le paquet http-tunnel doit être installé sur le client et sur le serveur. Ce paquet est composé du serveur http-tunnel qu'on appelle par la commande hts et du client http-tunnel qu'on appelle par la commande htc. Le principe est que le serveur http-tunnel écoute sur un port TCP donné (toujours au dessus de 1024) et que le client se connecte sur ce port afin de créer un tunnel. Ensuite le client FTP ou SSH désiré se connecte sur le client htc (en local la plupart du temps, nous allons y revenir), et le serveur hts redirige le flux vers le serveur SSH (en local aussi).
______________ _______________ | PC Client | | PC Serveur | |------------| |-------------| | Client SSH | | Serveur SSH | | | | | ^ | | | | | | | | V | | | | | Client HTC ===================================> Serveur HTS | |__[23000]___| |___[10000]___| 192.168.0.10 monsite.com
Configuration
Dans cet exemple le serveur hts écoute sur le port TCP 10000 de l'adresse monsite.com, et redirige tout ce qui arrive vers le port 22 de la même machine (localhost) pour le lancer on utilise la ligne de commande suivante :
hts -F localhost:22 10000
Utilisation
Sur le client on transfère le port de connexion SSH (23000) vers le serveur HTTP-Tunnel (monsite.com:10000) et il faut paramétrer le proxy si vous en utilisez un (voir options de connexion).
htc -F 23000 -P le_proxy:8080 monsite.com:10000
Ensuite il suffit de lancer la commande suivante sur le client pour se connecter au serveur.
ssh utilisateur@localhost -p 23000
Script de démarrage
tunnel_accept: couldn't write GET header: Invalid argument
Le problème est discuté là :
Le bug a été corrigé sur GitHub
Installer le package httptunnel 3.3+dfsg-4 de Wily corrige le problème.
Ci dessous un script de démarrage pour /etc/init.d/ pour ajouter au démarrage du système le serveur HTTP-Tunnel.
Créez un fichier appelé /etc/init.d/httptunnel et rendez-le exécutable :
sudo touch /etc/init.d/httptunnel && sudo chmod 755 /etc/init.d/httptunnel
Pensez aussi à créer le fichier de log (/var/log/hts_server.log) avant de lancer ce script.
sudo touch /var/log/hts_server.log && sudo chmod 644 /var/log/hts_server.log
Ajouter httptunnel aux applications à démarrer au lancement du système.
sudo update-rc.d httptunnel defaults Adding system startup for /etc/init.d/httptunnel ... /etc/rc0.d/K20httptunnel -> ../init.d/httptunnel /etc/rc1.d/K20httptunnel -> ../init.d/httptunnel /etc/rc6.d/K20httptunnel -> ../init.d/httptunnel /etc/rc2.d/S20httptunnel -> ../init.d/httptunnel /etc/rc3.d/S20httptunnel -> ../init.d/httptunnel /etc/rc4.d/S20httptunnel -> ../init.d/httptunnel /etc/rc5.d/S20httptunnel -> ../init.d/httptunnel
Éditez le fichier /etc/init.d/httptunnel en tant que root (sinon vous n'aurez pas les droits en écriture), et copier/coller le script ci-dessous dedans.
- httptunnel
#!/bin/sh # ### BEGIN INIT INFO # Provides: httptunnel # Required-Start: $syslog $remote_fs $network # Required-Stop: $syslog $remote_fs $network # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: Start httptunnel as daemon at boot time ### END INIT INFO # # Declaration des variables # NO_PROCESS=`ps -ef | grep "hts -F" | grep -v grep | awk {'print $2'}` NB_PROCESS=`ps -ef | grep "hts -F" | grep -v grep | wc -l` LOGFILE="/var/log/hts_server.log" DATE=`date +%d/%m/%Y-%Hh%Mm%Ss` # # Debut du script # case "$1" in start) if [ $NB_PROCESS = "0" ] then echo "$DATE : Demarrage du Serveur HTTP-Tunnel" echo "$0 $1 : $DATE : Demarrage du Serveur HTTP-Tunnel" >> $LOGFILE hts -F localhost:22 10000 exit 0 else echo "$DATE : Serveur HTTP-Tunnel deja demarre, process N° : $NO_PROCESS" echo "$0 $1 : $DATE : Serveur HTTP-Tunnel deja demarre, process N° : $NO_PROCESS" >> $LOGFILE exit 0 fi ;; stop) if [ $NB_PROCESS = "1" ] then echo "$DATE : Arret du Serveur HTTP-Tunnel" echo "$0 $1 : $DATE : Arret du Serveur HTTP-Tunnel" >> $LOGFILE echo "$0 $1 : $DATE : Kill du N° de process : $NO_PROCESS" >> $LOGFILE kill -9 $NO_PROCESS else echo "$DATE : Serveur HTTP non demarre, pas besoin de l'arreter" echo "$0 $1 : $DATE : Serveur HTTP non demarre, pas besoin de l'arreter" >> $LOGFILE fi ;; restart) $0 stop $0 start ;; status) if [ $NB_PROCESS = "0" ] then echo "$DATE : Aucun serveur HTTP-Tunnel en cours" echo "$0 $1 : $DATE : Aucun serveur HTTP-Tunnel en cours" >> $LOGFILE else echo "$DATE : Serveur HTTP-Tunnel en cours : $NO_PROCESS" echo "$0 $1 : $DATE : Serveur HTTP-Tunnel en cours : $NO_PROCESS" >> $LOGFILE fi ;; view_log) cat $LOGFILE ;; *) echo echo "Utilisation : $0 { start | stop | restart | status | view_log }" echo ;; esac exit 0
Ce script peut donc être appelé par la commande /etc/init.d/httptunnel et accepte 4 arguments différents :
- start pour lancer le service ;
- stop pour l'arrêter ;
- status pour afficher un état des lieux ;
- view_log pour afficher le journal.
En cas de soucis
Si votre tunnel ne se crée pas coté serveur ou coté client, pensez à vérifier si le port demandé en écoute pour hts ou htc est bien libre.
sudo ss -lap | grep -F ":56986" # remplacer 56986 par le numéro de port
Si le port est déjà occupé cette commande affichera quelque chose dans le résultat, autrement elle n'affichera rien. Bon courage
Voir aussi
Documentation commentcamarche
Documentation Wikipedia en anglais
Site Officiel
Contributeurs : maclane45