Crear un proxy Socks usando un tunel ssh

Si tienes una cuenta ssh en algún ordenador de internet la puedes utilizar como proxy para navegar desde ese ordenador remoto. En esencia un proxy es un ordenador que utilizas como puente para acceder a Internet a través de él. Esto puede ser útil para muchas situaciones. Por ejemplo:

  • Tienes que conectarte a una página a la que no puedes acceder desde tu red por estar «prohibida».
  • Quieres conectar a una página pero no quieres que sepan de entrada desde que ordenador estás consultando. Aclaración: siempre, repito, siempre se puede averiguar desde dónde se ha consultado una página, es una cuestión de tiempo y recursos (como los que tiene la policía)
  • Estas configurando un servidor de páginas web en tu red local y quieres comprobar si funciona desde Internet. Puedes llamar a un amigo para que se conecte o puedes hacerlo tú desde el proxy.

Basta con tener un cliente de ssh instalado y una cuenta en internet. En mi caso tengo una cuenta en el servidor de Hostmonster que permite acceso de ssh. Si no tienes ninguna cuenta y no quieres alquilarla hay muchos sitios en internet que te ofrecen cuentas shell gratuítas con servicios limitados.

Lo primero que haremos será usar el cliente de ssh para crear la conexión y abrir el proxy. En linux lo puedes hacer con el siguiente comando:

ssh -D 9999 usuario@direccion_servidor_ssh

Tras esto y una vez introducida la contraseña ya tendremos preparada la conexión y el puente SOCKS en el puerto 9999 de nuestro ordenador. Por supuesto se puede cambiar el número de puerto y los valores «usuario» y «direccion_servidor_ssh» correponderán con los de nuestra cuenta ssh.

La segunda parte es configurar el navegador web (o cualquier otro programa que queramos usar) para que use el puente SOCKS. En el ejemplo utilizaré el navegador Firefox. Vamos al menú «Editar->Preferencias» y en la ventana que se abre seleccionamos «Avanzado» y la pestaña «Red».

Preferencias firefox
Preferencias firefox

Una vez aquí pinchamos en «Configuración» y introducimos los datos como sigue cambiando el número de puerto 9999 si hemos seleccionado otro al crear el túnel.

Preferencias firefox
Preferencias firefox

Si hemos realizado los pasos correctamente nos conectamos a cualquier página para comprobar si funciona. Será algo más lenta que la navegación directa pero hay veces que no hay otra solución que utilizar este método.

Navega de forma anónima/segura mediante túneles SSH

seguridad-informatica

Mediante los túneles SSH podemos asegurar casi todo tipo de protocolos, al conectarnos a una red insegura, como puede ser la red WiFi de un hotel, restaurante o las típicas redes públicas que algunos ayuntamientos ofrecen de forma gratuita (que por cierto, no sé cuanto durará), estamos expuesto a diferentes ataques por parte de otros usuarios conectados a la misma red.

El escenario por norma general es poner la tarjeta en modo “promiscuo” y estar mirando todos los paquetes que pasan por nuestra tarjeta de red, que puede tratarse de información sensible, desde usuarios y claves hasta números de cuentas bancarias.

Para éste ejemplo he usado un servidor VPS de tipo “budget” (precios bajos – prestaciones bajas) para realizar el artículo. Lo primero será asegurarnos de que el servidor SSH, en mi caso OpenSSH, está correctamente configurado para soportar los túneles.

Procedemos a mirar la configuración del servicio SSH en /etc/ssh/sshd_config y buscamos las siguientes directivas:

AllowTcpForwarding yes
GatewayPorts yes
TCPKeepAlive yes

Donde el primer parámetro activa el redireccionamiento y encapsulación de los diferentes protolocos basado en TCP y el segundo hace que la conexión se mantenga de forma continua, normalmente después de un tiempo, que suele ser aproximadamente unas dos horas, la conexión TCP se desconecta de forma automática.

Una vez editado el fichero de configuración, procedemos a reiniciar el servicio:

/etc/init.d/ssh restart

En otros sistemas operativos como CentOS, los demonios se encuentran en rc.d.

El siguiente paso es conectarnos y crear el túnel en el puerto que pasaremos como argumento al cliente ssh:

>ssh -D 8080 mad@servidor-personal.com

Con el comando de arriba, estamos creando un túnel en el puerto 8080 de nuestro propio equipo hacia el servidor SSH. Si queremos aprovechar el puerto y navegar de forma segura, tendremos que configurar nuestro navegador para al conectarse a los servidores web, use como servidor SOCKS nuestro propio equipo local y el puerto 8080.

Por ejemplo en Firefox se hace en la Configuración de Red:

Después de guardar los cambios, es recomendable reiniciar el navegador. El proceso es similar en la mayoría de los demás navegadores, para crear el túnel SSH, si estamos en Windows, en la parte final de artículo encontrarás otros artículos de apoyo para hacerlo desde Windows mediante el cliente SSH PuTTy.

Podemos ver un claro ejemplo si empleamos un sniffer, en éste caso WireShark, las diferencias entre el envío de datos cifrados y en claro.

En el ejemplo de arriba los datos están cifrados, mientras que en el de abajo no.

El uso de túneles no se limita sólo al ámbito web, podemos tunelizar cualquier protocolo, si queremos acceder de forma segura a nuestro servidor de correo, también podemos tunelizar POP, SMTP, IMAP y demás.

ssh -f usuario@servidor-personal.com -L 2000:smtp.gmail.com:25 -N

En éste ejemplo, estamos haciendo un túnel desde el puerto 2000 del servidor-personal al puerto 25 del servidor SMTP de gmail.com. El uso es ilimitado, sólo depende de nuestra imaginación.

Recursos y Documentación:

_SSH Port Forwarding [Symantec]

_Port Forwarding [The SSH Definitive Guide]

_How to tunnel Web Traffic with SSH Secure Shell [Using PuTTy]

_Breaking Firewalls with OpenSSH and PuTTy

Nota:
No hace falta tener un VPS o un servidor dedicado, podemos usar nuestro propio equipo que tenemos en casa, claro está, que habrá que mantenerlo encendido continuamente.

Podeis usar tambien una shell gratuita, yo uso la de http://shellmix.com

Si nó… pues siempre tendremos web proxy para navegar desde la oficina como la de NavegasinLey.com

SSHPASS nos permite incluir la password en la misma linea de conexión SSH

Con la necesidad de hacer un script en bash, me ví con la obligación de hacer una conexion ssh y no queria que me pidiera contraseña cada vez que lo ejecutara.
Tenia la opcion por claves publicas y privada pero creo que iba a perder mucho tiempo, asi que opte por la siguiente:
Nos bajamos el paquete llamado sshpass de sourceproject

wget http://heanet.dl.sourceforge.net/project/sshpass/sshpass/1.05/sshpass-1.05.tar.gz
tar xvf sshpass-1.05.tar.gz
cd sshpass-1.05
./configure
make
sudo make install

Ahora una vez instalado sshpass en nuestro sistema o servidor, la sentencia para conectarnos a ssh es la siguiente:

sshpass -p 'passwd' ssh root@192.168.1.54

Script para traducir textos desde la linea de comandos

Script para traducir textos desde linea de comandos
Script para traducir textos desde linea de comandos

Un script muy sencillo que nos permitira si queremos utilizar traducción instantaneo en nuestros pequeños programas de bash. Basicamente se hace uso de Google Translate Ajax API y de “curl” para hacer una petición HTTP con los parametros adecuados y se analiza la respuesta recibida, los parametros son el idioma “origen”, el idioma “destino” y el string que queremos traducir.

#!/usr/bin/env bash
#  gtranslate.sh
#  Translate using Google Translate Ajax API:
#  http://ajax.googleapis.com/ajax/services/language/translate?v=1.0 \
#  &langpair=en|es&q=hello+world
#  More Info: http://code.google.com/apis/ajaxlanguage/documentation/
#  ksaver (at identi.ca), March 2010.
#  Licence: Public Domain Code.

progname=$(basename $0)

if [ -z "$3" ]
then
	echo -e "Usage:   $progname lang1 lang2 'string of words to translate...'"
	echo -e "Example: $progname en es 'Hello World!'\n"
	exit
fi

FROM="$1"
TO="$2"

# Google Translate Ajax API Url
TRANSURL='http://ajax.googleapis.com/ajax/services/language/translate?v=1.0'
LANGPAIR="$FROM|$TO"
shift 2

# Parse string to translate, change ' ' to '+'
# STRING: String to translate.
STRING="$@"
PSTRING=$(echo "$STRING" |tr ' ' '+')

# Get translation
RESPONSE=$(/usr/bin/env curl -s -A Mozilla \
		$TRANSURL'&langpair='$LANGPAIR'&q='$PSTRING)

echo -n "$progname> "
# Parse and clean response, to show only translation.
echo "$RESPONSE" |cut -d ':' -f 3 |cut -d '}' -f 1

Redireccionar puertos en Linux usando SSH

En algunas ocasiones necesitamos acceder a algún servicio o aplicación que usa un puerto diferente al que por defecto tenemos permitido.

Imaginemos que estamos usando en nuestro trabajo nuestro portatil con Ubuntu y queremos actualizar repositorios o usar facebook, messenguer, etc … Estos servicios usan un puerto determinado que en principio si no podemos usar directamente se debe a la existencia en la red de un firewall que esta capando un puerto determiando.

Pues bien utilizando SSH , nos enseñana como podremos crear un tunel sobre dicho servidor externo y evitar el firewall, usando nuestra máquina como servidor local y redireccionando todas las salidas sobre el puerto especificado, es bastante sencillo y nos saltaremos el cortafuegos gustosamente:

El ejemplo que vamos a utilizar es el saltarnos un firewall, en nuestra red que capa el puerto que utiliza ubuntu para actualizar unos repositorios en un host concreeto.

Imaginemos que deseaba agregar el repositorio UbuntuGis para instalar algunos paquetes del mismo (Grass y Quantum GIS entre otros), pero al añadirlo:

sudo add-apt-repository ppa:ubuntugis/ppa

Si hay un firewal en la red que capa dicho puerto obtendriamos el siguiente error::
Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv 6B827C12C2D425E227EDCA75089EBE08314DF160
gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
gpgkeys: HTTP fetch error 7: couldn’t connect to host
gpg: no valid OpenPGP data found.
gpg: Total number processed: 0

Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret-keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver keyserver.ubuntu.com –recv 6B827C12C2D425E227EDCA75089EBE08314DF160gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.comgpgkeys: HTTP fetch error 7: couldn’t connect to hostgpg: no valid OpenPGP data found.gpg: Total number processed: 0

* Está capando el puerto 11371, el que usa el servidor de claves en la dirección: keyserver.ubuntu.com

Ahora bien para solucionar esto mediante un tunel con SSH hariamos lo siguiente:

1. Editamos el fichero /etc/hosts (como superusuario), en concreto la siguiente línea:
127.0.0.1 localhost keyserver.ubuntu.com

2. Guardamos y teniendo en cuenta que disponemos un servidor externo con un servidor SSH y sin restricciones en cuanto a firewall se refiere, lanzamos SSH con un tunel sobre el puerto 11371 local y redireccionando la salida sobre la dirección especificada (keyserver.ubuntu.com) y el mismo puerto. Tan sencillo como la siguiente línea (en este caso estoy usando el servidor de mi universidad, y nombre_usuario el nombre de mi usuario en el servidor ts.uco.es):

ssh nombre_usuario@ts.uco.es -L 11371:keyserver.ubuntu.com:11371

3. Nos autenticamos en el servidor y ya estamos preparados para agregar el repositorio, esta vez satisfactoriamente:

      blogofsysadmins.com@asubuntu:~$ sudo add-apt-repository ppa:ubuntugis/ppa
      [sudo] password for ahornero:
      Executing: gpg –ignore-time-conflict –no-options –no-default-keyring –secret
      keyring /etc/apt/secring.gpg –trustdb-name /etc/apt/trustdb.gpg –keyring
      /etc/apt/trusted.gpg –primary-keyring /etc/apt/trusted.gpg –keyserver
      keyserver.ubuntu.com –recv
      6B827C12C2D425E227EDCA75089EBE08314DF160
      gpg: requesting key 314DF160 from hkp server keyserver.ubuntu.com
      gpg: key 314DF160: “Launchpad ubuntugis-stable” not changed
      gpg: Total number processed: 1
      gpg:              unchanged: 1

¡Y listo!, ya tenemos una bonita forma de evitar un cortafuegos para un uso concreto, en este caso agregar un repositorio.