Conectar por SSH a través de un proxy HTTP

— [ edit | raw ] migrated from node/42

Esta receta es para todos aquellos que estais en un entorno restrictivo en el que solo hay acceso al exterior a través de un proxy HTTP, como es mi caso actualmente.

Tan solo os será necesario un programa llamado Corkscrew. Los usuarios de Debian y derivados lo tenemos a tiro de apt-get.

Explicación

¿Qué hace este programa? Pues aprovecha una capacidad del proxy, el método CONNECT que permite hacer una conexión a un puerto TCP usando al proxy como intermediario. Lógicamente esto es de sobra conocido por un administrador de red y lo mas normal es que el proxy esté situado detrás de un firewall que no permitirá al proxy acceder a puertos distintos de los puramente web. Estos puertos son el HTTP:80 y HTTPS:443, cabe la posibilidad de que también tengamos acceso a FTP a través del proxy, lo que significará que éste también puede acceder a los puertos 20 y 21.

Con esta información ya nos vamos haciendo una idea de lo que va a pasar. Vamos a invocar ssh a través de Corkscrew para que se conecte al servidor de destino utilizando el proxy. El servidor de SSH utiliza el puerto 22 y lo normal es que el proxy no pueda acceder a dicho puerto, por este motivo será necesario que en el servidor al que queremos acceder le hayamos hecho un pequeño truco previo. El “truco” consiste en redirigir un puerto web que no esté en uso al puerto 22. Usualmente se utiliza el 443.

Vamos a ver como se cocina todo esto junto.

Elaboración

En primer lugar hay que redirigir el tráfico de nuestro servidor, del puerto 443 al 22. Una opción es lanzar el demonio ssh directamente en el puerto 443, pero eso no parece una solución elegante. No obstante quien quiera hacerlo no tiene más que tocar en /etc/ssh/sshd_config.

Lo mas limpio es usar iptables para redirigir el trafico. La orden es esta.

# iptables -t nat -A PREROUTING -i ippp0 -p tcp --dport 443 -j REDIRECT --to-port 22

Con corkscrew instalado vamos al directorio $HOME/.ssh y editamos el fichero config (si no existe, lo creamos). En su interior ponemos esto:

Host servidor.casa.com
ProxyCommand /usr/bin/corkscrew proxy.curro.es 8080 %h %p

Donde proxy.curro.es el la dirección del proxy de nuestra red y 8080 es el puerto que usa el proxy. Las variables %h y %p se refieren al host y al port que usaremos para conectar y se le pasan desde el comando ssh como veremos a continuación.

Ahora para conectar a cualquier sitio tan sólo necesitamos ejecutar la orden.

$ ssh -p 443 usuario@servidor.casa.com

Más difícil todavía

Si nuestro proxy necesita autenticación tendremos que crear un segundo fichero en .ssh/autenticacion con lo siguiente

usuario:password

y en el fichero anterior (ssh_proxy) ponemos:

ProxyCommand /usr/bin/corkscrew proxy.curro.es 8080 %h %p $HOME/.ssh/autenticacion

Un consejo final

Si os pasa, además de todo lo anterior, que vuestra conexión se corta cada dos por tres por falta de actividad basta con añadir esto en el fichero ssh_proxy

ServerAliveInterval 60
ProxyCommand /usr/bin/corkscrew proxy.curro.es 8080 %h %p

¿Utilidad final de todo esto?

Vale, ya puedo acceder mediante SSH al ordenador de casa desde el trabajo, ¿y que? Pues si tenéis problemas con el proxy de vuestro trabajo porque os deniega el acceso a algunas páginas web que os son imprescindibles y el departamento de sistemas os ignora completamente, tan solo tenéis que instalar un proxy HTTP en vuestro ordenador, como por ejemplo squid (la configuración por defecto de squid en Debian funciona para lo que queremos hacer) y tunelizar las peticiones desde nuestro ordenador con el siguiente comando.

$ssh -p 443 usuario@servidor.casa.com -L 3128:localhost:3128

Estamos suponiendo que el servidor squid casero corre en el puerto por defecto, y redirigimos nuestro puerto local hacia el puerto remoto. Ahora solo tenemos que configurar el programa que queramos para que use como proxy

localhost:3128
y todo listo, ya estamos usando el proxy de casa sin restricciones.

Enlaces relacionados

Cienes y cienes de cosas (como diría aquel)

— [ edit | raw ] migrated from node/40
Hola a todos ... ¿crysoleros? (¡qué horterada!).

Instalación de eDonkey2000

— [ edit | raw ] migrated from node/38
En esta receta explico como instalar eDonkey2000. La idea es instalar el core en un PC y el cliente ed2k-gui en otro PC distinto.

Instalar el core

Después de bajar el core desde ed2k, lo siguiente es instalarlo:
# dpkg -i el_core_que_sea.deb
Y después configurarlo:
$ edonkeyclc
[--- Storing settings in '/XXXXX/XXXX/.eDonkey2000' ---]

Welcome to eDonkey2000 command line client 1.3.0
Enter commands at any time (type '?' for help)
>
Ahora se nos abre el shell del core. Lo primero será crearnos un usuario del core:
> name fulanito
Ahora vamos a establecer la velocidad máxima de bajada (20 KB/sec) y de subida (7 KB/sec), por ejemplo:
> dumax 20 7
Lo siguiente será crear un usuario y una contraseña para poder conectar desde los clientes gráficos a nuestro core (o cliente en modo texto):
> pass usuario passwd
Ten en cuenta que el passwd no se cifra ni nada por el estilo, por eso es aconsejable usarlo bajo una red segura. Veamos lo que hemos creado:
> vo
Name:                   fulanito
Max Download Speed:     20.00
Max Upload Speed:       7.00
Line Speed Down:        0.00
TCP Port:               0
UDP Port:               3620
Admin Port:             4663
Admin Name:             usuario
Admin Pass:             passwd
Verbose:                0
SaveCorrupted:          1
MaxConnections:         45
ScreenLines:            24
Allow Private Messages:         0
Allow Viewing of Files:         0
Una vez configurado el core, salimos guardando la configuración introducida.
> q
Are you sure wanna quit (Y/n)?
y
Y ahora lo que hacemos es volver a lanzar el mismo programa pero indicandole que espere conexiones del cliente gráfico:
$ edonkeyclc -g

Instalar el gui

En el otro PC nos tendremos que bajar el GUI ed2k-gui. Al igual que antes, lo instalamos como root con:
# dpkg -i paquetito_gui.deb
Ahora lo lanzamos mediante el comando "ed2k_gui" o en el menú Aplicaciones -> Internet -> Controlador central eDonkey2000 GTK+. Al iniciar el gui saldrá un ventana "Connect to...", pues bien, elegimos la segunda opción "Connect to a core running on another computer". Ahora hay que rellenar los siguientes datos:
Hostname or IP: 1.2.3.4
Admin Port: 4663
Admin Username: usuario
Admin Password: passwd
Pulsamos aceptar y si todo ha ido bien deberiamos acceder al gui sin ningún problema. Una vez dentro hay que cambiar una opción importante para que el core siga corriendo en la otra máquina aunque cerremos el gui. Esta opción se encuentra en la pestaña "Opciones" -> "GUI1". Hay que desmarcar la opción que pone "apagar el núcleo al salir". Las demás opciones a gusto del cosumidor :-).

Script de inicio

Este es el script que he incluido en /etc/init.d/ para que cuando se encienda la máquina el core se ejecute, yo lo he llamado "core-ed2k":
#!/bin/bash

PROGRAM=edonkeyclc
PROGRAM_DIR=/home/tu_usuario
PROGRAM_LOG=/tmp

case "$1" in
  start)
     cd $PROGRAM_DIR
     su - tu_usuario -c "$PROGRAM -g -l" >> $PROGRAM_LOG/edonkey.log &
     sleep 5
     echo -e "¡¡¡¡¡¡¡ CORE ejecutandose !!!!!!!\n"
  ;;
  stop)
     sync
     kill -9 `pidof $PROGRAM`
     echo -e "¡¡¡¡¡¡¡ Parando el CORE !!!!!!!\n"
     sleep 2
  ;;
  *)
     echo "Uso: /etc/init.d/core-ed2k {start|stop}"
     exit 1
  ;;
esac

exit 0
Este script se copia en /etc/init.d/ y ahora nos hace falta crear los enlaces init correspondientes. Mi equipo se ejcuta en el nivel 2, asi que:
 # update-rc.d core-ed2k start 99 2 . stop 99 0 2 .
Si por alguna razón el core deja de ejecutarse o queremos pararlo hacemos:
 /etc/init.d/core-ed2k {start|stop}
dependiendo de lo que queramos hacer.

Enlaces

Descargar las ISO de los DVD de Debian, con jigdo

— [ edit | raw ] migrated from node/35

Cómo utilizar la herramienta jigdo para descargar las ISO de los CDs y DVDs de Debian.

Configuración manual de una conexión de red en GNU/Linux (con net-tools)

— [ edit | raw ] migrated from node/33
Cómo configurar «a mano», es decir, sin DHCP, los parámetros más importantes de una tarjeta de red en Debian GNU/Linux, Ubuntu o similar.

Hay otras posibilidades (como etherconf) pero la finalidad de esta receta es utilizar los comandos básicos disponibles en los sistemas GNU/Linux, en concreto con ipconfig y route del paquete net-tools.

Adios al spam con spamassassin y sylpheed-claws

— [ edit | raw ] migrated from node/34
Cómo utilizar spamassassin junto con sylpheed-claws para filtrar todo el spam y correo basura que recibamos

Introducción

Seguro que a todos nos pasa que recibimos montones de correos basura, publicidad, spam, archivos infectados y un largo etcétera que nos roban cantidad de tiempo aunque solo sea borrándolos de nuestro gestor de correo... En GNU/Linux existen gran cantidad de herramientas que nos permiten gestionar todo nuestro correo electrónico, como evolution, sylpheed-claws, mozilla, etc... Además de numerosos filtros antiespam tales como pueden ser bogofilter y spamassassin. En mi caso en particular, utilizo spamassassin junto con sylpheed-claws para filtrar y gestionar todo mi correo electrónico y el resultado es bastante bueno. Spamassassin no sólo permite filtrar el correo "basura" distinguiéndolo del que no lo es con gran precisión, sino que además es fácil de configurar, es capaz de aprender de sus propios errores y tiene muchas opciones configurables que le hacen un filtro bastante potente. Aquí se describe su configuración y uso con el gestor de correo Sylpheed-claws.

Qué necesitamos

Lo primero que tendremos que hacer es instalar en nuestra máquina tanto Sylpheed-claws como Spamassassin. En Debian:
~# apt-get -f install spamassassin sylpheed-claws
Tampoco estaría de mas instalarnos los plugins y demás módulos para sylpheed-claws si tenemos pensado utilizarlo de forma regular como nuestro gestor de correo. Para buscar qué módulos y/o plugins hay disponibles:
~# apt-cache search sylpheed-claws

Configuración de SpamAssassin

La configuración realizada aquí se ha hecho en sylpheed-claws. Si utilizas otro tipo de gestor como evolution o mozilla, deberás averiguar antes como crear y configurar reglas de filtrado, ya que es a través de éstas reglas como se configura spamassassin. En nuestro caso, una vez abierto sylpheed-claws nos iremos a Configuración -> Filtrado... Aquí se nos mostrará la ventana para edición de reglas de filtrado. Nosotros deberemos crear tres reglas de filtrado:
  • Una para analizar todo el correo.
  • Otra que nos permita marcar como válido un correo considerado spam por spamassassin.
  • Una última que nos permita marcar un correo como spam en caso de que spamassassin lo pasase por alto.
Creamos la primera regla, que hará que spamassassin revise todo el correo y decida según su criterio cual es spam y cual no. En la línea correspondiente a la condición escribiremos algo como:
test "spamassassin < %F | grep -c \"X-Spam-Flag: YES\""
Spamassassin recibe como entrada nuestro correo y su salida será el mismo correo pero con algunas líneas nuevas en la cabecera. En concreto nos interesa la existencia de la línea "X-Spam-Flag: YES". Ésta línea indicará que el correo ha sido considerado como spam y por tanto deberá ser tratado. Como la salida de spamassassin tiene formato de texto, tan solo hará falta comprobar con el comando grep si existe dicha línea. Para la acción:
move "#mh/Buzon/Spam"
La carpeta Spam dentro de Buzon es donde yo he elegido que guarde todo el correo spam que encuentre. Para el caso de la segunda regla, en la que un correo válido ha sido marcado como spam, la condición será:
colorlabel 6
Si encontramos como spam algún correo que no lo es (nadie nace enseñado, y spamassassin tampoco) deberemos indicar que ese correo es válido. Para ello lo etiquetaremos de color verde y lo filtraremos. Para la acción:
execute "spamassassin -k <%F" move "mh/Buzon/inbox"
Así haremos que el correo vuelva de nuevo a la carpeta de entrada y spamassassin lo marque como válido para de ése modo "aprender" de su error. Por último, la última regla de filtrado, cuya misión es contraria a la anterior. Su condición es:
colorlabel 2
Los correos spam que se le hayan "colado" a spamassassin los marcaremos con color rojo y volveremos a filtrar. La acción entonces será:
execute "spamassassin -r <%F" move "mh/Buzon/Spam"
Con ésto, el correo se marcará como spam y será enviado a la carpeta correspondiente.

Notas importantes sobre la configuración

  • Éstas reglas de filtrado, deberán ser colocadas al principio para que sean las primeras en ser ejecutadas, ya que de lo contrario, el correo no se filtrará de forma adecuada.
  • Cuando se filtra el correo con spamassassin, el proceso puede durar bastante tiempo, especialmente cuando spamassassin lleva bastante tiempo aprendiendo, ya que tendrá que comprobar mas reglas. Por ello no hay que perder la paciencia y pensar que algo va mal si el filtrado se toma varios minutos (a veces incluso media hora) cuando se tiene que filtrar una cantidad bastante elevada de correos electrónicos.

Otras opciones

Spamassassin tiene varias características configurables que lo hacen bastante potente, pero tal vez dos de las características que mas útiles pueden llegar a ser en un momento dado sean la de whitelist y blacklist. Se trata de dos listas, una con direcciones de correo que se consideran como válidas (whitelist) y otra con direcciones de correo desde las cuales todo el correo recibido se tratará como spam (blacklist). Los parámetros para poder añadir y eliminar direcciones de éstas listas son los siguientes:
  • --add-to-whitelist Añade la dirección del remitente del correo a la lista de direcciones válidas. Ningún correo que llegue desde ésta dirección será considerado como spam.
  • --add-to-blacklist Añade la dirección del remitente del correo a la lista de direcciones no válidas. Todos los correos recibidos desde esa dirección serán tratados como spam.
  • --remove-from-whitelist Elimina la dirección del remitente del correo de la lista de direcciones válidas.
  • --add-addr-to-whitelist = addr Igual que la opción --add-to-whitelist, pero ahora la dirección se introduce de forma manual.
  • --add-addr-to-blacklist = addr Igual que la opción --add-to-blacklist, pero ahora la dirección se introduce de forma manual.
  • --remove-addr-from-whitelist = addr Igual que la opción --remove-from-whitelist, pero como antes, la dirección deberemos introducirla de forma manual.

Enlaces

Túneles, canales y puertos con SSH

— [ edit | raw ] migrated from node/32

ssh (entre otras muchas cosas) también sirve para crear túneles entre máquinas o simplemente redireccionar puertos en un misma máquina.

Una curiosidad (huevo de pascua)

— [ edit | raw ]
migrated from node/29
El caso, que el otro día en un forillo descubrí, o mejor dicho,me descubrieron, un nuevo huevo de pascua para la "colección".

Netcat, la navaja suiza de TCP/IP

— [ edit | raw ] migrated from node/28

Netcat es una de las herramientas más potentes y flexibles que existen en el campo de la programación, depuración, análisis y manipulación de redes y servicios TCP/IP. Es un recurso imprescindible tanto para expertos en seguridad de redes como para hackers. Esta receta incluye varios ejemplos de uso de GNU netcat.

Introducción

Aunque netcat puede hacer muchas cosas, su función principal es muy simple:

  1. Crea un socket con el destino indicado si es cliente, o en el puerto indicado, si es servidor
  2. Una vez conectado, envía por el socket todo lo que llegue en su entrada estándar y envía a su salida estándar todo lo que llegue por el socket

Algo tan simple resulta ser extraordinariamente potente y flexible como vas a ver e continuación. Por simplicidad se utilizan conexiones locales aunque, por supuesto, se pueden utilizar entre máquinas diferentes.

Ingredientes

  • netcat
  • bash (o equivalente)
  • utilidades GNU básicas

Sintaxis

nc [-options] hostname port[s] [ports]
nc -l -p port [-options] [hostname] [port]

Parámetros básicos

  • -l: modo ‘listen’, queda a la espera de conexiones entrantes.
  • -p: puerto local
  • -u: modo UDP
  • -e: ejecuta el comando dado después de conectar
  • -c: ejecuta órdenes de shell (hace /bin/sh -c [comando] después de conectar

Un chat para dos

Servidor

$ nc -l -p 2000

Cliente

$ nc localhost 2000

Transferencia de ficheros

La instancia de nc que escucha recibe el fichero. El receptor ejecuta:

$ nc -l -p 2000 > fichero.recibido

Y el emisor:

$ nc localhost 2000 &lt; fichero

Servidor de echo

Ponemos un servidor que ejecuta cat de modo que devolverá todo lo que
se le envíe

$ nc -l -p 2000 -e /bin/cat

Y en otra consola:

$ nc localhost 2000
hola
hola
...

Servidor de daytime

Exactamente lo mismo que el ejemplo anterior pero ejecutando date en lugar de cat.

$ nc -l -p 2000 -e /bin/date

Y en otra consola:

$ nc localhost 2000
lun feb 23 21:26:48 CET 2004

shell remota estilo telnet

Servidor

$ nc -l -p 2000 -e /bin/bash

Cliente

$ nc localhost 2000

Telnet inverso

En esta ocasión es el cliente quien pone el terminal remoto

Servidor

$ nc -l -p 2000

Cliente

$ nc server.example.org 2000 -e /bin/bash

Cliente de IRC

$ *nc irc.freenode.net 6666*
NOTICE AUTH :*** Looking up your hostname...
NOTICE AUTH :*** Found your hostname, welcome back
NOTICE AUTH :*** Checking ident
NOTICE AUTH :*** No identd (auth) response
*NICK nadie*
*USER nadie nadie nadie :nadie*
:kubrick.freenode.net 001 nadie :Welcome to the freenode IRC Network nadie
:kubrick.freenode.net 002 nadie :Your host is kubrick.freenode.net[kubrick.freenode.net/6666], running version hyperion-1.0.2b
[...]

y a partir de ahí puedes introducir cualquier comando de IRC:

  • LIST
  • JOIN #canal
  • PART #canal
  • PRIVMSG #canal :mensaje
  • WHO #canal
  • QUIT

Cliente de correo SMTP

Podemos usar netcat para enviar correo electrónico por medio de un servidor SMTP, utilizando el protocolo directamente:

~$ nc mail.servidor.com
220 mail.servidor.com ESMTP Postfix
HELO yo
250 mail.servidor.com
MAIL FROM:guillermito@microchof.com
250 Ok
RCPT TO:manolo@cocaloca.es
250 Ok
DATA
354 End data with &lt;CR>&lt;LF>.&lt;CR>&lt;LF>
Aviso: su licencia ha caducado. Me deben un pastón.
.
250 Ok: queued as D44314A607
QUIT
221 Bye

HTTP

Es sencillo conseguir un cliente y un servidor HTTP rudimentarios.

Servidor

$ nc -l -p http -c "cat index.html"

Al cual podemos conectar con cualquier navegador HTTP, como por ejemplo firefox.

Cliente

$ echo "GET /" | nc www.google.com 80 > index.html

Streaming de audio

Un sencillo ejemplo para hacer streaming de un fichero .mp3:

Servidor

$ nc -l -p 2000 < fichero.mp3

y para servir todos los .mp3 de un directorio:

$ cat *.mp3 | nc -l -p 2000

Cliente

$ nc server.example.org 2000 | madplay -

Streaming de video

Servidor

$ nc -l -p 2000 < pelicula.avi

Cliente

$ nc server.example.org 2000 | mplayer -

Proxy

Sirva para redirigir una conexión a otro puerto u otra máquina:

$ nc -l -p 2000 -c "nc example.org 22"

El tráfico recibido en el puerto 2000 de esta máquina se redirige a la máquina example.org:22. Permite incluso que la conexión entrante sea UDP pero la redirección sea TCP o viceversa!

Clonar un disco a través de la red

Esto se debe usar con muchísima precaución. ¡Si no estás 100% seguro, no lo hagas! No digas que no te avisé.

Es este ejemplo voy a copiar un pen drive USB que está conectado al servidor a un fichero en el cliente y después lo voy a montar para acceder al contenido.

Servidor

$ dd if=/dev/sda1 | nc -l -p 2000

Cliente

$ nc server.example.org 2000 | dd of=pendrive.dump
$ mount pendrive.dump -r -t vfat -o loop /mnt/usb

Ratón remoto

Es decir, usar el ratón conectado a una máquina para usar el entorno gráfico de otra. El ejemplo está pensado para Xorg.

Servidor

# nc -l -p 2000 < /dev/input/mice

Cliente

Editar el fichero /etc/X11/xorg.conf y modificar la configuración del ratón para que queda así:

Section "InputDevice"
    Driver     "mouse"
    ...
    Option    "Device"    "/tmp/fakemouse"
    ....
EndSection
$ mkfifo /tmp/fakemouse
$ nc server.example.org 2000 > /tmp/fakemouse
# /etc/init.d/gdm restart

Medir el ancho de banda

Servidor

$ nc -l -p 2000 | pv > /dev/null

Cliente

$ nc server.example.org 2000 < /dev/zero

Imprimir un documento en formato PostScript

Funciona en impresoras que soporten el estándar AppSocket/JetDirect, que son la mayoría de las que se conectan por Ethernet.

$ cat fichero.ps | nc -q 1 nombre.o.ip.de.la.impresora 9100

Ver «La Guerra de las Galaxias»

$ nc towel.blinkenlights.nl 23

Otros "netcat"s

Referencias

Grabar CDs y DVDs fácilmente desde consola

— [ edit | raw ] migrated from node/26

Uso básico de mkisofs y cdrecord para copiar y grabar CDs desde consola.