tunelizar puertos a través de un proxy

Venga, hoy el más difícil todavía!
Hace unos meses publiqué un artículo en el antiguo blog como tunelizar puertos por otros puertos, para salvar firewalls y seguir usando tus protocolos favoritos. Pero la cosa se complica cuando queremos que además esto se pase por un proxy con nombre de usuario y contraseña.

Si eres usuario de guifi.net, linuxero y ircadicto, tienes un problema, pero para esto están otros linuxeros que se han encontrado con tu mismo problema, este es el caso de Jose de nómada.

Cuando tu sales por guifi.net es necesario configurar un proxy para poder salir a internet. Los navegadores tienen un interfaz intuitivo para configurar uno, pero cuando vamos por consola, es imposible hacer wgets o incluso actualizar el sistema, esto normalmente lo salvamos haciendo un export.

export proxy_http=”http://usuario:contraseña@ipproxy:portproxy”
export proxy_ftp=”http://usuario:contraseña@ipproxy:portproxy”
export proxy_socks=”http://usuario:contraseña@ipproxy:portproxy”

pero incluso haciendo esto no es posible conectarse por ejemplo al irc por el puerto 6669, o al ssh por el puerto 22.

Corkscrew es nuestro salvador!

# apt-get install corkscrew

a continuación creamos un fichero donde meteremos el usuario y el password del proxy

# vi /home/laura/.ssh/myauth
# usuario guifi.net (para poner un ejemplo)
nombre.apellido:contraseña

lo protegemos un poquito de miradas curiosas

# chmod 600 /home/laura/.ssh/myauth

a continuación en el fichero de configuración del ssh en ~/.ssh/config añadiremos una linea (si no existe, lo creamos).

# vi /home/laura/.ssh/config
# Corkscrew
Host *
ProxyCommand /usr/bin/corkscrew ipproxy puertoproxy %h %p /home/laura/.ssh/myauth

A partir de ahora, ssh cuando se connecte va a usar la configuración que acabamos de crear, tunelizando con el corkscrew.

Si te aparece este mensaje:

ssh_exchange_identification: Connection closed by remote host

Significa que el servidor está detrás de un firewall cortando conexiones extrañas, luego nuestra salida es usar otro programa, el netcat. Si ya puedes conectarte no hace falta que sigas leyendo si no quieres. Hasta aquí hay gente que lo ha hecho y le ha funcionado. Como a mi no me ha funcionado, sigo:

Vamos a crear el fichero ssh-config dentro de ~/.ssh/ con este contenido

#!/bin/bash
#
# Simple shell wrapper to proxy/tunnel or hop through ssh
# appropriately when unable to connect directly.  Often useful on
# laptops, espeically when only SOMETIMES behind a draconian firewall
# or outside a network with limited ssh connections inbound.
#
# Indended for use inside an ssh-config file, something like this:
#    Host *
#      ProxyCommand $HOME/.ssh/proxy -p httpproxy.foo.com:8080 %h %p
#  or
#      ProxyCommand $HOME/.ssh/proxy -h ssh-hop.foo.com:8080 %h %p
#
# Generally, the usage of this is:
#    proxy [optional-args] [-p <http-proxy>[:<proxy-port>]] 
#                          [-h <ssh-hop-host>[:<hop-port>]] <host> <port>
# with optional args:
#   [-n <netcat>] - version or path to netcat/direct-connect program
#   [-t <tunnel>] - version or path of http-tunnel program
#   [-w <timout>] - timeout (seconds) to test connection to proxy server
#
# This script assumes ssh, netcat (nc) and corkscrew (an http-proxy
# available from http://www.agroman.net/corkscrew).  Netcat is used
# both to detect the availablility of the destination or proxy hosts
# as well as for direct connections.  Both are assumed to be resident
# in your PATH.  If not, you may specify a different http-proxy or
# alternate location for netcat on the command line (in your ssh
# config) OR, of course, "use the source, Luke"...
#
# Author:  Eric Engstrom (engstrom(-AT-)m t u(-DOT-)n e t)
#
# To Do:
#   * Should accept multiple hop or proxy and construct chained command
#
# $Id: ssh-proxy 437 2009-08-12 19:28:55Z engstrom $
##

# set to "echo" to debug; use -v option to ssh to see output
DEBUG=

# defaults
ssh=ssh
agent="-A"         # forward agent
tunnel=corkscrew
netcat=nc
timeout=8
# if "nc" not found, try "netcat"
if ! type -p ${netcat} >/dev/null 2>&1; then
  netcat="netcat"
fi
if ! type -p ${netcat} >/dev/null 2>&1; then
  echo "Cannot find netcat - failing..." 1>&2
  exit 1;
fi

# parse args - can specify -n <netcat> and/or -t <tunnel>
while getopts "n:h:p:s:t:w:" OPT; do
  #echo "$OPT $OPTARG $OPTIND"
  case $OPT in
    h) arr=(${OPTARG//:/ }); hop="${arr[0]} ${arr[1]:+ -p ${arr[1]}}" ;;
    p) arr=(${OPTARG//:/ }); proxy="${arr[0]} ${arr[1]}" ;;
    n) netcat=$OPTARG ;;
    s) ssh=$OPTARG ;;
    t) tunnel=$OPTARG ;;
    w) timeout=$OPTARG ;;
  esac
done
shift $(($OPTIND - 1))

# test connection to host directly; go direct if possible, else 
#  tunnel or hop
if ${netcat} -w ${timeout} -z $1 ${2} >/dev/null 2>&1; then
  $DEBUG exec ${netcat} $1 $2
elif [ -n "${proxy}" ]; then
  $DEBUG exec ${tunnel} ${proxy} $1 $2
elif [ -n "${hop}" ]; then
  #$DEBUG exec ${ssh} ${agent} ${hop} ${netcat} $1 $2
  # Seems like use of exec causes error on exit - not sure why.
  # [engstrom:20090809.2228CST]
  $DEBUG ${ssh} ${agent} ${hop} ${netcat} $1 $2
else
  echo "No proxy or hop host specified - failing..." 1>&2
  exit 1;
fi

y en el fichero ~/.ssh/config lo dejamos así

# vi /home/laura/.ssh/config
 # Corkscrew
 Host *
 ProxyCommand ~/.ssh/ssh-proxy ipproxy puertoproxy %h %p ~/.ssh/myauth

Para otros problemas que nos encontramos mirar este link.

Otros links de interés: IndiX (Configurar SSH a través d’un HTTP Proxy)

PS: publico ya el post de una vez porque hace la tira de días que lo tengo a medias. Yo aún no me he podido conectar, así que lo publico a forma que cada uno comente sus problemas.

One Comment

  1. nota mental: es mucho mas placentero ayudar a hacer crecer el proyecto guifi.net y conseguir un servidor con salida a internet y a guifi, antes que usar estas herramientas.

    Respon

Respon a Blackhold Cancel·la les respostes

L'adreça electrònica no es publicarà. Els camps necessaris estan marcats amb *

Aquest lloc utilitza Akismet per reduir els comentaris brossa. Apreneu com es processen les dades dels comentaris.